我对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)最适合于每次发出请求时我想要全局运行的有效代码。为什么呢?
答案 0 :(得分:1)
之前和之后应该比BaseController模型更好,这就是原因:
假设您编写了10个Controller类,它扩展了BaseController类,BaseController类启动了5个服务。每个控制器类可能不需要所有5个服务的可能性非常高。这将是所有10个控制器类的开销。
因此,如果您实施了Before / After过滤器,则可以定义正在执行的控制器并启动此控制器所需的服务。