Это идеальный случай использования для обслуживания заводов.
Вы объявляете свой $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
услугу в свой сервис в качестве аргумента службы.
EDIT: Если вам нужна 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
Моя единственная проблема состоит в том, что я не буду знать путь изображения, переданного initFromPath в момент инъекции. Это необходимо установить при вызове службы, например $ myImageWorkshopService-> init ($ myfile) –
В этом случае используйте решение @wonde. Но я не думаю, что есть смысл добавить еще один уровень сложности. Попытка обмена другим графическим процессором в лучшем случае будет проблематичной. – Cerad
Вы правы, возможно, просто используйте его статически в моем сервисе. –