0

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

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

4

2 回答 2

1

在 PHPPCR 中,每个文档都有一个path存储位置。如果你熟悉 ORM 学说,路径就有 ID 的作用。与 ORM 的不同之处在于所有文档(无论其类型如何)都位于同一棵树中。这很棒,因为您的路由可以引用任何内容,它不限于特定的文档类型。但是我们需要用路径创建一些结构。这就是我们有这个prefix概念的原因。所有路由都放置在前缀下(/cms/routes默认情况下)。为 URL 路径删除了该部分文档路径。所以存储库路径 /cms/route/testing 就是 url domain.com/testing。

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

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

于 2015-09-17T11:58:52.570 回答
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)传递所需 url 的方法。

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

于 2015-09-07T16:34:07.900 回答