Как создать общий маршрут модуля/контроллера/действия в Zend Framework 2?

Я хотел бы создать общий маршрут модуля/контроллера/действия в Zend Framework 2 для использования с архитектурой ZF2 MVC.

В ZF1 маршрут по умолчанию был определен как /[:module][/:controller][/:action], где модуль по умолчанию будет default, контроллер по умолчанию будет index, а действие - index.

Теперь ZF2 изменил способ назначения модулей, от простых групп контроллеров и представлений до настоящих автономных приложений с явным сопоставлением имени контроллера с классом контроллера.

Поскольку все имена контроллеров должны быть уникальными для всех модулей, я думал назвать их как modulename-controllername, но я хотел бы, чтобы URL-адрес выглядел как /modulename/controllername без необходимости создавать определенные маршруты для каждого модуля, используя что-то вроде описанного старого маршрута по умолчанию для ZF1. выше.


person Matteo Tassinari    schedule 07.06.2012    source источник


Ответы (3)


Да, это очень возможно, но вам придется немного поработать. Используйте следующую конфигурацию:

        '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 для создания объекта Routemap, который может использовать MVC. Это не сложно, посмотрите на другие сопоставители маршрутов, которые уже есть в фреймворке, и вы поймете суть.

person superdweebie    schedule 08.06.2012
comment
@IvoJansch: извините, но в настоящее время я больше не работаю над этим проектом из-за нехватки свободного времени, чтобы тратить на него... - person Matteo Tassinari; 25.07.2013

Если вы используете Zend Skeleton Application, вы уже настроили этот контроллер по умолчанию.

См. здесь https://github.com/zendframework/ZendSkeletonApplication/blob/master/module/Application/config/module.config.php

person chrvadala    schedule 08.06.2012
comment
Я знаю, что контроллер по умолчанию уже настроен, то, что я пытаюсь сделать, отличается, я хочу настроить маршрут, чтобы, например, контроллер foo в панели модулей соответствовал маршруту /bar/foo, будучи зарегистрирован в списке контроллеров как bar-foo. Также я бы хотел, чтобы маршрут, используемый для этого сопоставления, был общим, чтобы мне не нужно было определять его для каждого модуля. - person Matteo Tassinari; 09.06.2012

Чтобы иметь общую/стандартную систему маршрутизации для модуля zf2, это мое решение только для одного контроллера «модуль\контроллер\индекс» (контроллер по умолчанию):

'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');
}  

и все равно спасибо :)

person Arfaoui Marouene    schedule 26.02.2014