本文概述
- 1.创建扩展文件夹
- 2.创建服务类
- 3.注册服务
服务是执行某种” 全局” 任务的任何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();
}
玩得开心 !
推荐阅读
- ?什么是polyfill()
- 使用Shopware Profiler以正确的方式调试和分析Shopware
- 如何在WinForms中使用C#使用SharpZipLib创建和提取zip文件(压缩和解压缩zip)
- 如何在TCPDF中实现自定义字体
- 检查已签名的用户在Symfony 2和3中是否具有特定角色
- 如何使用TCPDF在PDF上添加水印
- 在WinForms中使用EasyTabs创建具有Chrome样式选项卡的C#应用??程序
- 使用C#在Windows 10(控制中心样式)中创建通知
- CS201 分配