本文概述
对于非框架的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 file
class 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.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" ]
现在, 从我们的控制器中, 我们将能够像这样检索我们的服务(不要忘记清除缓存)
<?php
public function indexAction(){
$myservice = $this->get('OCWServices'); // the name given in the settings.yml
//Call any of the methods in it
//$myservice->createPDF();
$myservice->myMethod();
}
玩得开心 !
评论前必须登录!
注册