Как создать общий модуль / контроллер / маршрут действий в Zend Framework 2?
Я хотел бы создать общий модуль / контроллер / маршрут действий в Zend Framework 2 для использования с архитектурой ZF2 MVC.
В ZF1 маршрут по умолчанию был определен как /[:module][/:controller][/:action]
где модуль будет по умолчанию default
контроллер будет по умолчанию index
и действия по index
,
Теперь ZF2 изменил способ, которым модули предназначены, от простых групп контроллеров и представлений, до реальных автономных приложений с явным отображением имени контроллера в класс контроллера.
Поскольку все имена контроллеров должны быть уникальными во всех модулях, я подумал назвать их как modulename-controllername
но я бы хотел чтобы URL был похож /modulename/controllername
без необходимости создавать конкретные маршруты для каждого модуля, используя что-то вроде старого маршрута по умолчанию для ZF1, описанного выше.
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 может использовать. Это не сложно, посмотрите на другие сопоставители маршрутов, уже существующие в рамках, и вы поймете идею.
Если вы используете Zend Skeleton Application, вы уже настроили этот контроллер по умолчанию.
Смотрите здесь https://github.com/zendframework/ZendSkeletonApplication/blob/master/module/Application/config/module.config.php
Чтобы иметь общую / стандартную систему маршрутизации для модуля 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');
}
и все равно спасибо:)