在控制器的操作中,我经常根据id从数据库中的表中选择一行,所以我将其分离为一个函数。但每次执行此操作时,我都会检查查询是否返回了某些内容,因此我也想将其与函数分离。这是我的代码:
该功能在控制器中,由我的控制器扩展,其中包括以下操作:
protected function findById($id, $class)
{
$result = $this->getEM()->getRepository('EMMyFriendsBundle:'.$class)->find($id);
if($result == null) {
return false;
} else {
return $result;
}
}
这是我的控制器:
class FriendController extends Controller
{
private $em;
private $friend;
private function init($id)
{
$this->em = $this->getEM();
$this->friend = $this->findById($id, 'Friend');
if(!$this->friend) {
return $this->render('EMMyFriendsBundle:Friend:error.html.twig', array(
'item' => 'friend'));
}
}
/*
* Displays all the information about a concrete friend
*/
public function displayAction($id)
{
$this->init($id);
if($this->friend->getCategory() != null) {
$category = $this->friend->getCategory()->getName();
} else {
$category = null;
}
return $this->render('EMMyFriendsBundle:Friend:friend.html.twig', array(
'friend' => $this->friend, 'category' => $category));
}
// ...
}
当我选择一个不存在的ID(如38743874)时,它会转到init函数中的if部分,但不会呈现模板错误。html.twig:(但如果我选择这个部分
if(!$this->friend) {
return $this->render('EMMyFriendsBundle:Friend:error.html.twig', array(
'item' => 'friend'));
}
从init()
函数中取出,并在调用$this->init($id)
后将其放入displayAction($id)
中,即可工作。但我不想把它写在控制器的每一个动作中。有什么想法可以将其分离以避免代码重复吗?
您不会返回init函数的响应。这就是为什么它会向您显示错误消息。你必须在displayAction()
:中做类似的事情
$response = $this->init();
if ($response) {
return $response;
}