Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony2-将静态类注入服务(ImageWorkshop)_Symfony_Dependency Injection - Fatal编程技术网

Symfony2-将静态类注入服务(ImageWorkshop)

Symfony2-将静态类注入服务(ImageWorkshop),symfony,dependency-injection,Symfony,Dependency Injection,我正在创建一个使用ImageWorkshop的服务。为了初始化新映像,我需要调用: $layer = ImageWorkshop::initFromPath(__DIR__.'/../path/to/myimage.jpg'); 我想将ImageWorkshop作为依赖项注入,但我不知道如何实现,因为它使用静态方法。我知道我可以从我的服务静态调用ImageWorkshop,但我正在尝试声明我的依赖项。我将创建一个包装类并在其中实现静态类方法 e、 g 并注入ImageWorkshopWrapp

我正在创建一个使用ImageWorkshop的服务。为了初始化新映像,我需要调用:

$layer = ImageWorkshop::initFromPath(__DIR__.'/../path/to/myimage.jpg');

我想将ImageWorkshop作为依赖项注入,但我不知道如何实现,因为它使用静态方法。我知道我可以从我的服务静态调用ImageWorkshop,但我正在尝试声明我的依赖项。

我将创建一个包装类并在其中实现静态类方法

e、 g


并注入ImageWorkshopWrapper类,这是服务工厂的完美用例

$layer
声明为服务,并在服务容器中使用静态工厂方法创建它

services:
    myimage_layer:
        class:   PHPImageWorkshop\Core\ImageWorkshopLayer
        factory_class: PHPImageWorkshop\ImageWorkshop
        factory_method: initFromPath
        arguments:
            - "%kernel.root_dir%/../path/to/myimage.jpg"
现在,您可以将
myimage\u层
服务作为服务参数注入到您的服务中

编辑:如果需要直接调用
ImageWorkshop
,但不想直接在代码中编写
ImageWorkshop::initFromPath(“…”)
,可以将其与类名解耦。它不是很有用,因为
ImageWorkshop
不能直接替换,但它有助于在测试中模拟

services:
    myimage_whatever:
        class:   Acme\Bundle\AcmeBundle\Image\Whatever
        arguments:
            - "PHPImageWorkshop\\ImageWorkshop"
您的服务:

namespace Acme\Bundle\AcmeBundle\Image;

class Whatever
{
    private $imageWorkshop;

    public function __construct($imageWorkshop)
    {
        $this->imageWorkshop = $imageWorkshop;
    }

    public function doWhatever($path)
    {
        $layer = $this->imageWorkshop::initFromPath($path);
        // ...
    }
 }
小心你自己,
$imageWorkshop
不是一个例子。相反,它是一个字符串,包含完全限定的类名
ImageWorkshop
,用于对其调用静态方法。我希望这能奏效


对包含类名的字符串变量调用静态方法的参考:

我唯一的问题是,我不知道在注入时传递给initFromPath的映像的路径。这需要在服务调用中设置,例如$myImageWorkshopService->init($myfile)。在这种情况下,使用@wonde的解决方案。但我认为增加另一层复杂性并没有多大意义。尝试在中交换不同的图像处理器最多也会有问题。你是对的,不妨在我的服务中静态使用它。@StevenMusumeche请查看我的编辑,我希望这可能有用。
namespace Acme\Bundle\AcmeBundle\Image;

class Whatever
{
    private $imageWorkshop;

    public function __construct($imageWorkshop)
    {
        $this->imageWorkshop = $imageWorkshop;
    }

    public function doWhatever($path)
    {
        $layer = $this->imageWorkshop::initFromPath($path);
        // ...
    }
 }