簡體   English   中英

自定義/業務類的Symfony2依賴注入

[英]Symfony2 Dependency Injection to custom/business classes

我沒有在Googleing或Stackoverflow上找到類似的問題/解決方案,所以我在這里需要幫助。 我正在將PHP項目從自定義框架移植到Symfony框架(v2.5),該框架具有自定義依賴項注入(基於類反射)。 許多業務邏輯類都注入了屬性,我很想知道是否有一種方法可以在Symfony中做類似的事情而無需將這些類聲明為服務,因為某些類用於臨時保存/操作來自第三者端點和我需要它們的不同實例。

更確切地說,有一種方法可以將依賴注入與使用new關鍵字實例化對象結合使用。 因此,如果我需要一個依賴於記錄器或驗證器的新類,我該怎么做?

我要解決依賴項注入的內容類:


class Content extends SomeObject
{
    private $pictureUrl;
    ...

    public __construct(array $array = null)
    {
        parent::__construct($array);
    }

    public setPicture(...\Picture $picture)
    {
        // what's the best way to inject/enable this into my class
        $errors = $this->get('validator')->validate($picture->getUrl());
        ...
        $this->pictureUrl = $picture->getUrl();
    }

    ...
}

實例化上一類的類(在這種特殊情況下,這可以是服務,但在其他情況下,這是與業務邏輯相關的另一類):


class EndpointService extends Service
{
    ...

    public fetchContent()
    {
        $dataArray = $this->endpoint->fetch();
        $contentArray = array();

        foreach ($dataArray as $key => $value) {
            $content = new Content(array());
            $content->setPicture($value->picture);
            ...
            $contentArray[$key] = $content;
        }
    }
    ...
}

注意 :如果存在邏輯/語法錯誤,請忽略它們,這是一個演示我的問題的示例,並且是與我的代碼庫的遙遠抽象。

我看到了一種方法,可以通過將依賴項validator程序的依賴項傳遞給EndpointService來實現。 然后,您可以將其傳遞給新的Content

class EndpointService extends Service
{
    ...
    public function construct($validator)
    {
        $this->validator = $validator;
    }


    public fetchContent()
    {
        $dataArray = $this->endpoint->fetch();
        $contentArray = array();

        foreach ($dataArray as $key => $value) {
            $content = new Content($this->validator, array());
            $content->setPicture($value->picture);
            ...
            $contentArray[$key] = $content;
        }
    }
    ...
}

class Content extends SomeObject
{
    private $pictureUrl;
    ...

    public __construct($validator, array $array = null)
    {
        $this->validator = $validator;

        parent::__construct($array);
    }

    public setPicture(...\Picture $picture)
    {
        // what's the best way to inject/enable this into my class
        $errors = $this->validator->validate($picture->getUrl());
        ...
        $this->pictureUrl = $picture->getUrl();
    }

    ...
}

在我看來,您的Content是一個模型,驗證應該在EndpointService類中完成。

您可能考慮重構,以便將驗證器注入到EndpointService繼承的Service父類中,如果您不想直接將其注入到EndpointService

class EndpointService extends Service
{
    protected $validator;

    public __construct(Validator $validator) {
        $this->validator = $validator;
    }

    ...

    public fetchContent()
    {
        $dataArray = $this->endpoint->fetch();
        $contentArray = array();

        foreach ($dataArray as $key => $value) {
            $content = new Content(array());
            $errors = $this->validator->validate($value->picture->getUrl());
            $content->setPicture($value->picture);
            ...
            $contentArray[$key] = $content;
        }
    }

    ...
}

並在您的配置中:

// config.yml
services:
    app.endpoint_service:
        class: Acme\DemoBundle\External\EndpointService
        arguments: [@validator]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM