Symfony1 利用Symfony前端应用程序中的条令关系 让我们考虑下面的简单模式(在原则上,但也推动用户欢迎):
现在,如果您为文章模型创建一个route,并通过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 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;
}
}