我从头开始构建MVC PHP框架,我对模型层有一些问题。
我现在拥有的是一个相对基本的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]);
}
}
第二种方式:实现包含所有研究逻辑的modelSearch类,然后在入口点,而不是实例化modelFactory,我可以实现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:我是否将它作为独立的工具来获取模型,还是让模型继承它?
答案 0 :(得分:-1)
首先将任何MVC模式的PHP框架读作CI,CakePHP和YII,然后您将看到模型(它如何与数据库一起工作)。你可以创建自我模型搜索逻辑,你可以看到YII框架在模型中的最佳搜索逻辑和控制器的可用性。