我正在创建一个使用ImageWorkshop的服务。为了初始化新图像,我需要调用:
$layer = ImageWorkshop::initFromPath(__DIR__.'/../path/to/myimage.jpg');
我想将ImageWorkshop作为依赖项注入,但我无法弄清楚如何使用静态方法。我知道我可以从我的服务中静态地调用ImageWorkshop,但我试图声明我的依赖项。
答案 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类