我如何在Zend Framework 2中制作一个全方位的路线

我正在为ZF2创建一个CMS模块,我希望它不必在网址中包含“/ page”或someahch。因此,例如,版本说明页的网址将为http://www.yourdomain.com/imprint我如何在Zend Framework 2中制作一个全方位的路线

您会如何建议这样做?我已经考虑了以下的方法,但是我一直没能得到任何他们只是工作,我要如何:

  1. 有连接到我的PageController并通过URL路径作为参数包罗万象路线。这里的问题是让catchall路线与现有路线相得益彰。这也意味着,所有应该是404错误的页面现在将通过PageController进行路由,然后页面控制器必须处理404页面(如果页面在数据库中未找到)。

  2. 观察事件EVENT_DISPATCH_ERROR,如果在数据库中存在的页面恢复它。我可以捕捉到事件,但我不知道如何从中恢复并触发PageController。

  3. 一个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

回到顶部