2015-01-26 2 views
0

Я создаю службу, которая использует ImageWorkshop. Для того, чтобы INIT новый образ, мне нужно позвонить:Symfony2 - ввод статического класса в сервисы (ImageWorkshop)

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

Я хотел бы, чтобы придать ImageWorkshop как зависимость, но я не могу понять, как сделать это, так как он использует статические методы. Я знаю, что могу просто вызвать ImageWorkshop статически из моей службы, но я пытаюсь объявить свои зависимости.

ответ

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 услугу в свой сервис в качестве аргумента службы.

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

+0

Моя единственная проблема состоит в том, что я не буду знать путь изображения, переданного initFromPath в момент инъекции. Это необходимо установить при вызове службы, например $ myImageWorkshopService-> init ($ myfile) –

+1

В этом случае используйте решение @wonde. Но я не думаю, что есть смысл добавить еще один уровень сложности. Попытка обмена другим графическим процессором в лучшем случае будет проблематичной. – Cerad

+0

Вы правы, возможно, просто используйте его статически в моем сервисе. –

0

Я хотел бы создать класс-оболочку и реализовать статические методы класса в нем

например

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

} 

и впрыснуть ImageWorkshopWrapper класс

Смежные вопросы