我從頭開始構建MVC PHP框架,並且我在模型層有一些問題。PHP MVC:我應該在哪裏放置模型搜索邏輯?
我所現在是一個比較基本的MVC實現,這裏是我的入口點(的index.php):
//get the URI
$uri = isset($_SERVER['REQUEST_URI'])
? $_SERVER['REQUEST_URI']
: '/';
//Initializes the request abstraction from URI
$request = new request($uri);
//getting the view class from the request
$viewFactory = new viewFactory();
$view = $viewFactory->getView($request);
$view->setDefaultTemplateLocation(__DIR__ . '/templates');
//getting the data mapper from the connection string
$connectionString = "mysql:host=localhost;dbname=test;username=root;";
$dataMapperFactory = new dataMapperFactory($connectionString);
$dataMapper = $dataMapperFactory->getDataMapper();
$modelFactory = new modelFactory($dataMapper);
//getting controller and feeding it the view, the request and the modelFactory.
$controllerFactory = new controllerFactory();
$controller = $controllerFactory->getController($request,$view,$modelFactory);
//Execute the necessary command on the controller
$command = $request->getCommand();
$controller->{$command}($request);
//Produces the response
echo $view->render();
我覺得這是自我解釋,但如果你沒有得到的東西,或者如果您認爲我犯了一個可怕的錯誤,請隨時告訴我。
無論如何,modelFactory負責返回控制器可能需要的任何模型。我現在需要實現「模型研究」邏輯,在我看來有兩種方法可以實現它:
第一種方法:實現一個包含所有研究邏輯的modelSearch類,然後讓我的模型繼承它(如在Yii2中) 。我不喜歡這種方法,因爲它會讓我實例化一些模型,並讓它返回自己的其他實例。因此,我有相同的模型實例化一次,研究和一次(或更多)與所有數據,並沒有使用搜索方法。 所以我的控制器看起來就像是:
class site extends controller{
public function __construct($view, $modelFactory){
parent::__construct($view, $modelFactory);
/* code here */
}
public function index()
{
$searchModel = $this->modelFactory->buildModel("exemple");
$model = $searchModel->get(["id"=>3])->one();
$this->render('index',['model' => $model]);
}
}
方式二:實現包含所有的研究邏輯,然後在輸入點,而不是實例化modelFactory一個modelSearch類,我可以istantiate的modelSearch,並已經將它的DataMapper的。然後我給modelSearch到控制器,控制器會通過詢問modelSearch(這將使用modelFactory實例模型和返回他們)得到他想要的任何模型,這樣的:
class site extends controller{
public function __construct($view, $searchModel){
parent::__construct($view, $searchModel);
}
public function index()
{
$model = $this->searchModel->get("exemple",["id"=>3])->one();
$this->render('index',['model' => $model]);
}
}
這種方式似乎更對我來說是正確的,但有一個缺點,就是不得不調用modelSearch類來返回任何模型,甚至是空模型。
想法?
TL; DR:modelSearch:我是使用它作爲獨立工具來獲取模型,還是使模型繼承它?
是的沒有。這不是你設置MVC的鋤頭。 TBH,我甚至不確定什麼「搜索邏輯」是基於你的例子。搜索的抽象應該放在負責任的服務實例中,然後由負責的服務實例進行內部處理,使用各種持久性抽象來抽象結果集合和檢索集合。 –