我有一个带有$ id属性和getId()方法的问题类。我还在控制器中有一个索引动作,我希望在该动作中显示该问题的答案数。
class questionActions extends sfActions
{
public function executeIndex(sfWebRequest $request)
{
$q_id = $this->getQuestion()->getId();
$this->answers = Doctrine_Core::getTable('answer')
->createQuery('u')
->where('u.question_id = ?', $q_id)
->execute();
}
在我的indexSuccess模板中:
<?php if ($answers) : ?>
<p><?php echo count($answers) ?> answers to this request.</p>
<?php endif; ?>
但是,这会导致错误:调用未定义的方法。
如果我手动分配$ q_id的值,一切都很完美。
如何从动作调用方法getId()来指定它?该呼叫是否应该在控制器中?
答案 0 :(得分:2)
您收到该错误,因为控制器中未实现getQuestion()。
我假设您将问题ID作为GET参数传递。
在这种情况下,您可以尝试类似:
class questionActions extends sfActions {
public function executeIndex(sfWebRequest $request) {
$q_id = $request->getParameter('question_id');
$question = Doctrine_Core::getTable('question')->find($q_id);
$this->answers = Doctrine_Core::getTable('answer')
->createQuery('u')
->where('u.question_id = ?', $question->getId())
->execute();
}
或更好
class questionActions extends sfActions {
public function executeIndex(sfWebRequest $request) {
$q_id = $request->getParameter('question_id');
$question = Doctrine_Core::getTable('question')->find($q_id);
$this->answers = $question->getAnswers();
}
答案 1 :(得分:2)
我认为最好的方法是使用问题ID参数直接调用查询(如果您的网址中的参数为id
:
class questionActions extends sfActions
{
public function executeIndex(sfWebRequest $request)
{
// redirect to 404 automatically if the question doesn't exist for this id
$this->question = $this->getRoute()->getObject();
$this->answers = $this->question->getAnswers();
}
然后你可以定义object route,这样你就不必检查给定id是否存在问题,它将是symfony本身的工作。
question_index:
url: /question/:id
class: sfDoctrineRoute
options: { model: Question, type: object }
param: { module: question, action: index }
requirements:
id: \d+
sf_method: [get]
然后,当您拨打网址/question/23
时,它会自动尝试检索ID为23
的问题。如果此问题不存在,则会重定向到404。