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

时间:2013-09-28 16:36:44

标签: php zend-framework2 zend-framework-mvc

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

'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数组键中,还是可以用我认为适合该路由的任何名称替换键? (只要它是唯一的)如果这是真的,这是否意味着我可以拥有一个包含多条路线的大模块?

此外,它如何知道在该控制器上调用哪种方法?在Zend引用中,似乎没有代理接受一些参数(如action)并将其发送到控制器内的正确方法。似乎ZF2通过魔法知道要调用什么方法。

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

当我认为Model基本上只是一个可以使用的数据结构(如User类或Permissions类)时,我也是对的,而Form是一个处理通过HTML表单发送的实际POST数据的类?

1 个答案:

答案 0 :(得分:0)

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

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

  3. 你总是有一个“动作变量”。 ViewManager完全通过配置键view_manager进行配置。视图将在template_path_stack

  4. 中查找
  5. 正如您所提到的,模型可以只是一个POPO。但是模型也可以更多。这是MVC理解的一部分,我不打算详细介绍。