当前位置: 首页 > 面试题库 >

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

云曦之
2023-03-14
问题内容

这个问题始于我不理解为什么不能将变量传递给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);

问题答案:

我假设第一个错误(未定义的属性)发生在添加属性和构造函数之前。然后,您得到第二个错误。另一个错误意味着您的构造函数希望接收一个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;
    }


 类似资料:
  • 我在数据库中存储了一个字符串,希望从应用程序中的不同位置访问该字符串。我发现最好的解决方案是创建一个函数,从数据库中获取该字符串并将其注册为服务。 功能: service.yml 其他控制器中的输出: 不幸的是,我不断地 严重-未捕获的PHP异常Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException:“您请求

  • 问题内容: 我运行基于节点映像的Docker容器(Windows的Docker快速入门终端) 我启动节点客户端(在端口3000上)和节点(基于Express)的服务器(在3009 端口上)。客户端通过AJAX调用访问REST服务器。 它可以完美地从主机运行(客户端访问localhost:3009并返回结果)。我可以拨打:3009,然后再次得到正确的结果。 但是当我构建并运行docker image

  • 本文档说明了由服务器核心(core)提供的以实现基本服务器运转的一些指令。 服务器标识 相关模块 相关指令 ServerName ServerAdmin ServerSignature ServerTokens UseCanonicalName UseCanonicalPhysicalPort ServerAdmin和ServerTokens指令控制有关服务器的哪些信息将出现在服务器生成的文档中(

  • 我的工作中有一个活动选择插件,它使用一个groovy脚本将另一个工作区文件夹中的文件夹列为选择。我在Jenkins单节点(没有主从节点)中使用了这个,它正在工作。 现在我已经切换到Jenkins主从服务器架构。由于工作区是从工作区,所以选择不会在作业中列出。请让我知道,如果有任何方式访问从工作在主从的工作区。

  • 我试图从Laravel项目、DBeaver和Artisan访问我的PostgreSQL数据库。从Laravel project或Artisan()访问它总是会导致: 无法连接到服务器:连接被拒绝 服务器是否在主机“127.0.0.1”上运行,并在端口5432上接受TCP/IP连接 因为我不依赖我的Laradock设置,而且我对Laravel也不太熟悉,所以我确实用默认设置重新下载了Laradock

  • 问题内容: 我正在boot2docker 1.3.1下运行。 我有一个Docker容器通过运行Web服务器。 如果我连接到该容器,则可以使用浏览该网站,以便知道服务器正在运行。 我用以下容器运行容器: 它具有以下详细信息: 我以为可以访问,从托管人访问该网站。 这是行不通的。我只是在Chrome中看到“正在连接…”,却一无所获。 我究竟做错了什么? 问题答案: 好吧,愚蠢的我,我在boot2doc