2015-09-07 131 views
0

我目前正在为最近开始的一个项目研究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的侦听器没有正确设置。

有没有人有任何想法如何解决这个问题?

回答

0

我设法找到一种方法来解决这个问题。因为在我的项目中我也有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)传递所需的网址。

如果有人找到更好的方法,我打开建议。

1

在PHPCR中,每个文档都有一个path它在哪里存储。如果您熟悉原则ORM,则该路径具有ID的作用。与ORM的不同之处在于,所有文档(不论其类型)都位于同一棵树上。这很好,因为你的路由只能引用任何东西,它不限于特定的文档类型。但我们需要创建一些具有路径的结构。这就是为什么我们有prefix概念。所有路线都放在一个前缀(默认为/cms/routes)下。 URL路径的文档路径的这一部分被删除。因此版本库路径/ cms/route/testing是url/testing。

关于您的示例代码:通常,您希望通过内容文档的类或路由“type”属性来配置控制器,以避免将控制器名称存储到数据库中以允许将来进行重构。很多这一点在[CMF文档的路由章节] [1]中进行了解释,但前缀仅用于那里,没有明确解释。我们需要改善那里的文档。

[1] http://symfony.com/doc/master/cmf/book/routing.html

+1

新增文档请求https://github.com/symfony-cmf/symfony-cmf-docs/issues/704 – dbu

+0

感谢您抽出时间来回答!在深入了解'RoutingBundle'和'RoutingAutoBundle'的源头之后,我设法更好地理解了事情的工作方式。我仍然需要使用我的解决方法,因为页面标题主要是西里尔语和波斯语。这就是为什么我保存一个名为'normalizedUrl'的额外字段,用户可以手动音译英文标题,并且可以自定义网址(即'Тестовастраница'变成'/ bg/testova-stranica')。 – tftd

+0

当您创建路线文件时,您只需指定路径 - 路线没有“标题”。它是具有标题的内容文件。但是使用路由自动功能,您可以自动生成路由,并将该文档的标题或其他字段用于路径。 – dbu