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

时间:2015-01-26 21:30:59

标签: symfony dependency-injection

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

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

我想将ImageWorkshop作为依赖项注入,但我无法弄清楚如何使用静态方法。我知道我可以从我的服务中静态地调用ImageWorkshop,但我试图声明我的依赖项。

2 个答案:

答案 0 :(得分:3)

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

您将$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('...'),则可以将其与班级名称。它不是很有用,因为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的字符串,用于调用静态方法。我希望这应该有效。

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

答案 1 :(得分:0)

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

e.g

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

}

并注入ImageWorkshopWrapper类