我有一个自定义MVC PHP框架,它有一个路由器类,它调用一个控制器,它使用一个模型,然后控制器提供视图等等。
我的问题是我无法从技术上弄清楚如何允许变量在控制器和视图之间传递,从语义上来说。我可以做一个快速而肮脏的修复,但我想要的是控制器:
class IndexController extends Controller{
var $name = "John"; // instance variable
}
有了这个观点:
<p> <?=$name?> </p>
我的问题是:
$data['view']['name'] = "John";
这样的klutzy事情,或者默认情况下我必须为我创建的任何新控制器编写十行代码,我该如何做到这一点。我想这样做,所以它尽可能干。感谢。
我不确定我理解,到目前为止,我有这样的基本控制器:
<?php
class Controller{
public function __get($key){
if(isset($this->$$key)) return $this->$$key;
}
}
?>
我的基本视图类如下所示:
<?php
class View{
public $controller;
public function render(){
$this->controller = $this;
}
?>
我从路由器初始化如下:
<?php
$controller = new IndexController();
$view = new IndexView();
$view->render();
?>
然而,这不起作用,我知道我做错了。
答案 0 :(得分:3)
为什么不通过实例化视图的控制器并使用__get魔术方法?
像这样: public function __get($key){
if(isset($this->$key)) return $this->$key;
}
这是一个工作示例View.php:
class View{
protected $_controller;
public function __construct(Controller $controller){
$this->_controller=$controller;
}
public function render(){
echo '<h1>Hello '.$this->_controller->name.'</h1>';
}
}
Controller.php这样
class Controller{
protected $name='fabio';
protected $_myView;
public function __get($key){
if(isset($this->$key)) return $this->$key;
}
public function __construct(){
$this->_myView=new View($this);
}
public function indexAction(){
$this->_myView->render();
}
}
路由器:
$c=new Controller();
$c->indexAction();
答案 1 :(得分:2)
控制器不应负责渲染输出。这是view
实例应该做的事情。渲染应该在控制器外部进行。
视图应从model layer请求数据。然后,根据收到的信息,选择正确的template,分配数据并渲染此模板(或在某些情况下 - 模板组)。
此外,路由器不应初始化控制器和视图。控制器应仅负责处理请求。