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
我正在创建一个使用 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