为什么我不能 return 来自 symfony 私有函数的 HTTP 响应?

Why can I not return a HTTP response from a private function in symfony?

我有一个像这样工作的控制器'

public function indexAction() {

    // some stuff cut out

    $openEntries = $this->checkOpenEntries($position);

    if($openEntries === 0) {
        //do some stuff
    }
    elseif ($openEntries === -1) {
    
        //Sends email to notify about the problem
        $body = 'Tried to create position log entry but found more than 1 open log entry for position ' . $position->getName() . ' in ' . $position->getACRGroup()->getName() . ' this should not be possible, there appears to be corrupt data in the database.';
        $this->email($body);
        return new response($body . ' An automatic email has been sent to it@domain.se to notify of the problem, manual inspection is required.');
    
    } else {
        //do some other stuff
    }
}

private function checkOpenEntries($position) {

    //Get all open entries for position
    $repository = $this->getDoctrine()->getRepository('PoslogBundle:Entry');
    $query = $repository->createQueryBuilder('e')
    ->where('e.stop is NULL and e.position = :position')
    ->setParameter('position', $position)
        ->getQuery();
    $results = $query->getResult();     

    if(!isset($results[0])) {
        return 0; //tells caller that there are no open entries
    } else {
        if (count($results) === 1) {
            return $results[0]; //if exactly one open entry, return that object to caller
        } else {
            return -1; //if more than one open entry, null will signify to caller that we have a problem.
        }
    }
}

但我想将那个 response-returning-business 已经放在私有函数中以清理我的 indexAction,但这是不可能的,indexAction 将继续超过

$openEntries = $this->checkOpenEntries($position);

即使 checkOpenEntries 尝试 return HTTP 响应。

理想情况下我希望它看起来像这样,有没有办法做到这一点:

public function indexAction() {

    // some stuff cut out

    $openEntries = $this->checkOpenEntries($position);

    if($openEntries === 0) {
        //do some stuff
    } else {
        //do some other stuff
    }
}

private function checkOpenEntries($position) {

    //Get all open entries for position
    $repository = $this->getDoctrine()->getRepository('PoslogBundle:Entry');
    $query = $repository->createQueryBuilder('e')
    ->where('e.stop is NULL and e.position = :position')
    ->setParameter('position', $position)
        ->getQuery();
    $results = $query->getResult();     

    if(!isset($results[0])) {
        return 0; //tells caller that there are no open entries
    } else {
        if (count($results) === 1) {
            return $results[0]; //if exactly one open entry, return that object to caller
        } else {
            //Sends email to notify about the problem
            $body = 'Tried to create position log entry but found more than 1 open log entry for position ' . $position->getName() . ' in ' . $position->getACRGroup()->getName() . ' this should not be possible, there appears to be corrupt data in the database.';
            $this->email($body);
            return new response($body . ' An automatic email has been sent to it@domain.se to notify of the problem, manual inspection is required.');
        }
    }
}

恕我直言,您混淆方法类型的方式并不干净。但是,您可以执行类似的操作以使其正常工作。

另外,我觉得如果函数和参数有类型就更好了,读起来会更容易。

public function indexAction() {

  // some stuff cut out

  $openEntries = $this->checkOpenEntries($position);
  if ($openEntries instanceOf Response) return $openEntries;

  if($openEntries === 0) {
      //do some stuff
  } else {
    //do some other stuff
  }

  // you might also want to add some response here!
  return new Response('...');
}