我创建了一个带有Controller的模块 . 我的模块名为'App\Module\Foo',控制器名为'App\Controller\Foo' . 我已经使用 Zend\Mvc\Application::init(require 'config/application.config.php')->run();
将Zend配置为 application.config.php
. (我已经设置了一个自定义启动器,非常类似于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
数组键中,还是可以用我认为适合该路由的任何名称替换键? (只要它是唯一的)如果这是真的,这是否意味着我可以拥有一个包含多条路线的大模块?
另外,它如何知道在Controller上调用哪种方法?在Zend引用中似乎没有代理接受一些参数(如action)并将其发送到控制器内的正确方法 . 似乎ZF2通过魔法知道要调用什么方法 .
困扰我的另一件事是框架如何知道View的位置?官方参考说它会寻找 {controller name}/{action name}
但它会在哪里看,如果我没有动作变量怎么办?
当我认为Model基本上只是一个可以使用的数据结构(如User类或Permissions类)时,我是对的,而Form是一个处理通过HTML表单发送的实际POST数据的类吗?
1 回答
您在路由配置中分配的控制器完全取决于您 . 但请记住,实际上你只是指定一个
key
. 所以'controller' => 'ctrl-foo'
也可以是有效的,只要有一个控制器可调用'ctrl-foo' => 'MyNamespace\Controller\FooController
分配 .您在键
constraints
下分配了控制器 - 这是错误的 - 它需要在defaults
之下 . 然后数组变为'defaults => [ 'controller' => 'foo', 'action' => 'bar' ]
. 这会将您的路线指向由钥匙foo
分配给所述控制器的barAction()
的控制器 . 另一方面,constraint
就像是即时验证 . 例如,您为路由分配了ID参数'route' => '/:id'
,那么您可以通过'constraints' => [ 'id' => '\d+' ]
告诉路由器只允许数字值 . 请注意,数组语法仅为PHP 5.4你总是有"action variable" . ViewManager完全通过配置键
view_manager
进行配置 . 视图将在template_path_stack中查找正如您所提到的,模型可以只是一个POPO . 但是模型也可以更多 . 这是MVC理解的一部分,我在此不再赘述 .