Symfony1 利用Symfony前端应用程序中的条令关系 让我们考虑下面的简单模式(在原则上,但也推动用户欢迎):

Symfony1 利用Symfony前端应用程序中的条令关系 让我们考虑下面的简单模式(在原则上,但也推动用户欢迎):,symfony1,doctrine,crud,frontend,Symfony1,Doctrine,Crud,Frontend,现在,如果您为文章模型创建一个route,并通过原则:为route frontend@Article_route生成一个模块生成一个CRUD应用程序,该应用程序管理所有文章。但在前端,您通常希望管理与登录用户相关的对象,因此您必须手动获取用户id,将id传递给模型,并编写一组方法来检索与此用户相关的对象,例如: public function executeIndex(sfWebRequest $request) { $this->articles = Doctrine::

现在,如果您为文章模型创建一个route,并通过
原则:为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();
  }
}

这是微不足道的事情,但是您必须为每个新关系手动编写此代码。我是否错过了某种利用教义关系的方式?不管怎样,你会怎么做?谢谢。

我相信您应该可以通过自定义路由类来完成这项工作。我从来没有这样做过,但在《更多使用Symfony》一书中有一个教程:。我猜应该是这样的:

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
。我还没有对此进行测试,但我认为这是解决问题的最佳方法。

sfContext::getInstance()->getUser()返回null,可能是因为用户在路由后被实例化。我应该改变工厂装货的顺序吗?怎么做呢?嗯,的确如此——我不知道为什么我之前的测试成功了。看起来您无法使用此技术
:-(
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;
  }
}