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

Symfony2 - inject static class into service (ImageWorkshop)

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

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

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

我会创建一个包装器 class 并在其中实现静态 class 方法

例如

Class ImageWorkshopWrapper
{
  public function initFromPath($path)
  {
    ImageWorkshop::initFromPath($path);
  }

}

并注入 ImageWorkshopWrapper class

这是服务工厂的完美用例。

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

services:
    myimage_layer:
        class:   PHPImageWorkshop\Core\ImageWorkshopLayer
        factory_class: PHPImageWorkshop\ImageWorkshop
        factory_method: initFromPath
        arguments:
            - "%kernel.root_dir%/../path/to/myimage.jpg"

现在您可以将 myimage_layer 服务作为服务参数注入到您的服务中。

编辑: 如果你需要 ImageWorkshop 直接调用它们,但又不想在你的代码中直接写 ImageWorkshop::initFromPath('...'),你可以将其与 class 名称分离。它不是很有用,因为 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 的完全限定 class 名称的字符串,用于调用其上的静态方法。我希望这会奏效。

对包含 class 名称的字符串变量调用静态方法的参考:http://php.net/manual/en/language.oop5.static.php#example-214