<?php
$model = $_GET['model'];
$view = $_GET['view'];
$controller = $_GET['controller'];
$action = $_GET['action'];
if (!(empty($model) || empty($view) || empty($controller) || empty($action))) {
$m = new $model();
$c = new $controller($m, $action);
$v = new $view($m);
echo $v->output();
}
让我们说在阅读本文后我们已经编写了这个设计模式的一个小实现,我们有以下代码:
<?php
class Index extends Controller
{
public function __construct(IndexModel $model, $action)
{
$this->model = $model;
}
public function someAction($id)
{
$this->model->getData($id);
}
}
class Index extends View
{
public function __construct(IndexModel $model, $action)
{
$this->model = $model;
}
public function someAction()
{
$this->model->getData();
}
}
class Index extends Model
{
public function __construct()
{
//Some Code Here
}
public function someAction()
{
// Inserting Data into database.
}
}
正如您所看到的,我们在控制器和视图中调用相同的方法来从数据库中获取数据。但是,如果我知道正确的视图应该照顾控制器的工作,所以$ id不适合在视图中再次解析它或类似的东西。然后如何解决这个问题?
答案 0 :(得分:4)
empty
(请参阅here),同样不应该将所有部分组合在一起。MVC应该像这样接近:
我通常会像这样构建这些部分:
粗略的伪代码:
$r = new Router;
$r->route($_GET, $_POST, $_SERVER); // or something like that
这会发送到:
class FooController {
public function __construct(ServiceLocator $services) { ... }
public function bar(Request $request) {
$request->assertIsPost();
$this->services->locate('Baz')->froogleTheWibbles($request->getPostParams());
(new BarView($this->services))->displayWibbles($request);
}
}
class BarView {
public function __construct(ServiceLocator $services) { ... }
public function displayWibbles(Request $request) {
switch ($request->accepts()) {
case 'html' :
$this->loadTemplate(...);
...
case 'json' :
echo json_encode($this->services->locate('Baz')->getWibbles());
}
}
}
模型可以做任何需要做的事情......
class Baz {
public function froogleTheWibbles(array $data) {
foreach ($data as $wibbleData) {
$wibble = new Wibble($wibbleData);
$this->wibbleStore->save($wibble);
}
...
}
}
对于MVC没有“一个答案”,重要的是该模型包含您的应用程序“做”的所有内容,与输入和输出无关,视图可以根据请求尽可能独立地生成正确的输出,控制器是只是处理输入条件的一点胶水。有各种方法可以实现这一点。重要的设计原则应该是视图和控制器可以互换以适应不同的条件(网页,JSON API,XML API,SOAP API,CLI调用,ZeroMQ节点等),但“模型”不是。< / p>