PHP MVC:在控制器和视图之间共享模型

时间:2017-05-08 19:23:45

标签: php design-patterns model-view-controller model service-layer

我正在开发我的PHP(H)MVC项目,我在其中将视图与控制器分开 - 如答案How should a model be structured in MVC?。他们的关系是1:1,所以他们有相同的“行动”。因此,在bootstrap.php中,在我实例化它们之后,我调用:

// ... Controller and view are already instantiated.
call_user_func_array(array($controller, $actionName), $actionParameters);
call_user_func_array(array($view, $actionName), $actionParameters);

假设一个控制器和一个视图,每个都是一个模型(域对象)作为构造函数参数。 使用Auryn依赖注入容器,我尝试在控制器和视图之间共享模型的相同实例,而不事先实例化它。例如。在控制器和视图实例化之前发生在bootstrap.php。

在他的回答中,tereško描述了模型/服务工厂的使用。但作为一个“注意”,他说:

  

...一个更好的实现将有DI容器(如   Auryn)创建控制器和视图,只需要   服务,而不是工厂。

我的问题是:我是否可以在没有使用依赖注入容器的模型工厂的情况下实现此功能? 我有点陷入这个任务,我真的不知道这是否有可能。 谢谢。

1 个答案:

答案 0 :(得分:1)

是的,你可以。

但它有点繁琐。您基本上需要将服务设置为“共享”:

<?php
$injector->define('MailerService', [
    ':server' => 'fak.it',
    ':port' => '443',
]);
$injector->share('MailerService');

$controller = $injector->make('FooBarController');

这假设您的控制器定义如下:

<?php
class FooBarController 
{
    public function __construct(MailerService $service) 
    {
        // ...
    }
}

在这方面,Symfony的独立DI component更容易使用,因为你可以将这种配置放在json或yaml文件中。

P.S。你可能应该抽象你的用户输入,因为某种Request对象蚂蚁在每个方法调用中都会在你的控制器中传递它。

有点像这样:

<?php
$request = new Request( .. something here maybe .. );
$controller->action($request);

让代码看起来更漂亮:))