【发布时间】:2018-06-03 15:06:11
【问题描述】:
我正在使用 Symfony 4 创建一个简单的 CMS。可以在其中创建页面。创建页面时,会调用 Doctrine EvenSubscriber。此订阅者创建一个 PageRoute。
<?php
#src/Doctrine/EvenListener
/**
* PageRouteSubscriber
*/
namespace App\Doctrine\EventListener;
use App\Controller\PageController;
use App\Entity\Page;
use App\Entity\Route;
use Doctrine\Common\EventSubscriber;
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
/**
* Class PageRouteSubscriber
* @package App\Doctrine\EventListener
*/
class PageRouteSubscriber implements EventSubscriber {
/**
* Returns an array of events this subscriber wants to listen to.
* @return array
*/
public function getSubscribedEvents() {
return [
'postPersist',
'postUpdate',
];
}
public function postPersist(LifecycleEventArgs $args){
$this->index($args);
}
public function postUpdate(LifecycleEventArgs $args){
$this->index($args);
}
public function index(LifecycleEventArgs $args)
{
$entity = $args->getObject();
if($entity instanceof Page){
$route = new Route();
$route->setController(PageController::class);
$route->setRouteContentId(get_class($entity) . '#' . $entity->getId());
$route->setLocale($entity->getLocale());
$route->setSlug($entity->getSlug());
$entityManager = $args->getObjectManager();
$entityManager->persist($route);
$entityManager->flush();
}
}
}
所以当页面被创建时,也会创建一个路由。请参阅图像以获取数据库页面和路由示例。
我不知道这是在数据库中存储路由和页面的最佳方式。 因为他们都有相同的蛞蝓。我在想,只在路由表中设置 slug。并且每个实体根据路由表中的所有 slug 检查唯一的 slug(如果可能的话?)。
对于路由:我现在不知道如何 grep 路由并将它们与 Symfony Route Collection 一起使用。也可以像 Symfony 一样缓存路由并在名为:srcDevDebugProjectContainerUrlGenerator 的大文件上创建
当我的路线正常工作时,我可以创建前端菜单。页面菜单项与页面耦合的地方。该页面有一条路线。使用这条路线可以创建菜单 url(是正确的思维方式吗?)。
【问题讨论】:
-
RE 缓存路由:我假设您使用 DynamicRouter。该路由器的重点是路由存储在数据库中并在运行时查询。每次编辑其中一个路由时都需要重新构建缓存文件,这将非常低效。
-
如果您可以从内容生成路由而无需手动交互,您可以查看 cmf 路由包的路由提供程序 - 您可以从您的内容动态生成它们,而不需要存储数据库中的单独路由。
标签: symfony doctrine-orm routing url-routing symfony-cmf