个性化阅读
专注于IT技术分析

如何使用实体管理器和服务容器为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 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();
}

玩得开心 !

赞(0)
未经允许不得转载:srcmini » 如何使用实体管理器和服务容器为symfony 2和3创建php服务

评论 抢沙发

评论前必须登录!