从动作中调用方法

时间:2012-10-19 08:00:46

标签: php controller symfony-1.4 doctrine-1.2

我有一个带有$ 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()来指定它?该呼叫是否应该在控制器中?

2 个答案:

答案 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。