Symfony 基本控制器与过滤器之前和之后

Symfony Base Controller vs. Before and After Filters

我是 Symfony(第 4 版)的新手,使用该框架构建了一个 REST API。

我有几个控制器对应于许多使用公共服务的端点。一项服务对每个控制器都是通用的。

目前我正在将这些服务手动注入到每个控制器中。

namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use App\Services\Utilities;
use App\Services\Database;
use App\Services\Session;
use App\Services\Rest;

class Fetch extends Controller {

    protected $API;
    protected $DB;
    protected $u;

    public function init() {

        $this->API = new Rest();
        $this->DB = new Database();
        $this->u = new Utilities();

        $this->API->init();
        $this->DB->init($this->DB->default_credentials); 

        // .... 

它有点重复而且效率不高,因为每次请求端点时都需要实例化每个 class。

需要一个全球基地控制器。

浏览了 Symfony 文档和 Whosebug 帖子后,看起来我可以创建一个基本控制器并让我的所有其他控制器 extend 像这样:

class Fetch extends BaseController {
//.....

并且 BaseController 中的所有方法都将在 Fetch 中可用。此外,我可以在 BaseController 中 运行 挂钩,这将 运行 全局(只要我所有的控制器扩展 BaseController

我也遇到了 this symfony docs article 描述 "Before and After Filters" 的实现,它挂接到所有请求。

哪种方法(BaseController / Before and After Filters)最适合我想要在每次发出请求时全局 运行 的有效代码,为什么?

Before 和 After 应该比 BaseController 模型更好,原因如下:

假设,您编写了 10 个控制器 class,它扩展了 BaseController class 并且 BaseController class 启动了 5 个服务。每个控制器 class 可能不需要所有 5 项服务的可能性非常高。这将是所有 10 个控制器的开销 classes.

因此,如果您实施 Before/After 过滤器,您可以定义哪个控制器正在执行并启动该控制器需要的服务。