Не могу объявить класс Symfony 3 - PullRequest
1 голос
/ 20 сентября 2019

Я получил небольшую ошибку при попытке реализовать сервис 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 "при чтении заголовка ответа из апстрима Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2019

Обязательно создайте файл 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

0 голосов
/ 20 сентября 2019

все сводится к магии автозагрузки.Магия автозагрузки предполагает определенную структуру каталогов, которая (среди прочего) определена в 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\Event и MaintenanceListener соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...