2012-06-07 1 views
2

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

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

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

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

ответ

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 можно использовать. Это не сложно, взгляните на других маркеров маршрута уже в рамках, и вы получите эту идею.

+0

Я попробую это и посмотрю, смогу ли я заставить его работать правильно. –

+0

Вы получили это, чтобы работать, и можете ли вы поделиться кодом Matcher? –

+0

@ IvoJansch: извините, но в настоящее время я больше не работаю над этим проектом, из-за отсутствия свободного времени, потраченного на него ... –

1

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

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

+1

Я знаю, что контроллер по умолчанию уже настроен, что я пытаюсь делать i Я хочу настроить маршрут так, чтобы, например, контроллер «foo» в модуле «bar» соответствовал маршруту «/ bar/foo», будучи зарегистрированным в списке контроллеров как «bar-foo ». Также я бы хотел, чтобы маршрут, используемый для этого соответствия, был общим, так что мне не нужно определять его для каждого модуля. –

0

Чтобы иметь общее/стандартную систему маршрутизации для модуля 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', 
       ), 
      ), 
     ), 
    ), 
), 

то в нашем контроллере «Профиль \ Controller \ Index»мы имеем три действия„индекс“„дома“„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'); 
} 

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

Смежные вопросы