我在这里发表的第一篇文章,希望它是正确的! =)
我正在创建一个网站来使用 symfony 1.4 和原则来管理 Web 应用程序开发。 我的记录包括 Project 和 ProjectFeatures 的这个问题
现在我想做的是使用管理生成器让用户通过一个链接来管理一个项目的功能,该链接通过project_id 限制所有返回的功能,如下所示:http://mysite/member/project/:project_id/features
在我的routing.yml配置中,我有:
member_project_feature: class: sfDoctrineRouteCollection options: model: ProjectFeature module: memberProjectFeature prefix_path: /member/project/:project_id/features with_show: true column: id with_wildcard_routes: true
project_id 是模型 ProjectFeature 中的现有列,
我将使用自定义查询仅通过该project_id 检索功能。
现在我可以使用以下方法生成链接到该管理生成器模块的 url,不会出现错误:
url_for('member_project_feature', array('project_id' => $project['id']))
路由系统确实可以识别该 url:
May 04 14:30:59 symfony [info] {sfPatternRouting} 将/member/project/1/features 的路由“member_project_feature”(/member/project/:project_id/features.:sf_format)与参数数组(' module' => 'memberProjectFeature', 'action' => 'index', 'sf_format' => 'html', 'project_id' => '1',)
但是管理生成器无法使用该 prefix_path 在其模板内生成链接,并返回错误 InvalidArgumentException 并显示消息 The "/member/project/:project_id/features/:action/action.:sf_format"路由缺少一些强制参数 (:project_id)。
有什么想法吗?
最佳答案
嗯,我在这个网址找到了答案:http://www.blogs.uni-osnabrueck.de/rotapken/?s=symfony 但我会在这里给出它并缩短它,因为 stackoverflow 很棒而且它应该存在很长一段时间 =)
第一 - 我在问题中使用的路由配置是有效的。
第二 - 您需要在管理员生成的操作文件中添加一个方法
public function execute($sfRequest)
{
// taken from http://www.blogs.uni-osnabrueck.de/rotapken/?s=symfony
$this->forward404Unless(
$project_id = $sfRequest->getUrlParameter('project_id'));
$this->forward404Unless(
$this->project = Doctrine::getTable('ttcWebProject')->find($project_id));
$this->getContext()->getRouting()
->setDefaultParameter('project_id', $project_id);
if ($id = $sfRequest->getUrlParameter('id'))
{
$this->getContext()->getRouting()->setDefaultParameter('id', $id);
}
$result = parent::execute($sfRequest);
return $result;
}
此时,url 已正确生成,但这是获得您最可能想要实现的最终结果的最后一步:
第三 - 要按project_id获取列表,我可以在generator.yml中提供一个表方法、getFilterDefaults的默认值或在操作文件中提供此方法:
protected function buildQuery ()
{
$q = parent::buildQuery();
$rootAlias = $q->getRootAlias();
$q->andWhere("{$rootAlias}.project_id = ?",
$this->getRequest()->getUrlParameter('project_id'));
return $q;
}
关于symfony1 - 使用 Symfony 管理生成器让用户管理记录的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5888257/