2015-09-07 66 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

相關問題