国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Symfony 6父控制器到子控制器的依賴注入
P粉208469050
P粉208469050 2023-08-17 20:19:03
0
1
682
<p>我有一個(gè)基礎(chǔ)控制器類,其中包含一些所有子控制器都會使用的實(shí)用方法。目前它有3個(gè)依賴項(xiàng),但將來可能會有更多。因此,每當(dāng)我想要在子控制器中添加一個(gè)依賴項(xiàng)時(shí),我現(xiàn)在遇到了一個(gè)問題,即我認(rèn)為依賴注入的指令過多。 </p> <pre class="brush:php;toolbar:false;">abstract class BaseController extends AbstractController { public function __construct( protected readonly SerializerInterface $serializer, protected readonly ValidatorInterface $validator, private readonly ResponseGenerator $responseGenerator, ) { } … } class ChildController extends BaseController { // 所有父類別注入在所有子類別中都是必需的。 public function __construct( SerializerInterface $serializer, ValidatorInterface $validator, ResponseGenerator $responseGenerator, private readonly SomeRepository $someRepository, ... 在這裡插入任何其他子控制器特定的依賴項(xiàng)。 ) { parent::__construct($serializer, $validator, $responseGenerator); } … }</pre> <p>我嘗試在基礎(chǔ)控制器中使用<code>$this->container->get('serializer')</code>,但這不起作用,因?yàn)?lt;code>AbstractController: :$container</code>是透過注入定義的,但沒有建構(gòu)函數(shù),所以無法呼叫<code>parent::__construct()</code>。此外,它也無法提供我<code>validator</code>,所以即使它起作用,也只能解決部分問題。 </p> <p>我嘗試尋找可以使用的屬性,例如</p> <pre class="brush:php;toolbar:false;">abstract class BaseController extends AbstractController { #[Inject] protected readonly SerializerInterface $serializer; #[Inject] protected readonly ValidatorInterface $validator;</pre> <p>但是沒有找到類似的東西(PHP-DI有,但Symfony沒有)。 </p> <p>有沒有辦法以某種方式消除子控制器中的重複依賴項(xiàng)? </p>
P粉208469050
P粉208469050

全部回覆(1)
P粉464208937

你需要的是被稱為服務(wù)訂閱者

在Symfony中,當(dāng)控制器繼承AbstractController時(shí),它們是服務(wù)訂閱者,這意味著它們被注入了一個(gè)包含一些常用服務(wù)(如twig、序列化器、表單建構(gòu)器等)的小容器。

如果你想要一些你的子控制器將使用的「常見」服務(wù),你可以透過在父控制器中重寫getSubscribedServices()來擴(kuò)充清單?;蛘呷绻愕目刂破鳑]有繼承Symfony提供的預(yù)設(shè)控制器,你只需要實(shí)作自己的控制器:

如果你的控制器是一個(gè)服務(wù)(我猜已經(jīng)是了),Symfony將使用setter注入將容器注入到你的控制器中。

程式碼將如下所示:

<?php

use Symfony\Contracts\Service\ServiceSubscriberInterface;


class ParentController implement ServiceSubscriberInterface {
    protected ContainerInterface $container;
    public function setContainer(ContainerInterface) { $this->container = $container; } 

    public static function getSubscribedServices() {
         // 這是靜態(tài)的,所以Symfony可以在不實(shí)例化控制器的情況下“看到”所需的服務(wù)。
         // 在這里定義一些常見的服務(wù),一個(gè)示例在Symfony的AbstractController中
    }
}

class ChildController extends ParentController {
    // 使用自定義DI來為子控制器提供服務(wù)。

    public function indexAction {
        // 你可以使用$this->container->get(...)來獲取服務(wù)
    }

}
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板