如何在Symfony RoutingBundle(PHPCR)中创建具有自定义路径的路由?

时间:2015-09-07 00:55:14

标签: php symfony symfony-cmf doctrine-phpcr

我目前正在为最近开始的项目研究Symfony CMF和PHPCR。我目前要弄清楚的是如何创建Route并将其保存到数据库中。据我所知,我必须使用Symfony\Cmf\Bundle\RoutingBundle\Doctrine\Phpcr\Route并将元素保存到数据库中。这工作正常,但自动生成路径路径,这不是我想要的。我需要做的是生成一个链接到特定控制器的自定义路由。这是我的代码:

$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的侦听器未正确设置。

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

2 个答案:

答案 0 :(得分:1)

在PHPCR中,每个文档都有一个path存储。如果您熟悉doctrine ORM,则路径具有ID的角色。与ORM的区别在于所有文档(不论其类型)都位于同一树中。这很好,因为您的路线可以引用任何东西,它不仅限于特定的文档类型。但是我们需要用路径创建一些结构。这就是为什么我们有prefix概念。所有路由都放在前缀(默认为/cms/routes)下。对于URL路径,将删除文档路径的该部分。因此,存储库路径/ cms / route / testing是url domain.com/testing。

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

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

答案 1 :(得分: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)传递所需的网址。

如果有人找到更好的方法,我会接受建议。