Как перенаправить запросы на www.example.com/admin в другой модуль в Zend
У меня проблема с перенаправлением запросов в моем приложении.
Мои правила:
- employeeer.domain.com - должен указывать на страницу работодателя - использует модуль по умолчанию
- employeeer.domain.com/panel/ - должен указывать на страницу администрирования конкретного работодателя - использует модуль панели мониторинга
- www.domain.com - должен указывать на страницу агрегирования всех работодателей - использует модуль по умолчанию
Я протестировал много разных маршрутов, но когда один маршрут работает, другой ломается. Также часто это работает только для корневых путей, но когда я добавляю вызов к некоторому контроллеру и действию - он вылетает. Может быть, я должен написать собственный плагин контроллера? Что ты думаешь?
Вот моя текущая конфигурация. Это беспорядок, но, возможно, это поможет поймать какую-то глупую ошибку.
// employer.domain.com/panel
$pathRoute_panel = new Zend_Controller_Router_Route(
':panel/:controller/:action/:id/',
array(
'panel' => '',
'module' => 'dashboard',
'controller' => 'index',
'action' => 'index',
'id' => '',
),
array(
'panel' => 'panel'
)
);
$subdomainRoute = new Zend_Controller_Router_Route_Hostname(
':employer.'.$config['host'],
null,
array(
'employer' => '([a-z0-9]+)',
)
);
$router->addRoute('employer_panel', $subdomainRoute->chain($pathRoute_panel));
// employer.domain.com - main employer page
$pathRoute_panel = new Zend_Controller_Router_Route(
'',
array(
'module' => 'default',
'controller' => 'vcard',
'action' => 'index',
'id' => '',
)
);
$subdomainRoute = new Zend_Controller_Router_Route_Hostname(
':employer.'.$config['host'],
null,
array(
'employer' => '([a-z0-9]+)',
)
);
$router->addRoute('employer_vcard', $subdomainRoute->chain($pathRoute_panel));
// domain.com/
$pathRoute = new Zend_Controller_Router_Route_Module(
array(
'module' => 'default',
'controller' => 'index',
'action' => 'index',
),
$dispatcher,
$request
);
$route = new Zend_Controller_Router_Route_Hostname($config['host']);
$router->addRoute('default', $route->chain($pathRoute));
// www.domain.com/
$pathRoute = new Zend_Controller_Router_Route_Module(
array(
'module' => 'default',
'controller' => 'index',
'action' => 'index',
),
$dispatcher,
$request
);
$route = new Zend_Controller_Router_Route_Hostname('www.'.$config['host']);
$router->addRoute('default_www', $route->chain($pathRoute));
РЕДАКТИРОВАТЬ: Это мое решение:
// employer.domain.com
$pathRoute_panel = new Zend_Controller_Router_Route_Module(
array(
'module' => 'default',
'controller' => 'vcard',
'action' => 'index',
'id' => '',
)
);
$subdomainRoute = new Zend_Controller_Router_Route_Hostname(
':employer.'.$config['host'],
null,
array(
'employer' => '([a-z0-9]+)',
)
);
$router->addRoute('employer_vcard', $subdomainRoute->chain($pathRoute_panel));
// employer.domain.com/panel/
$pathRoute_panel = new Zend_Controller_Router_Route(
'panel/:controller/:action/:id/',
array(
'panel' => 'panel',
'module' => 'dashboard',
'controller' => 'index',
'action' => 'index',
'id' => '',
)
);
$subdomainRoute = new Zend_Controller_Router_Route_Hostname(
':employer.'.$config['host'],
null,
array(
'employer' => '([a-z0-9]+)',
)
);
$router->addRoute('employer_panel', $subdomainRoute->chain($pathRoute_panel));
1 ответ
// Enforce Subdomain usage
// Will match employer.domain.com/*
$subdomainRoute = new Zend_Controller_Router_Route_Hostname(
'employer.'.$config['host'] . '/*'
);
// Will match /panel/{id, required}/{controller, optional}/{action, optional}/{further parameters, optional}
$pathRoute_panel = new Zend_Controller_Router_Route(
'panel/:id/:controller/:action/*',
array(
'module' => 'dashboard',
'controller' => 'index',
'action' => 'index'
),
array(
'id' => '\d+'
)
);
// employer.domain.com - main employer page
// will match everything not matched before!
$pathRoute_page = new Zend_Controller_Router_Route(
'*',
array(
'module' => 'default',
'controller' => 'vcard',
'action' => 'index'
)
);
// You can add several routes to one chain ;) The order does matter.
$subDomainRoute->chain($pathRoute_page);
$subDomainRoute->chain($pathRoute_panel);
$router->addRoute($subDomainRoute);
Аннотации в коде. Вы можете использовать подстановочный знак (*), чтобы соответствовать чему-либо еще! Там нет необходимости default_www
маршрут - это просто поведение по умолчанию (маршрут по умолчанию теперь будет соответствовать каждому поддомену, кроме работодателя, так как он соответствует subDomainRoute
).