【问题标题】:Can't declare class symfony 3无法声明类 symfony 3
【发布时间】:2019-09-20 14:28:00
【问题描述】:

我在尝试实现 MaintenanceListener 服务时遇到了一点错误,该服务将显示维护页面 这是我的 services.yml

# https://symfony.com/doc/current/service_container.html
services:
    # default configuration for services in *this* file
    _defaults:
        # automatically injects dependencies in your services
        autowire: true
        # automatically registers your services as commands, event subscribers, etc.
        autoconfigure: true
        # this means you cannot fetch services directly from the container via $container->get()
        # if you need to do this, you can override this setting on individual services
        public: false

    # makes classes in Cocorico\CoreBundle\DataFixtures\ORM\ available to be used as services
    # this creates a service per class whose id is the fully-qualified class name

#    Cocorico\CoreBundle\DataFixtures\ORM\:
#        resource: '../../src/Cocorico/CoreBundle/DataFixtures/ORM/*'


    # makes classes in src/AppBundle available to be used as services
    # this creates a service per class whose id is the fully-qualified class name
    AppBundle\:
        resource: '../../src/AppBundle/*'
        # you can exclude directories or files
        # but if a service is unused, it's removed anyway
        exclude: '../../src/AppBundle/{Entity,Repository,Tests,Event}'

    # controllers are imported separately to make sure they're public
    # and have a tag that allows actions to type-hint services
#    AppBundle\Controller\:
#        resource: '../../src/AppBundle/Controller'
#        public: true
#        tags: ['controller.service_arguments']

    # add more services, or override services that need manual wiring
    # AppBundle\Service\ExampleService:
    #     arguments:
    #         $someArgument: 'some_value'
    maintenance_listener:
        class: AppBundle\Event\MaintenanceListener
        arguments:
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }```

这是我的课:

<?php


namespace MListener;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpFoundation\Response;

class MListener
{
    public function onKernelRequest(GetResponseEvent $event)
    {
        $event->setResponse(new Response('Iziparty is in maintenance mode', Response::HTTP_SERVICE_UNAVAILABLE));
        $event->stopPropagation();
    }
}

这是我得到的错误: FastCGI 在 stderr 中发送:“PHP 消息:PHP 致命错误:无法声明类 MListener\MListener,因为该名称已在 /var/www/Symfony/src/AppBundle/Event/MaintenanceListener.php 第 9 行中使用”,同时阅读来自上游的响应头 感谢您的帮助。

【问题讨论】:

    标签: php symfony


    【解决方案1】:

    这一切都归结为自动加载魔法。自动加载魔法假设了一个特定的目录结构,即(除其他外)在 composer.json 中定义。它基本上说:

    命名空间AppBundle\...在目录src/AppBundle/...

    因此每个班级AppBundle\Something\Else 都位于src/AppBundle/Something/Else.php

    现在,symfony 开始加载应该处理事件(由于您的配置)AppBundle\Event\MaintenanceListener 的服务,它试图实例化它,这导致自动加载器加载文件 src/AppBundle/Event/MaintenanceListener.php,它只包含类MListener/MListener

    由于自动加载有点麻烦,通常,它会尝试其他方法/定义,并可能再次尝试读取该文件,然后它将无法重新声明 MListener/MListener 类,因为它已经存在。

    明确一点:如果遵循标准(在这种情况下特别是 PSR-4),这些方法非常有效,它将目录结构绑定到命名空间结构。如果您将某些内容放入一个文件中,根据 PSR-4,该文件不属于该文件,您会遇到问题,就像您遇到的问题一样。

    修复很简单明了:命名空间是目录(使用反斜杠而不是您的操作系统具有的任何目录分隔符),文件名是类名(显然没有 .php)。因此,要么将文件重命名为 src/MListener/MListener.php 并相应地调整 services.yaml:MListener\Mlistener: ... 要么将该文件中的命名空间和类分别重命名为 AppBundle\EventMaintenanceListener

    【讨论】:

      【解决方案2】:

      一定要创建文件 src/Event/MaintenanceListener.php

      <?php
      
      namespace AppBundle\Event;
      
      use Symfony\Component\HttpKernel\Event\GetResponseEvent;
      use Symfony\Component\HttpFoundation\Response;
      
      class MaintenanceListener
      {
          public function onKernelRequest(GetResponseEvent $event)
          {
              $event->setResponse(new Response('Iziparty is in maintenance mode', Response::HTTP_SERVICE_UNAVAILABLE));
              $event->stopPropagation();
          }
      }
      

      在service.yaml文件中声明同名

      【讨论】:

        猜你喜欢
        • 2016-07-09
        • 2023-03-21
        • 2015-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多