Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP MVC。我做得对吗?_Php_Model View Controller - Fatal编程技术网

PHP MVC。我做得对吗?

PHP MVC。我做得对吗?,php,model-view-controller,Php,Model View Controller,我创建了一个简单的ServiceFactory类,它运行其他服务类、存储和获取实例。视图对象和控制器对象之间共享相同的ServiceFactory对象 控制器更改服务的状态: class User extends Controller { public function index($user) { $userService = $this->service->run('User'); $userService->index($

我创建了一个简单的ServiceFactory类,它运行其他服务类、存储和获取实例。视图对象和控制器对象之间共享相同的ServiceFactory对象

控制器更改服务的状态:

class User extends Controller
{
    public function index($user)
    {
        $userService = $this->service->run('User');

        $userService->index($user);
    }
}
视图从服务获取数据并决定使用哪个模板:

class User extends View
{
    public function index()
    {
        $userService = $this->service->get('User');

        $this->data = $userService->data;

        $this->template = 'user/index'; // render
    }
}
我做得对吗


tereško在回答时说:“控制器负责更改视图和模型的状态。”我的控制器与视图无关。我想看一些控制器和视图应该如何工作的示例(Model2 MVC)。

在客户机-服务器体系结构中,实现MVC的“原始”思想存在问题。理论上,控制器应该修改模型。比模型更受欢迎,例如,具有更新视图的事件

例如: 我通过单击某个按钮来更改用户的状态,例如名字。这将导致控制器中更新用户模型(模型层中的域模型)的操作。现在,模型应该“imform”视图以更新用户的名字。您可以使用“commet”-architecture()将模型链接到视图。因此,用户模型的更新将导致视图的更新

我做得对吗

有点

让我们从扩展开始。当你使用
extends
时,你意味着是一个关系,所以当你说
User
extends
Controller
时,你是说
用户
是一个
控制器。是这样吗?不可以。也许您可以重命名为
UserController
,这在上下文中更有意义。

这被称为a,它被称为反模式。为什么它是反模式?因为在面向对象编程中,每个对象的公共方法都是其使用的API,您应该能够完全从其构造函数和方法签名中看到对象的需求

对于您的代码,开发人员必须通读整个过程才能看到“哦,这里是我使用另一个对象的地方”和更进一步的“这里是我使用另一个对象的地方”

您的代码应如下所示:

public function index(UserService $userService)
{
    $user = $userService->getData();
}
通过代码更改,开发人员可以看到您的对象需要什么样的外部对象才能正常工作——现在这是可测试的(并不是说您要测试不包含逻辑的控制器——它们只是已测试代码的“粘合剂”)

您应该将组件和视图注入控制器:

class UserController extends Controller
{
    public function index(UserService $userService, View $view)
    {
        /** This or something similar **/
        return $view->render($userService->getData());
    }
}
有些人注入一个
视图
,有些人注入一个
模板引擎
像树枝一样,并用数据在上面调用
渲染
。这取决于您,您可以根据您当前的场景深入研究细节

如果您想知道如何将用户服务注入到索引操作中,那么这就是依赖项注入器的工作,它使用反射来读取对象构造函数或方法签名,以确定在将它们自动注入控制器之前要创建什么

Laravel窃取了这个想法,现在已经为他们的控制器实现了这个想法,希望Symfony很快会跟进


结束语:不要试图严格遵守“MVC”——对于请求->响应->死循环的PHP来说,这在经典意义上是不可能的。相反,要关注与之相关的关注点的分离,使您的代码可维护、可测试且易于阅读。

它有效吗?它做的和你执行的一样吗?你最好把它贴在不需要的控制器上,它总是影响你的视图。有些行动/方法并不影响你的观点。但“控制员有责任……”是真的。MVVM可以直接做到这一点,但VM(ViewModel)只是控制器的替代品。您有两个类,都名为
User
?没有“用户模型”这样的东西。mvc中的模型是一个层。您可能指的是用户实体?如果我们要互相帮助,我们需要使用相同的(正确的)术语:-)当然是Jimbo,但实体是耦合到数据库的,而不是通用域模型。在我的解释中,有一个类来自模型层,一个域模型,它可以使用一个实体来crud DB或其他策略。:-@jimbo,顺便说一句,您的答案并没有回答这个问题;-)一个实体根本不耦合到数据库,除非您使用的是活动记录模式——在这种情况下,您应该认真考虑使用数据映射器。实体只是一个哑对象。检查实体/存储库,将任何实体与它们的持久性耦合是绝对不可能的。好的,所以您理解“实体”就像我理解的“模型”一样。将它与持久性相结合是不可能的。顺便说一句,我使用数据映射器;-)
class UserController extends Controller
{
    public function index(UserService $userService, View $view)
    {
        /** This or something similar **/
        return $view->render($userService->getData());
    }
}