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

时间:2018-06-01 19:28:17

标签: php symfony hook

我对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); 

        // .... 

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

需要一个全局基本控制器。

浏览了Symfony docs& stackoverflow帖子,看起来我可以创建一个基本控制器并让我所有其他控制器extend就像这样:

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

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

我还提到了this symfony docs article描述"前后过滤器"的实现。挂钩所有请求。

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

1 个答案:

答案 0 :(得分:1)

之前和之后应该比BaseController模型更好,这就是原因:

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

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