goo*_*ing 11 php model-view-controller
我目前的实施:
class SomeController extends AppController
{
function someaction()
{
$d['text'] = "ahoy!";
$this->render("someactionView", $d);
}
}
Run Code Online (Sandbox Code Playgroud)
并在AppController
:
function render($file, $data = "")
{
require "views/" . $file . ".php";
}
Run Code Online (Sandbox Code Playgroud)
并且$data
将在视图文件中提供.这是正确的实施吗?这种实现有什么谬误吗?
Yan*_*ang 11
并且
$data
将在视图文件中提供.这是正确的实施吗?这种实现有什么谬误吗?
基本上你像大多数框架一样实现它.这有几个问题:
require "views/" . $file . ".php";
在render()
方法中做- 你再次紧紧地结合它.如果您更改视图的位置怎么办?然后你必须稍微重写你的方法.这种方法仅仅会杀死重用能力.刷新您的基本知识:
仅用于单一目的.它改变模型状态-也就是说,它应该采取的是来自一个输入$_POST
,$_GET
,$_FILES
,$_COOKIE
.在控制器中,只应进行变量赋值,仅此而已.
class Controller
{
public function indexAction()
{
$this->view->setVar('age', $this->request->getPostParam('age'));
$this->view->setVar('user', $this->request->getPostParam('user'));
//...
}
}
Run Code Online (Sandbox Code Playgroud)
视图可以直接访问模型.为了使make视图更易于重用和维护,你最好将所需的东西作为函数参数传递(或通过setter)
class View
{
public function render($templateFile, array $vars = array())
{
ob_start();
extract($vars);
require($templateFile);
return ob_get_clean();
}
}
Run Code Online (Sandbox Code Playgroud)
首先 - 视图应该在MVC-triad之外实例化.由于控制器写入视图或模型 - 您将通过控制器传递变量.
$model = new Model();
$view = new View($model);
$controller = new Controller($view);
// This will assign variables to view
$controller->indexAction();
echo $view->render();
Run Code Online (Sandbox Code Playgroud)
注意:在现实世界中,模型不是类,而是抽象层.我称它为
Model
演示目的.
IMO 该render()
方法属于视图而不属于控制器。代码应该如下所示:
控制器:
class SomeController extends AppController
{
function someaction()
{
$d['text'] = "ahoy!";
$view = new SomeActionView();
$view->assign('data', $d);
echo $view->render();
}
}
Run Code Online (Sandbox Code Playgroud)
查看基类:
class View
{
protected $data;
function render($template) {
ob_start();
// you can access $this->data in template
require "views/" . $template . ".php";
$str = ob_get_contents();
ob_end_clean();
return $str;
}
function assign($key, $val) {
$this->data[$key] = $val;
}
}
Run Code Online (Sandbox Code Playgroud)
扩展View类
class SomeActionView extends View
{
public function render($template = 'someActionTemplate') {
return parent::render($template);
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
17657 次 |
最近记录: |