2

我想在 Zend Framework 2 中创建一个通用模块/控制器/动作路由以用于 ZF2 MVC 架构。

在 ZF1 中,默认路由定义为/[:module][/:controller][/:action]模块默认为default,控制器默认为index,动作默认为index

现在,ZF2 改变了模块的预期方式,从简单的控制器和视图组到真正的独立应用程序,将控制器名称显式映射到控制器类。

由于所有控制器名称在所有模块中都必须是唯一的,因此我想将它们命名为,modulename-controllername但我希望 URL 看起来像这样/modulename/controllername,而不需要为每个模块创建特定的路由,使用类似于上述 ZF1 的旧默认路由。

4

3 回答 3

8

是的,这是很有可能的,但你必须做一些工作。使用以下配置:

        'default' => array(
            'type'    => 'My\Route\Matcher',
            'options' => array(
                'route'    => '/[:module][/:controller[/:action]]',
                'constraints' => array(
                    'module' => '[a-zA-Z][a-zA-Z0-9_-]*',
                    'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                    'action'     => '[a-zA-Z][a-zA-Z0-9_-]*',
                ),
                'defaults' => array(
                    'module'     => 'default',
                    'controller' => 'index',
                    'action'     => 'index',
                ),
            ),
        ),

然后你必须编写自己的My\Route\Matcher来创建 MVC 可以使用的 Routemap 对象。这并不难,看看框架中已经存在的其他路由匹配器,你就会明白了。

于 2012-06-08T21:08:45.723 回答
1

如果您使用 Zend Skeleton Application,您已经配置了这个默认控制器。

见这里https://github.com/zendframework/ZendSkeletonApplication/blob/master/module/Application/config/module.config.php

于 2012-06-08T11:55:28.503 回答
0

要为 zf2 模块提供通用/标准路由系统,这是我仅针对一个控制器“module\controller\index”(默认控制器)的解决方案:

'router' => array(
    'routes' => array(              
        'default' => array(
            'type'    => 'Literal',
            'options' => array(
                'route'    => '/', // <======== this is take the first step to our module "profil"
                'defaults' => array(
                    'module'     => 'profil',
                    'controller' => 'profil\Controller\Index',
                    'action'     => 'index',
                ),
            ),
        ),              
        'profil' => array(
            'type'    => 'Segment',
            'options' => array(
                'route'    => '/[profil][/:action]', // <======== this is take the next steps of the module "profil"
                'constraints' => array(
                    'module' => '[a-zA-Z][a-zA-Z0-9_-]*',
                    'action'     => '[a-zA-Z][a-zA-Z0-9_-]*',
                ),
                'defaults' => array( // force the default one
                    'module'     => 'profil',
                    'controller' => 'profil\Controller\Index',
                    'action'     => 'index',
                ),
            ),
        ),
    ),
),

然后在我们的控制器“profil\Controller\Index”中,我们有三个动作“index”“home”“signout”:

public function indexAction()
{
        if ($this->identity()) {
            return $this->redirect()->toRoute('profil',array('action'=>'home'));
        } else {
            // ......
                    $authResult = $authService->authenticate();
                    if ($authResult->isValid()) {
                            //......
                                                    return $this->redirect()->toRoute('profil',array('action'=>'home'));
                    } else {
                        // ......
                    }
                } else {
                    $messages = $form->getMessages();
                }
            }               
            return new ViewModel();
        }
}

public function homeAction()
{
    if (!$this->identity()) {
        return $this->redirect()->toRoute('profil',array('action'=>'signout'));
    }
}

public function signoutAction()
{
    if ($this->identity()) {
        $authService = $this->getServiceLocator()->get('Zend\Authentication\AuthenticationService');
        $authService->clearIdentity();
    }
    $this->redirect()->toRoute('profil');
}  

无论如何谢谢你:)

于 2014-02-26T10:42:34.323 回答