具有唯一实例的 Symfony2 服务 [英] Symfony2 Service with an unique instance

查看:37
本文介绍了具有唯一实例的 Symfony2 服务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请我需要帮助:

我有以下服务:

services.yml 中的服务配置

SERVICE CONFIGURATION IN services.yml

服务:

xpad.producto_repository:
     class: Xpad\ProductoBundle\Entity\ProductRepository
     factory_service: doctrine.orm.clientes_entity_manager
     factory_method: getRepository
     arguments:
         - Xpad\ProductoBundle\Entity\Product


backend_cliente.producto_filters:
     class: Xpad\BackendClienteBundle\Filters\ProductFilters
     calls:
         - [setRepository, ["@xpad.producto_repository="]]
     scope: container

backend_cliente.producto_filters 的类是:

AND THE CLASS FOR backend_cliente.producto_filters IS:

namespace Xpad\BackendClienteBundle\Filters;

use Xpad\ProductoBundle\Entity\ProductRepository;

class ProductFilters
{
    private $_queryBuilder;


    public function getQueryBuilder()
    {
        return $this->_queryBuilder;
    }

    public function setQueryBuilder($queryBuilder)
    {
        $this->_queryBuilder = $queryBuilder;
    }

    public function setRepository(ProductRepository $productRepository = null)
    {
        if($this->_queryBuilder == null)
        {
            $this->_queryBuilder = $productRepository->createQueryBuilder('p');
        }
    }
}

并且我在我的一个控制器中执行以下操作:

AND I HAVE THE FOLLOWING ACTION IN ONE OF MY CONTROLLERS:

class ProductController extends Controller
{ 
 ............
    public function indexAction(Request $request)
    {
      //SOME CODE

       $service_filter = $this->container->get('backend_cliente.producto_filters');
       $queryBuilder = $service_filter->getQueryBuilder();

      //SOME OTHER CODE
    }

我的问题是:每次执行 indexAction 时,我都会获得一个 backend_cliente.producto_filters 服务的新实例,但我不知道为什么.我需要一个唯一的实例,因为它有 $_queryBuilder ATRIBUTTE,我需要获取它的值,只需在需要时修改它的值;

MY PROBLEM IS: ANYTIME THAT THE indexAction is execute I GOT A NEW INSTANCE OF backend_cliente.producto_filters SERVICE AND I DON'T KNOW WHY. I NEED AND UNIQUE INSTANCE AS A SINGLETON BECAUSE A HAVE THE $_queryBuilder ATRIBUTTE AND I NEED TO GET THE VALUE OF IT JUST MODIFY ITS VALUE WHEN IS NEEDED;

请帮助我知道我做错了什么.

PLEASE HELP I DON KNOW WHAT I'M DOING WRONG.

推荐答案

您必须将类用作服务吗?

Do you have to use the class as a service?

为什么不使用单例而不使用服务?像这样:

Why don't you use a Singleton, without using a service? Like this:

namespace Xpad\BackendClienteBundle\Filters;

use Xpad\ProductoBundle\Entity\ProductRepository;

class ProductFilters { 
    private $_queryBuilder;
    private static $reference = null;

    public function getInstance(){
        if (self::$reference === null)
            self::$reference = new ProductFilters();
        return self::$reference;
    }

    private function __construct(){}

    public function getQueryBuilder()
    {
        return $this->_queryBuilder;
    }

    public function setQueryBuilder($queryBuilder)
    {
        $this->_queryBuilder = $queryBuilder;
    }

    public function setRepository(ProductRepository $productRepository = null)
    {
        if($this->_queryBuilder == null)
        {
            $this->_queryBuilder = $productRepository->createQueryBuilder('p');
        }

    }
}

并调用它:

...
$filter = ProductFilters::getInstance();
...

这篇关于具有唯一实例的 Symfony2 服务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆