Zend Framework 2中模块内的基于约定的自动路由 - 可能吗?

时间:2013-05-21 18:18:32

标签: zend-framework zend-framework2 zend-framework-mvc zend-framework-modules zend-framework-routing

我正在尝试理解使我的路由在Zend Framework 2中运行所需的所有配置,我不禁想知道我是否使这个更复杂而不必要。

我正在开发一个简单的应用程序,它遵循一个非常简单的约定:

/:模块/:控制器/:动作

我已经创建并连接了我的模块,“svc”(“服务”的缩写)。然后我创建了第二个控制器,“ClientsController”,我无法通过我的请求将路由传递给例如/ svc / clients / list到ClientsController :: listAction()。

当我涉及数百行配置时,在深度嵌套的数组中,我在想 - 没有办法将我的URL默认映射到/:module /:controller /:行动?

感谢您的帮助。我要离开Zend Framework 2 Quick Start,它引导我创建一个新模块,然后向该模块添加一个控制器。但是当我尝试将第二个控制器添加到该模块时,我正在绊倒路由。

更新:我第一次没有抓到这个,但显然这应该是Zend Framework Skeleton应用程序的一个功能。从快速入门指南:

  

ZendSkeletonApplication随附“默认路由”   让你做这个动作。这条路线基本上是期待   “/ {module} / {controller} / {action}”,允许您指定:   “/ Zend的用户/你好/世界”

这正是我想要的!但我无法让它发挥作用。

它列出了一个不完整的module.config.php,底部有关于将“其他配置”置于此处的注释。我试图找出“其他配置”是什么,并结束了这个:

return array(
    'svc' => array(
        'type'    => 'Literal',
        'options' => array(
            'route'    => '/svc',
            'defaults' => array(
                'controller'    => 'svc\Controller\Index',
                'action'        => 'index',
            ),
        ),
        'may_terminate' => true,
        'child_routes' => array(
            'default' => array(
                'type'    => 'Segment',
                'options' => array(
                    'route'    => '/[:controller[/:action]]',
                    'constraints' => array(
                        'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'action'     => '[a-zA-Z][a-zA-Z0-9_-]*',
                    ),
                    'defaults' => array(
                    ),
                ),
            ),
        ),
    ),
    'controllers' => array(
        'invokables' => array(
            'svc\Controller\Clients' => 'svc\Controller\ClientsController',
        ),
    ),

    'view_manager' => array(
        'template_path_stack' => array(
            'album' => __DIR__ . '/../view',
        ),
    ),
);

JFYI,这是我的控制器的样子。

namespace svc\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

class ClientsController extends AbstractActionController {

    public function indexAction() {
        return new ViewModel();
    }

    public function anotherAction(){

        return new ViewModel();
    }
}

我的路线不起作用。当我试图拉起我的任何路线时,我得到“找不到路线”。

1 个答案:

答案 0 :(得分:0)

  

它列出了一个不完整的module.config.php,底部有关于将“其他配置”置于此处的注释。我试图找出“其他配置”是什么,并结束了这个:

如果你的module.config.php看起来真的那么它就行不通了,routesrouter键中定义的一系列路由,你的配置不包含这样的规范,请尝试替换它与此

return array(
    // routes
    'router' => array(
        'routes' => array(
            'svc' => array(
                'type'    => 'Literal',
                'options' => array(
                    'route'    => '/svc',
                    'defaults' => array(
                        'controller'    => 'svc\Controller\Index',
                        'action'        => 'index',
                    ),
                ),
                'may_terminate' => true,
                'child_routes' => array(
                    'default' => array(
                        'type'    => 'Segment',
                        'options' => array(
                            'route'    => '/[:controller[/:action]]',
                            'constraints' => array(
                                'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                                'action'     => '[a-zA-Z][a-zA-Z0-9_-]*',
                            ),
                            'defaults' => array(
                                 // add the default namespace for :controllers in this route
                                 '__NAMESPACE__' => 'svc\Controller',
                            ),
                        ),
                    ),
                ),
            ),
        ),
    ),    
    'controllers' => array(
        'invokables' => array(
            'svc\Controller\Clients' => 'svc\Controller\ClientsController',
        ),
    ),

    'view_manager' => array(
        'template_path_stack' => array(
            'album' => __DIR__ . '/../view',
        ),
    ),
);