Как создать php-сервис для Symfony 2 & 3 с помощью диспетчера сущностей и контейнера служб

Для php-разработчика, не являющегося фреймворком, все так просто, как использовать require_once в php-файл, который мы хотим включить в наш файл кода, однако нам нужно будет написать эту строку в каждом файле, в котором нам нужен наш php-файл. В Symfony 2 3 когда нам нужно внедрить такой файл, нам нужно создать службу Symfony, это будет доступно для всех контроллеров в нашем проекте.

Сервис — это любой объект PHP, который выполняет какую-то «глобальную» задачу. Это целенаправленное имя для описания объекта, созданного для определенной цели (например, для доставки электронной почты). Каждый сервис используется в вашем приложении всякий раз, когда вам нужны конкретные функции, которые он предоставляет. Вам не нужно делать ничего особенного, чтобы создать сервис: просто напишите класс PHP с некоторым кодом, который выполняет определенную задачу.

1. Создайте папку Extensions

Чтобы создать специальный сервис, нам нужно создать папку, в которой будет содержаться наш класс, внутри нашего контейнера, например: /app/src/ourcodeworld папка, эта папка содержит больше пакета внутри, поэтому, как организационная вещь, мы собираемся создать Extensions папка внутри него.

2. Создайте класс обслуживания

Теперь мы создадим класс, который будет содержать наш сервис (он получит в качестве параметров в конструкторе, менеджере сущностей и контейнере сервиса, а затем я объясню, как это будет внедрено), и мы вызовем класс (и файл ) OCWServices.php например (измените имя, если хотите, и измените имя класса):

Замечания: функции внутри класса OCWServices не предназначены для работы в первый раз, они всего лишь пример, поскольку они используют введенные зависимости. Удалите их при реализации.

em = $entityManager;
$this->container = $container;
}
/**
* Find an user by role
*
* @PLEASE DELETE; THIS IS JUST AN EXAMPLE
* @note We use the entity manager (Doctrine injected in our constructor)
* @param string $role
* @return entities
*/
public function findUsersByRole($role) {
$qb = $this->em->createQueryBuilder();
$qb->select('u')
->from('mybundleBundle:User', 'u')
->where('u.roles LIKE :roles')
->setParameter('roles', '%"' . $role . '"%');
return $qb->getQuery()->getResult();
}
/**
* Example of how to retrieve another service within a service.
* we request a pdf service that we can retrieve thanks to the container injected in the constructor
*
* @PLEASE DELETE; THIS IS JUST AN EXAMPLE
* @param type $html
*/
public function createPDF($html = ""){
$pdf = $this->container->get("myimaginary.pdfclass");
$pdf->create('vertical', PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
$pdf->generate();
}
}

Этот класс содержит 2 функции, которые объясняют, как использовать контейнер служб и менеджер сущностей, введенный с помощью конструктора. Теперь, если вы знали, мы только что отправили 2 переменные в конструктор класса (диспетчер сущностей и сервисный контейнер). Нам нужно как-то отправить эти 2 переменные, иначе наше приложение вылетит.

3. Зарегистрируйте услугу

Перейти к services.yml файл (находится в /app/config/services.yml), и мы собираемся зарегистрировать наш сервис следующим образом:

# Learn more about services, parameters and containers at
# http://symfony.com/doc/current/book/service_container.html
parameters:
#    parameter_name: value
services:
#    service_name:
#        class: AppBundle\Directory\ClassName
#        arguments: ["@another_service_name", "plain_value", "%parameter_name%"]
#register our custom service with a name in this case OCWServices
OCWServices:
# The namespace with the name of the class that contain our service
class: ourcodeworld\Extensions\OCWServices
#The services that we will inject (see the constructor)
arguments: [ "@doctrine.orm.entity_manager" , "@service_container" ]

Теперь из наших контроллеров мы сможем получить наш сервис следующим образом (не забудьте очистить кеш)

get('OCWServices'); // the name given in the settings.yml
//Call any of the methods in it
//$myservice->createPDF();
$myservice->myMethod();
}

Повеселись !

Ссылка на основную публикацию
Adblock
detector