如何在Symfony RoutingBundle(PHPCR)中创建具有自定义路径的路由?
我目前正在为最近开始的一个项目研究Symfony CMF和PHPCR。我目前试图弄清楚的是如何创建Route
并将其保存到数据库中。据我所知,我必须使用Symfony\Cmf\Bundle\RoutingBundle\Doctrine\Phpcr\Route
并将元素保存到数据库中。这工作正常,但会自动生成一个路径路径,这不是我想要的。我需要做的是生成一个链接到特定控制器的自定义路由。这里是我的代码:如何在Symfony RoutingBundle(PHPCR)中创建具有自定义路径的路由?
$em = $this->get('doctrine_phpcr.odm.document_manager');
$parent = $em->find(null, '/cms/routes');
$route = new \Symfony\Cmf\Bundle\RoutingBundle\Doctrine\Phpcr\Route();
$route->setParentDocument($parent);
$route->setName('my_route_name');
$route->setDefault('_controller', 'AppBaseBundle:Frontend/Users:index');
$em->persist($route);
$em->flush();
如果我执行这个代码,生成的路线将/cms/routes/my_route_name
。从我所看到的,您可以使用$route->setPath('/testing');
,但会产生以下异常:
无法确定前缀。这是一个新的未加载的文档,或者调用setPrefix的侦听器没有正确设置。
有没有人有任何想法如何解决这个问题?
我设法找到一种方法来解决这个问题。因为在我的项目中我也有RouteAutoBundle
,我创建了一个延伸\Symfony\Cmf\Bundle\RoutingBundle\Doctrine\Phpcr\Route
的类。这个类里面我说:
/**
* @PHPCR\Document(referenceable=true)
*/
class MenuRoute extends Route
{
protected $url;
/**
* Get $this->url
*
* @return mixed
*/
public function getUrl() {
return $this->url;
}
/**
* Set $this->url
*
* @param mixed $url
*/
public function setUrl($url) {
$this->url = $url;
}
}
之后,我加入这cmf_routing_auto.yml
:
App\MenuBundle\Document\MenuRoute:
uri_schema: /{getUrl}
token_providers:
getUrl: [content_method, { method: getUrl }]
所以现在一个只会创建MenuRoute
一个实例(使用Route
时一样),并调用该方法setUrl($your_url)
传递所需的网址。
如果有人找到更好的方法,我打开建议。
在PHPCR中,每个文档都有一个path
它在哪里存储。如果您熟悉原则ORM,则该路径具有ID的作用。与ORM的不同之处在于,所有文档(不论其类型)都位于同一棵树上。这很好,因为你的路由只能引用任何东西,它不限于特定的文档类型。但我们需要创建一些具有路径的结构。这就是为什么我们有prefix
概念。所有路线都放在一个前缀(默认为/cms/routes
)下。 URL路径的文档路径的这一部分被删除。因此版本库路径/ cms/route/testing是url/testing。
关于您的示例代码:通常,您希望通过内容文档的类或路由“type”属性来配置控制器,以避免将控制器名称存储到数据库中以允许将来进行重构。很多这一点在[CMF文档的路由章节] [1]中进行了解释,但前缀仅用于那里,没有明确解释。我们需要改善那里的文档。
新增文档请求https://github.com/symfony-cmf/symfony-cmf-docs/issues/704 – dbu
感谢您抽出时间来回答!在深入了解'RoutingBundle'和'RoutingAutoBundle'的源头之后,我设法更好地理解了事情的工作方式。我仍然需要使用我的解决方法,因为页面标题主要是西里尔语和波斯语。这就是为什么我保存一个名为'normalizedUrl'的额外字段,用户可以手动音译英文标题,并且可以自定义网址(即'Тестовастраница'变成'/ bg/testova-stranica')。 – tftd
当您创建路线文件时,您只需指定路径 - 路线没有“标题”。它是具有标题的内容文件。但是使用路由自动功能,您可以自动生成路由,并将该文档的标题或其他字段用于路径。 – dbu