2010-10-06 63 views
0
以學說關係的優勢

讓我們考慮下面這個簡單的模式(在教義,但行走的用戶也歡迎):在前端應用程序中的Symfony

User: 
    columns: 
    name: string 
Article: 
    columns: 
    user_id: integer 
    content: string 
    relations: 
    User: 
     local: user_id 
     foreign: id 

現在,如果你創建Article模型的路線,併產生一個通過doctrine:generate-module-for-route frontend @article_route的模塊,你會得到一個管理所有文章的CRUD應用程序。但在前端,您通常需要管理與登錄用戶相關的對象,因此您必須手動獲取用戶的ID,將ID傳遞給模型,並編寫一組檢索與此用戶相關的對象的方法例如:

public function executeIndex(sfWebRequest $request) 
    { 
    $this->articles = Doctrine::getTable('Articles') 
     ->getUserArticles(this->getUser()); 
    } 
    public function executeShow(sfWebRequest $request) 
    { 
    $this->article = $this->getRoute()->getObject(); 

    if (!$this->article->belongsToUser($this->getUser())) 
    { 
     $this->redirect404(); 
    } 
    } 

和型號:

class ArticleTable extends Doctrine_Table 
{ 
    public function getUserArticles(sfUser $user) 
    { 
     $q = $this->createQuery('a') 
     ->where('a.user_id = ?', $user->getId()); 

     return $q->execute(); 
    } 
} 

class Article extends BaseArticle 
{ 
    public function belongsToUser(sfUser $user) 
    { 
    return $this->getUserId() == $user->getId(); 
    } 
} 

這是微不足道的東西,但你必須手動寫每一個新的關係,這種代碼。我是否錯過某種利用教義關係的方式?無論如何,你會怎麼做?謝謝。

回答

0

我相信你應該可以用自定義路由類來做到這一點。我從來沒有這樣做過,但More with Symfony書中有一個教程:Advanced Routing。我的猜測是,它應該是這個樣子:

class objectWithUserRoute extends sfDoctrineRoute 
{ 
    public function matchesUrl($url, $context = array()) 
    { 
    if (false === $parameters = parent::matchesUrl($url, $context)) 
    { 
     return false; 
    } 

    $parameters['user_id'] = sfContext::getInstance()->getUser()->getId(); 

    return array_merge(array('user_id' => sfContext::getInstance()->getUser()->getId()), $parameters); 
    } 

    protected function getRealVariables() 
    { 
    return array_merge(array('user_id'), parent::getRealVariables()); 
    } 

    protected function doConvertObjectToArray($object) 
    { 
    $parameters = parent::doConvertObjectToArray($object); 

    unset($parameters['user_id']); 

    return $parameters; 
    } 
} 

然後,您將需要設置路由類routing.yml使用objectWithUserRoute。我沒有測試過,但我認爲這是解決問題的最好方法。

+0

sfContext :: getInstance() - > getUser()返回null,可能是因爲用戶在路由之後得到了實例化。我應該改變工廠裝貨的順序嗎?如何? – Dziamid 2010-10-10 17:59:42

+0

嗯,所以它 - 我不知道爲什麼我以前的測試成功。看起來你不能使用這種技術':-(' – lonesomeday 2010-10-11 21:31:05

相關問題