PHP MVC。我做得对吗?
我创建了一个简单的ServiceFactory类,它运行其他服务类、存储和获取实例。视图对象和控制器对象之间共享相同的ServiceFactory对象 控制器更改服务的状态: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($
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
extendsController
时,你是说用户是一个控制器。是这样吗?不可以。也许您可以重命名为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());
}
}