当前位置: 首页 > 知识库问答 >
问题:

访问控制器中的$this->容器抛出可捕获的致命错误异常?

尹钱青
2023-03-14

我有以下控制器:

namespace Acme\CompanyBundle\Controller;
use Symfony\Component\DependencyInjection\Container;

/**
 * Company controller.
 *
 */
class CompanyController extends Controller
{
    protected $container;

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

    public function getData()
    {
        $userObj = $this->container->get('security.context')->getToken()->getUser();
    }
}

在我的服务中。yml文件,我已经注入了容器类:

parameters:
    acme.controller.company.class:  Acme\ContainerBundle\Controller\CompanyController

services:
    acme.controller.company:
        class:      %acme.controller.company.class%
        arguments:  [@service_container]

加载此控制器时,出现以下错误:

可捕获的致命错误:传递给Acme\CompanyBundle\Controller\CompanyController:的参数1::\uu construct()必须是Symfony\Component\DependencyInjection\Container的实例,未给定,在C:\wamp\www\Symfony\app\cache\dev\classes中调用。php位于第2785行,在C:\wamp\www\symfony\src\Acme\CompanyBundle\Controller\CompanyController中定义。php行。。。

正如您所看到的,这是一个简单的Container对象注入到控制器中的过程,但会抛出很好的错误。这里有什么问题?

类似的问题发布在这里的另一个SO线程中。

共有3个答案

锺离伟彦
2023-03-14

永远不要在某个东西(服务、控制器或其他东西)中注入容器,而是尝试注入securityContext或通过上面建议的symfony控制器的助手方法访问它。

令牌它不是一个对象,只是因为控制器的路由可能不在防火墙下

越骏俊
2023-03-14

默认情况下,路由看起来像这样:

cerad_player_wanabe_list:
    pattern:  /player-request/list
    defaults: 
        _controller: CeradPlayerWanabeBundle:Player/PlayerList:list

Symfony\Component\HttpKernel\HttpKernel::handle($request)方法从请求对象中提取_controller属性。如果属性中有两个冒号,那么它会将属性转换为类名,并使用新操作符创建一个实例。如果实例实现了ContainerWareInterface,那么容器将被注入控制器实例。未使用您定义的控制器服务。因此,没有参数被传递给构造html" target="_blank">函数是错误的。

另一方面,如果_controller只有一个冒号,那么控制器将作为服务从容器中提取。没有检查ContainerWareInterface。由您通过服务定义注入依赖项。

这都记录在:http://symfony.com/doc/current/cookbook/controller/service.html

所以对于这个特殊的问题,你的路线应该是这样的:

cerad_player_wanabe_list:
    pattern:  /player-request/list
    defaults: 
        _controller: acme.controller.company:action

这确实提出了一个问题,即为什么要将控制器定义为服务。默认方法已经完全满足了您的要求,因此您不会得到任何东西。

将服务定义为容器的基本原理是,您可以精确控制控制器使用的依赖关系。使控制器更容易理解和测试。

注入完整的容器几乎破坏了将控制器定义为服务的价值。

葛越泽
2023-03-14

您不需要在控制器中注入容器,只要它们扩展了基本的Controller类,您就可以这样做。

只要做:

namespace Acme\CompanyBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

/**
 * Company controller.
 *
 */
class CompanyController extends Controller
{
    public function getData()
    {
        $userObj = $this->get('security.context')->getToken()->getUser();
    }
}
 类似资料:
  • 我有我的spring错误控制器,我需要获得实际的异常类,这样我就可以打印堆栈跟踪和其他类似的东西。这是我的错误控制器 我知道这不多,但我需要Exception对象能够做一些额外的处理。 感谢任何事先的帮助!

  • 我在进行贝宝支付时出现了经验错误。 致命错误:未捕获异常“PayPal\exception\PayPalConnectionException”,消息为“访问https://api.sandbox.paypal.com/v1/payments/payment时获得Http响应代码400”。在C:\xampp\htdocs\paypal\workload\third_party\vendor\pay

  • 容器访问控制 容器的访问控制,主要通过 Linux 上的 iptables 防火墙来进行管理和实现。iptables 是 Linux 上默认的防火墙软件,在大部分发行版中都自带。 容器访问外部网络 容器要想访问外部网络,需要本地系统的转发支持。在Linux 系统中,检查转发是否打开。 $sysctl net.ipv4.ip_forwardnet.ipv4.ip_forward = 1 如果为 0,

  • 我有这个MVC文件夹结构: 现在,在ProfileController.php中,我有: 在usermodel.php中,我有: 并使用Composer Psr4 I自动加载文件: 现在,当我需要路由我的URL时,我会采取行动: 我看到这个错误: >致命错误:未捕获错误:在C:\XAMPP\HTDOCS\CMS\Application\Catalog\Controller\ProfileContr

  • 在我自制的PHP MVC框架中,我编写了一个小错误处理程序,它将PHP错误包装在异常中,然后抛出它。 然后使用注册。除了致命的错误(没有双关语)之外,这一切都很好。我的自定义错误处理程序仍被调用,但我无法捕获抛出的。 这种错误的一个例子是试图包含一个不存在的文件: 调用我的自定义错误处理程序并抛出异常,但代码永远不会到达“catch”块。相反,PHP会生成HTML(糟糕!): 警告:未捕获异常“E

  • 我得到这个错误。我创建了一个按钮来更新表。当我点击按钮时,我得到一个错误。如何修复它? 致命错误:Uncaught ArgumentCounter错误:函数personel::update_form(),0的参数太少,在C:\xampp\htdocs\warehouse\panel\system\core\CodeIgniter中传递。php在第360行,C:\xampp\htdocs\wareh