2014-11-18 3 views
1

Я не нашел похожих вопросов/решений Google или в Stackoverflow, поэтому здесь я нуждаюсь в помощи. Я переношу проект PHP из пользовательской структуры в структуру Symfony (v2.5), у которой была запрограммированная инъекция зависимостей (основанная на отражении класса). Многие классы бизнес-логики вводили свойства, и мне интересно, есть ли способ сделать что-то подобное в Symfony, не объявляя эти классы в качестве сервисов, потому что некоторые из классов используются для временного хранения/манипулирования контентом, исходящего из сторонних конечных точек и Мне нужны разные примеры.Symfony2 Dependency Injection для пользовательских/бизнес-классов

Точнее, есть способ использовать Injection Dependency в сочетании с созданием объектов с использованием нового ключевого слова. Поэтому, если мне нужен новый класс, зависящий от регистратора или валидатора, как я могу сделать что-то подобное.

класса

Материалов, которые я хочу, чтобы решить инъекции зависимостей для:


class Content extends SomeObject 
{ 
    private $pictureUrl; 
    ... 

    public __construct(array $array = null) 
    { 
     parent::__construct($array); 
    } 

    public setPicture(...\Picture $picture) 
    { 
     // what's the best way to inject/enable this into my class 
     $errors = $this->get('validator')->validate($picture->getUrl()); 
     ... 
     $this->pictureUrl = $picture->getUrl(); 
    } 

    ... 
} 

Класса, который конкретизирует предыдущий класс (в данном случае это может быть услуга, но есть и другие случаи, когда это другое дело логика связанный класс):


class EndpointService extends Service 
{ 
    ... 

    public fetchContent() 
    { 
     $dataArray = $this->endpoint->fetch(); 
     $contentArray = array(); 

     foreach ($dataArray as $key => $value) { 
      $content = new Content(array()); 
      $content->setPicture($value->picture); 
      ... 
      $contentArray[$key] = $content; 
     } 
    } 
    ... 
} 

Примечание: Если есть логические/синтаксические ошибки, пожалуйста, игнорировать их, это пример, через который я демонстрирую свою проблему, и далекая абстракция из моей базы кода.

ответ

0

Мне кажется, что ваш Content является моделью, и что проверка должна осуществляться в EndpointService классе.

Вы могли бы рассмотреть рефакторинг так, что валидатор может быть введен в Service родительского класса, который наследует от EndpointService, если вы не хотите, чтобы ввести его в EndpointService непосредственно.

class EndpointService extends Service 
{ 
    protected $validator; 

    public __construct(Validator $validator) { 
     $this->validator = $validator; 
    } 

    ... 

    public fetchContent() 
    { 
     $dataArray = $this->endpoint->fetch(); 
     $contentArray = array(); 

     foreach ($dataArray as $key => $value) { 
      $content = new Content(array()); 
      $errors = $this->validator->validate($value->picture->getUrl()); 
      $content->setPicture($value->picture); 
      ... 
      $contentArray[$key] = $content; 
     } 
    } 

    ... 
} 

И в вашей конфигурации:

// config.yml 
services: 
    app.endpoint_service: 
     class: Acme\DemoBundle\External\EndpointService 
     arguments: [@validator] 
+0

Это верный момент, спасибо за это, я продолжу в соответствии с вашими советами. Но что, если я все еще хочу делать инъекцию зависимостей в подобных случаях. Есть ли веские причины для этого, то есть я хочу использовать регистратор или что-то подобное в бизнес-классе, который не является сервисом. P.S. Я хотел бы поддержать вас, но моей репутации недостаточно. Редактировать: accidentaly hit введите до конца комментария. –

+0

Спасибо за отзыв; Я ценю это! Re: впрыскивание в классы без обслуживания ... вы можете рассмотреть возможность расширения этих классов [http://api.symfony.com/2.5/Symfony/Component/DependencyInjection/ContainerAware.html](Container Aware). Не уверен, что это лучшая практика. Что мешает вам сделать эти занятия услугами?Я не понимал, как их статус «временные/удерживающие» объекты мешают этому. –

+0

Ну, не все классы соответствуют парадигме обслуживания, например, класс курсора (для разбивки на страницы) - это то, что я имею в виду, и некоторые классы, которые используются для получения стороннего контента на стороне клиента (подобно объектам, но не будут сохраняются). Я ищу способы решения проекта, поскольку он довольно большой и имеет различную инъекцию зависимости (основанную на размышлении), которая сильно отличается от собственной системы DI Symfony. Как вы сказали, я должен пересмотреть свою архитектуру, и я изменю ее на основе практики Symfony, насколько смогу. Еще раз спасибо! :) –

0

Я вижу один способ, которым вы могли бы это сделать, передав validator depedency на ваш EndpointService через инъекцию зависимости. Затем вы можете передать его новому Content.

class EndpointService extends Service 
{ 
    ... 
    public function construct($validator) 
    { 
     $this->validator = $validator; 
    } 


    public fetchContent() 
    { 
     $dataArray = $this->endpoint->fetch(); 
     $contentArray = array(); 

     foreach ($dataArray as $key => $value) { 
      $content = new Content($this->validator, array()); 
      $content->setPicture($value->picture); 
      ... 
      $contentArray[$key] = $content; 
     } 
    } 
    ... 
} 

class Content extends SomeObject 
{ 
    private $pictureUrl; 
    ... 

    public __construct($validator, array $array = null) 
    { 
     $this->validator = $validator; 

     parent::__construct($array); 
    } 

    public setPicture(...\Picture $picture) 
    { 
     // what's the best way to inject/enable this into my class 
     $errors = $this->validator->validate($picture->getUrl()); 
     ... 
     $this->pictureUrl = $picture->getUrl(); 
    } 

    ... 
} 
+0

Да, но что, если класс не услуга, как бы я решить эту проблему тогда? «Верхний» класс, вероятно, будет сервисом, но хочу ли я передать 5-10 зависимостей вновь созданным классам, чтобы заполнить их зависимости? –

+0

Обычно определяется множество услуг, а затем передаются эти услуги в другую службу. (Yo dawg - слышал, что вам нравятся услуги) –