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