1

我有一个带有 $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() 来分配它?该调用是否应该在控制器中?

4

2 回答 2

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();
  }
于 2012-10-19T08:52:49.983 回答
2

好吧,我认为最好的方法是使用问题 id 参数直接调用查询(如果您在 url 中的参数是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();
  }

然后你可以定义一个对象 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]

然后,当您调用 url 时/question/23,它会自动尝试检索带有 id 的问题23。如果此问题不存在,它将重定向到 404。

于 2012-10-19T09:19:43.583 回答