我如何在Zend Framework 2中制作一个全方位的路线
我正在为ZF2创建一个CMS模块,我希望它不必在网址中包含“/ page”或someahch。因此,例如,版本说明页的网址将为http://www.yourdomain.com/imprint我如何在Zend Framework 2中制作一个全方位的路线
您会如何建议这样做?我已经考虑了以下的方法,但是我一直没能得到任何他们只是工作,我要如何:
有连接到我的PageController并通过URL路径作为参数包罗万象路线。这里的问题是让catchall路线与现有路线相得益彰。这也意味着,所有应该是404错误的页面现在将通过PageController进行路由,然后页面控制器必须处理404页面(如果页面在数据库中未找到)。
或
观察事件EVENT_DISPATCH_ERROR,如果在数据库中存在的页面恢复它。我可以捕捉到事件,但我不知道如何从中恢复并触发PageController。
或
一个CMS页面标题被创建,更新或删除任何时间,重建所有CMS路由的高速缓存。这似乎是一个干净的解决方案,但我不知道如何继续,而不是像在config/autoload目录中将缓存构建为php配置文件。
我将不胜感激关于如何完成此任何想法。理想情况下,该解决方案也能够处理由CMS驱动的主页(/)。
回答:
就我个人而言,我会采取不同的方法。
选项1肯定会工作,但我会创建一个新类型的路由器(CmsRouter),然后我们可以做一个优先于您的其他静态路由的路由。
此路径可以检查数据库中已知页/列表的列表,或者甚至更好地使用某些智能缓存来快速查找。
我当然不会使用方法2),因为您在使用错误条件时完全没有错误,我会避免这样做。
回答:
我结束了选项#1和#3的结合。我在我的模块配置文件中设置了一个catchall路由:
return array( // Relative to app root
'routeCacheFile' => 'data/cache/cmsRoutes',
'router' => array(
'routes' => array(
'cmsPage' => array(
'type' => 'segment',
'priority' => 100,
'options' => array(
'route' => '/:pageRoute',
'constraints' => array(
'pageRoute' => 'dynamically-populated-by-bootstrap'
),
'defaults' => array(
'controller' => 'pages',
'action' => 'view'
)
)
)
),
// ...
);
第一个配置选项是缓存文件。稍后再详细介绍。请注意,该路线是只有一个元素:pageRoute
的细分路线。那么,对于它的约束,我们将填写在Module.php这样的:
public function getConfig() {
$config = include __DIR__ . '/config/module.config.php';
// Get the cms page routes from a cache file
if (!empty($config['routeCacheFile'])) {
$cachedRoutes = file_get_contents($config['routeCacheFile']);
$config['router']['routes']['cmsPage']['options']
['constraints']['pageRoute'] = $cachedRoutes;
}
return $config;
}
而不是仅仅包括并返回配置数组,我得到的routeCacheFile设置抓取该文件的内容,然后用它们来替换'动态填充的引导'约束。缓存文件包含所有发布的路由的简单管道删除列表(更多内容如下),如下所示:about|staff|some/longer/route|terms-of-service
有一件好事就是我们不需要连接到数据库来发送请求。
我不会为你提供最后一点的代码,但每次我的PageController保存一个页面时,它都会触发一个服务类,它查找所有已发布的路由并将它们写入配置中的缓存文件。
您如何看待这种方法?它不会中断任何现有路由(我使用优先级设置来设置路由匹配的顺序),它不需要数据库查找来路由请求,也不需要滥用错误条件。缺点:对文件系统有依赖性,这使得单元测试更加困难。也许我可以用Zend \ Cache代替。它看起来像段路由约束使用正则表达式。这可能会对性能造成一定影响。
回答:
我使用的主机名路由器创建一个包罗万象:
'wildcard' => array( 'type' => 'Hostname',
'may_terminate' => true,
'options' => array(
'route' => ':subdomain.:domain.:tld',
'defaults' => array(
'__NAMESPACE__' => 'ModName\Controller',
'controller' => 'ModName',
'action' => 'index'
),
),
),
你可能会想这与能够改变行动派遣活动结合起来。为了解决类似的问题,我重视以下配置的SharedListenerAggregateInterface
:
public function attachShared(SharedEventManagerInterface $sharedManager) {
$this->listeners[] = $sharedManager->attach('ModName\Controller\ModNameController', MvcEvent::EVENT_DISPATCH, array($this, 'changeAction'), 10);
}
public function changeAction(\Zend\Mvc\MvcEvent $event)
{
if (/* criteria for action foo */) {
$event->getRouteMatch()->setParam('action','foo');
} else if (/* criteria for action bar */) {
$event->getRouteMatch()->setParam('action','bar');
}
}
因为这是一个MvcEvent,您可以访问服务管理器,所以你可以做很多事情,包括数据库调用检查,如果路线是有效的。
以上是 我如何在Zend Framework 2中制作一个全方位的路线 的全部内容, 来源链接: utcz.com/qa/264893.html