nextdev / symfony-adr
此包尚未发布版本,信息有限。
README
此包在使用 Symfony 应用程序时更容易遵循 ADR 模式。
用法
将控制器转换为动作
通过将响应器逻辑从动作逻辑中移除到控制器外部来解耦响应器逻辑。只需返回负载即可!
如果控制器返回的不是 Response
对象,Symfony 会触发 kernel.view
事件。
现在,您可以通过实现 ResponseHandlerInterface
来代替注册大量事件监听器进行迭代。
namespace App\Responder;
use nextdev\AdrBundle\Responder\ResponseHandlerInterface;
use nextdev\AdrBundle\Responder\ResponsePayloadEvent;
use Symfony\Component\HttpFoundation\Response;
use App\Entity\MyPayload;
class MyPayloadHandler implements ResponseHandlerInterface
{
public function getSupportedPayloadTypes(): array
{
return [
MyPayload::class,
];
}
public function handleResponsePayload(
ResponsePayloadEvent $payloadEvent
): void {
$response = new Response();
// prepare the response
if ($payloadEvent->request->getAttribute('_foo') === 'bar') {
// adjust the response according to the request
}
$payloadEvent->payload = $response;
}
}
如果您的处理类作为服务存在于您的 config/services.yaml
中,它将在控制器返回 MyPayload
对象时被发现和使用。
默认配置下,只需将类放入 src/Responder/MyPayloadHandler.php
即可。
将某些异常视为响应负载
一个健壮的领域将具有严格的约束,并在出现意外的或无效的条件时抛出异常,对于每个通过控制器/动作的异常,Symfony 会触发一个 kernel.exception
事件。
您可以保留此事件以处理真正的意外行为,而无需在控制器中重复类似的 try-catch 块。
定义所有控制器应捕获的异常,并将其视为响应负载
nextdev_adr:
graceful:
- { value: RuntimeException, not: [BadRuntime, OtherBadRuntime] }
- Foo
- { not: GloballyBadException }
- { value: Bar, not: BadBar }
如果安装了 SensioFrameworkExtraBundle,您可以按注解为每个控制器方法定义额外的规则
namespace App\Controller;
use nextdev\AdrBundle\Configuration\Graceful;
class MyController
{
/**
* @Graceful(not={LocallyBadException})
* @Graceful(LocallyGoodException, not={ButNotThisOne, OrThatOne})
*/
public function __invoke(
Request $request
) {
/// ...
}
}
规则按出现顺序应用,方法规则在全局规则之后。
现在,您可以创建一个如上所述的 App\Responder\MyGoodRuntimeExceptionHandler
。