gpt4 book ai didi

php - 在每个 Controller 中处理相同的 try catch 结构

转载 作者:搜寻专家 更新时间:2023-10-31 21:36:06 24 4
gpt4 key购买 nike

我正在为我的网络项目使用 Symfony2,并且我有几个具有完全相同的 try catch block 的 Controller

<?php

class MyBaseController extends Controller {
private $manager = new MyManager();
// Some generic stuff
}

class MyController1 extends MyBaseController {
try {
$manager->one();
}
catch (Exception $e) {
return $this->someOtherMessage();
}
}

class MyController2 extends MyBaseController {
try {
$manager->two();
}
catch (Exception $e) {
return $this->someOtherMessage();
}
}

class MyController3 extends MyBaseController {
try {
$manager->three();
}
catch (Exception $e) {
return $this->someOtherMessage();
}
}

我该如何编写才能避免如此多的重复?

最佳答案

如果每个 Controller 都可能发送一个特定的异常,那么您不应该为 Controller 中的每个方法都需要一个 try/catch block 。
我看到了两种处理方法。

首先,如果这是一个可以抛出的全局异常,而您只想呈现不同于默认 500 错误消息的另一条消息。你可以override给定的默认模板,通过在 app/Resources 文件夹中创建您自己的 error500.html.twig

另一种处理它的方法是创建一个与 event listener 相关联的自定义异常。 .
我会创建自己的异常,例如 ManagerException,它将由事件监听器处理。

class ManagerException extends Exception {}

您的经理现在会抛出此异常。
注意:您可以创建任何您想要的异常,只要它扩展了这个基本异常

class RuntimeManagerException extends ManagerException {}

然后你可以声明你的事件监听器

services.yml

services:
manager_exception.listener:
class: Acme\FooBundle\Listener\ManagerExceptionListener
arguments: [ @templating ]
tags:
-
name: kernel.event_listener
event: kernel.exception
method: onKernelException

Acme\FooBundle\Listener\ManagerExceptionListener

use Symfony\Component\Templating\EngineInterface;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\Response;

class ManagerExceptionListener
{
protected $twig;

public function __construct(EngineInterface $twig)
{
$this->twig = $twig;
}

public function onKernelException(GetResponseForExceptionEvent $event)
{
$exception = $event->getException();

if (!($exception instanceof ManagerException)) {
return;
}

$response = new Response;
$response->setContent($this->twig->render('errorpage.html.twig'));

$event->setResponse($response);
}
}

关于php - 在每个 Controller 中处理相同的 try catch 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19180988/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com