Zend Framework 2 中的模型、视图、控制器和模块之间的关系是什么?


What are the relations between Model, View, Controller and Module in Zend Framework 2?

>我创建了一个带有控制器的模块。我的模块称为"App''Module''Foo",控制器称为"App''Controller''Foo"。我已经通过使用Zend'Mvc'Application::init(require 'config/application.config.php')->run();配置了Zend通过application.config.php。(我已经设置了一个自定义启动器,与ZF2骨架启动器非常相似。

'router' => array(
    'routes' => array(
        'Foo'Module'Index' => array(
            'type' => 'segment',
            'options' => array(
                'route' => '[/]',
                'constraints' => array(
                    'controller' => 'Foo'Controller'Index'
                )
            )
        )
    )
)

据我了解,此配置会将所有对 Web 根目录的请求重定向到Foo'Controller'Index控制器。这真的必须在Foo'Module'Index数组密钥内,还是我可以用我认为适合该路由的任何名称替换密钥?(只要它是独一无二的(如果这是真的,这是否意味着我可以拥有 1 个具有多个路由的大模块?

另外,它如何知道在该控制器上调用什么方法?在 Zend 引用中,似乎没有一个代理可以接受一些参数(如动作(并将其发送到控制器中的正确方法。ZF2 似乎通过魔法知道该调用什么方法。

困扰我的另一件事是框架如何知道视图的位置?官方参考说它会寻找{controller name}/{action name}但它会在哪里寻找,如果我没有操作变量怎么办?

当我认为模型基本上只是您可以使用的数据结构(如用户类或权限类(并且表单是处理通过HTML表单发送的实际POST数据的类时,我是否正确?

  1. 您在路由配置中分配的控制器完全由您决定。但请记住,实际上您只是在分配一个key。因此,只要存在可调用'ctrl-foo' => 'MyNamespace'Controller'FooController分配的控制器,'controller' => 'ctrl-foo'也可能有效。

  2. 您在键constraints下分配了控制器 - 这是错误的 - 它需要在defaults下。然后数组变为'defaults => [ 'controller' => 'foo', 'action' => 'bar' ] 。这会将您的路由定向到由密钥foo分配给所述控制器barAction()的控制器。另一方面,constraint就像是即时验证。例如,您使用 ID 参数分配路由'route' => '/:id'然后您可以告诉路由器仅允许通过 'constraints' => [ 'id' => ''d+' ] 的数值。请注意,数组语法仅为 PHP 5.4+

  3. 你总是有一个"动作变量"。视图管理器完全通过该配置键view_manager进行配置。视图将在template_path_stack中查找

  4. 正如您提到的,模型可以只是一个 POPO。但模型也可以更多。不过,这是MVC理解的一部分,我不会在这里详细介绍。