如何使用实体管理器和服务容器为symfony 2和3创建php服务

本文概述

  • 1.创建扩展文件夹
  • 2.创建服务类
  • 3.注册服务
【如何使用实体管理器和服务容器为symfony 2和3创建php服务】对于非框架的php开发人员而言, 事情如此简单, 只需对我们要包含在代码文件中的php文件使用require_once即可, 但是我们需要在需要php文件的每个文件中编写此行。在symfony 2和3中, 当我们需要注入这样的文件时, 我们需要创建一个symfony服务, 这在我们项目中的所有控制器中都是可以访问的。
服务是执行某种” 全局” 任务的任何PHP对象。这是一个有目的的通用名称, 用于描述为特定目的(例如, 发送电子邮件)而创建的对象。每当你需要应用程序提供的特定功能时, 便会在整个应用程序中使用每种服务。你无需做任何特殊的事情来提供服务:只需编写一个PHP类, 其中包含一些可以完成特定任务的代码。
1.创建扩展文件夹要创建特殊服务, 我们需要创建一个文件夹, 该文件夹将在我们的容器包中包含我们的类, 例如:给定/ app / src / ourcodeworld文件夹, 此文件夹在其中包含更多包, 因此, 作为一个组织, 我们将在其中创建扩展文件夹。
2.创建服务类现在, 我们将创建一个包含服务的类(它将在构造器, 实体管理器和服务容器中作为参数接收, 然后我将解释如何将其注入), 并将调用该类(和文件) ), 例如OCWServices.php(如果需要, 可以更改名称, 也可以更改类名称):
注意:OCWServices类内部的功能并非第一次使用, 它们只是一个示例, 因为它们使用注入的依赖项。实施时将其删除。
< ?php// /app/src/ourcodeworld/Extensions/OCWServices.php// Don't forget to change the namespace acording to the path and the parent bundle.namespace ourcodeworld\Extensions; // don't forget the namespaces too !use Doctrine\ORM\EntityManager; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\Config\Definition\Exception\Exception; use Symfony\Component\DependencyInjection\Container; // This will be the name of the class and the fileclass OCWServices{protected $em; private $container; // We need to inject this variables later.public function __construct(EntityManager $entityManager, Container $container){$this-> 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.htmlparameters:#     parameter_name: valueservices:#     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" ] 

现在, 从我们的控制器中, 我们将能够像这样检索我们的服务(不要忘记清除缓存)
< ?phppublic function indexAction(){$myservice = $this-> get('OCWServices'); // the name given in the settings.yml//Call any of the methods in it//$myservice-> createPDF(); $myservice-> myMethod(); }

玩得开心 !

    推荐阅读