一尘不染

如何在symfony2全局帮助器功能(服务)中访问服务容器?

php

这个问题始于我不理解为什么不能将变量传递给symfony2全局帮助器函数(服务)的原因,但是由于比我聪明的人,我意识到我的错误是关于试图从没有使用该类的类中使用security_context。没有注射吗…

这是最终结果,该代码有效。我发现没有更好的方法可以使此方法对社区有所帮助。

这是从symfony2的全局函数或帮助函数中从security_context获取用户和其他数据的方法。

我有以下类和函数:

<?php
namespace BizTV\CommonBundle\Helper;

use Symfony\Component\DependencyInjection\ContainerInterface as Container;

class globalHelper {

private $container;

public function __construct(Container $container) {
    $this->container = $container;
}

    //This is a helper function that checks the permission on a single container
    public function hasAccess($container)
    {
        $user = $this->container->get('security.context')->getToken()->getUser();

        //do my stuff
    }     
}

…定义为这样的服务(在app / config / config.yml中)…

#Registering my global helper functions            
services:
  biztv.helper.globalHelper:
    class: BizTV\CommonBundle\Helper\globalHelper
    arguments: ['@service_container']

现在,在控制器中,我像这样调用此函数…

public function createAction($id) {

    //do some stuff, transform $id into $entity of my type...

    //Check if that container is within the company, and if user has access to it.
    $helper = $this->get('biztv.helper.globalHelper');
    $access = $helper->hasAccess($entity);

阅读 212

收藏
2020-05-29

共1个答案

一尘不染

我假设第一个错误(未定义的属性)发生在添加属性和构造函数之前。然后,您得到第二个错误。另一个错误意味着您的构造函数希望接收一个Container对象,但什么也没收到。这是因为在定义服务时,您没有告诉依赖注入管理器您想要获取容器。将您的服务定义更改为此:

services:
  biztv.helper.globalHelper:
    class: BizTV\CommonBundle\Helper\globalHelper
    arguments: ['@service_container']

然后,构造函数应该期望一个对象类型为Symfony \ Component \ DependencyInjection \
ContainerInterface;

use Symfony\Component\DependencyInjection\ContainerInterface as Container;

class globalHelper {

    private $container;

    public function __construct(Container $container) {
        $this->container = $container;
    }
2020-05-29