我有一个看起来像这样的基本控制器:
<?php
namespace framework;
class BaseController
{
public $model;
public $view;
function __construct()
{
$this->model = new ModelFactory();
$this->view = new View($this->model->data);
}
}
永远不会直接调用此控制器,只能通过extends
:
<?php
namespace framework\controllers;
use framework\BaseController,
framework\Router;
class IndexController extends BaseController
{
}
我想做的事情,并希望这是有意义的,是在$this->model
和$this->view
之间插入数据或额外的功能到基本控制器中,以便它能够在<?php
namespace framework;
class BaseController
{
public $model;
public $view;
function __construct()
{
$this->model = new ModelFactory();
// get user data
$this->model->data['user_roles'] = array();
if ($user = $this->isLoggedIn()) {
$this->model->data['user_roles'] = $user->roles;
}
$this->view = new View($this->model->data);
}
// check if a user is logged in and return a user object or false
public function isLoggedIn() {}
}
和// anonymous function in my bootstrap or global configuration file
$user_roles = function () {};
<?php
namespace framework;
class BaseController
{
public $model;
public $view;
function __construct($name, $value) // not sure how these are passed in
{
$this->model = new ModelFactory();
// get extra data
$this->model->data[$name] = $value($this->model);
$this->view = new View($this->model->data);
}
}
之间插入数据或额外的功能。是匿名的或解耦的,而不是硬编码的。作为示例,应用程序可能需要也可能不需要用户数据。以下是我可以硬编码的方法,尽管这正是我试图避免的:
{{1}}
以下是我的大脑认为我想要完成的伪代码:
{{1}}
不确定我是否需要特定的模式,或者我是否朝着正确的方向前进。我怎样才能在这些方面取得成就?我接受任何推荐的替代方法。
答案 0 :(得分:0)
您正在寻找的是PHP traits。
特征是一种提取/隔离行为的方法,然后您可以注入&#34;在任何一个班级。
宣布特质时:
trait ControllerQueryable
{
public function magicQuery()
{ // $this is the class that's using this trait.
$this->orm->fetch(str_replace(get_class($this), 'Controller', ''), $this->params['id']);
}
}
它适用于任何课程use
:
class BlogController extends BaseController
{
use ControllerQueryable;
public function showAction()
{
$model = $this->magicQuery();
// yada yada yada
}
}
与extends
相反,您可以use
尽可能多的特征。