首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在symfony2全局助手函数(服务)中访问服务容器?

如何在symfony2全局助手函数(服务)中访问服务容器?
EN

Stack Overflow用户
提问于 2012-08-21 21:40:27
回答 5查看 87.7K关注 0票数 54

这个问题一开始我不明白为什么我不能将变量传递给symfony2全局助手函数(服务),但多亏了比我聪明的人,我意识到我的错误是试图从一个没有注入security_context的类中使用它。

这是最终的结果,也就是可以工作的代码。我找不到更好的方法让这对社区有帮助。

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

我有以下类和函数:

代码语言:javascript
复制
<?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
    }     
}

...defined作为服务(在app/config/config.yml中),如下所示...

代码语言:javascript
复制
#Registering my global helper functions            
services:
  biztv.helper.globalHelper:
    class: BizTV\CommonBundle\Helper\globalHelper
    arguments: ['@service_container']

现在,在我的控制器中,我像这样调用这个函数...

代码语言:javascript
复制
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);
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-08-21 22:26:43

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

代码语言:javascript
复制
services:
  biztv.helper.globalHelper:
    class: BizTV\CommonBundle\Helper\globalHelper
    arguments: ['@service_container']

然后,构造函数应为Symfony\Component\DependencyInjection\ContainerInterface;类型的对象

代码语言:javascript
复制
use Symfony\Component\DependencyInjection\ContainerInterface as Container;

class globalHelper {    

    private $container;

    public function __construct(Container $container) {
        $this->container = $container;
    }
票数 85
EN

Stack Overflow用户

发布于 2014-04-02 05:40:58

一种始终有效的方法,尽管它不是面向对象的最佳实践

代码语言:javascript
复制
global $kernel;
$assetsManager = $kernel->getContainer()->get('acme_assets.assets_manager');‏
票数 25
EN

Stack Overflow用户

发布于 2015-10-24 21:37:26

另一种选择是扩展ContainerAware:

代码语言:javascript
复制
use Symfony\Component\DependencyInjection\ContainerAware;

class MyService extends ContainerAware
{
    ....
}

它允许您在服务声明中调用setContainer

代码语言:javascript
复制
foo.my_service:
    class: Foo\Bundle\Bar\Service\MyService
    calls:
        - [setContainer, [@service_container]]

然后,您可以在服务中引用容器,如下所示:

代码语言:javascript
复制
$container = $this->container;
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12056178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档