因为您在一个 symfony 应用程序上运行了多个 URL 规则,所以您需要使用 url 前缀。您的 cms 应该使用前缀 /cms/parent-slug/child-slug 或所有其他控制器。否则,当动态请求到达时,您无法区分哪个控制器是指哪个控制器。
您可以尝试使用 KernelControllerListener 的解决方法。他将赶上每个请求,然后检查是否请求了 cms 页面。您可以根据请求自行设置控制器和动作。概念:
只用“/”创建一个路由。放弃其他规则。然后像这样创建一个监听器:
<?php
namespace AppBundle\Listener;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
/**
* Class KernelControllerListener
* @package ApiBundle\Listener
*/
class KernelControllerListener
{
/**
* @var CmsRepository
*/
private $requestParser;
/**
* KernelControllerListener constructor.
* @param CmsRepository $CmsRepository
*/
public function __construct(CmsRepository $CmsRepository)
{
$this->CmsRepository = $CmsRepository;
}
/**
* @param FilterControllerEvent $event
*/
public function onKernelController(FilterControllerEvent $event){
$request = $event->getRequest();
//should be /parent-slug/children/slug or any other path
$path = $request->getPathInfo();
if($this->CmsRepository->getCmsControllerIfMatch($path)){
//cms repository search in db for page with this path, otherwise return false
$event->setController([AppBundle\CmsController::class, 'cmsAction']);
return;
}
//repeat if clause for any other application part
}
}
在 services.yml 中:
app.controller_listener:
class: AppBundle\Listener\KernelControllerListener
arguments:
- "@app.cms_repository"
tags:
- { name: kernel.event_listener, event: kernel.controller, method: onKernelController }
编辑:捕获所有路线,请参阅https://www.jverdeyen.be/symfony2/symfony-catch-all-route/