ReflectionException: класс не существует после обновления Symfony

После обновления моей версии php с 5.6 до 7.3 и обновления Symfony с 3.4 до 4.4 я получаю исключение ReflectionException каждый раз, когда пытаюсь получить доступ к своему приложению на своем локальном хосте.

    ReflectionException:
    Class WaiverBundle\File does not exist

      at /srv/http/sp7/vendor/jms/metadata/src/MetadataFactory.php:170
      at ReflectionClass->__construct('WaiverBundle\\File')
         (/srv/http/sp7/vendor/jms/metadata/src/MetadataFactory.php:170)
      at Metadata\MetadataFactory->getClassHierarchy('WaiverBundle\\File')
         (/srv/http/sp7/vendor/jms/metadata/src/MetadataFactory.php:76)
      at Metadata\MetadataFactory->getMetadataForClass('WaiverBundle\\File')
         (/srv/http/sp7/vendor/vich/uploader-bundle/src/Metadata/MetadataReader.php:85)
      at Vich\UploaderBundle\Metadata\MetadataReader->getUploadableFields('WaiverBundle\\File')
         (/srv/http/sp7/vendor/vich/uploader-bundle/src/DataCollector/MappingCollector.php:27)
      at Vich\UploaderBundle\DataCollector\MappingCollector->collect(object(Request), object(Response), object(ReflectionException))
         (/srv/http/sp7/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Profiler/Profiler.php:178)
      at Symfony\Component\HttpKernel\Profiler\Profiler->collect(object(Request), object(Response), object(ReflectionException))
         (/srv/http/sp7/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/EventListener/ProfilerListener.php:90)
      at Symfony\Component\HttpKernel\EventListener\ProfilerListener->onKernelResponse(object(ResponseEvent), 'kernel.response', object(TraceableEventDispatcher))
         (/srv/http/sp7/vendor/symfony/symfony/src/Symfony/Component/EventDispatcher/Debug/WrappedListener.php:126)
      at Symfony\Component\EventDispatcher\Debug\WrappedListener->__invoke(object(ResponseEvent), 'kernel.response', object(TraceableEventDispatcher))
         (/srv/http/sp7/vendor/symfony/symfony/src/Symfony/Component/EventDispatcher/EventDispatcher.php:264)
      at Symfony\Component\EventDispatcher\EventDispatcher->doDispatch(array(object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener)), 'kernel.response', object(ResponseEvent))
         (/srv/http/sp7/vendor/symfony/symfony/src/Symfony/Component/EventDispatcher/EventDispatcher.php:239)
      at Symfony\Component\EventDispatcher\EventDispatcher->callListeners(array(object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener)), 'kernel.response', object(ResponseEvent))
         (/srv/http/sp7/vendor/symfony/symfony/src/Symfony/Component/EventDispatcher/EventDispatcher.php:73)
      at Symfony\Component\EventDispatcher\EventDispatcher->dispatch(object(ResponseEvent), 'kernel.response')
         (/srv/http/sp7/vendor/symfony/symfony/src/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php:168)
      at Symfony\Component\EventDispatcher\Debug\TraceableEventDispatcher->dispatch(object(ResponseEvent), 'kernel.response')
         (/srv/http/sp7/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpKernel.php:179)
      at Symfony\Component\HttpKernel\HttpKernel->filterResponse(object(Response), object(Request), 2)
         (/srv/http/sp7/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpKernel.php:167)
      at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), 2)
         (/srv/http/sp7/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpKernel.php:68)
      at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), 2, false)
         (/srv/http/sp7/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/EventListener/ExceptionListener.php:61)
      at Symfony\Component\HttpKernel\EventListener\ExceptionListener->onKernelException(object(ExceptionEvent), 'kernel.exception', object(TraceableEventDispatcher))
         (/srv/http/sp7/vendor/symfony/symfony/src/Symfony/Component/EventDispatcher/Debug/WrappedListener.php:126)
      at Symfony\Component\EventDispatcher\Debug\WrappedListener->__invoke(object(ExceptionEvent), 'kernel.exception', object(TraceableEventDispatcher))
         (/srv/http/sp7/vendor/symfony/symfony/src/Symfony/Component/EventDispatcher/EventDispatcher.php:264)
      at Symfony\Component\EventDispatcher\EventDispatcher->doDispatch(array(object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener)), 'kernel.exception', object(ExceptionEvent))
         (/srv/http/sp7/vendor/symfony/symfony/src/Symfony/Component/EventDispatcher/EventDispatcher.php:239)
      at Symfony\Component\EventDispatcher\EventDispatcher->callListeners(array(object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener)), 'kernel.exception', object(ExceptionEvent))
         (/srv/http/sp7/vendor/symfony/symfony/src/Symfony/Component/EventDispatcher/EventDispatcher.php:73)
      at Symfony\Component\EventDispatcher\EventDispatcher->dispatch(object(ExceptionEvent), 'kernel.exception')
         (/srv/http/sp7/vendor/symfony/symfony/src/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php:168)
      at Symfony\Component\EventDispatcher\Debug\TraceableEventDispatcher->dispatch(object(ExceptionEvent), 'kernel.exception')
         (/srv/http/sp7/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpKernel.php:207)
      at Symfony\Component\HttpKernel\HttpKernel->handleThrowable(object(ReflectionException), object(Request), 1)
         (/srv/http/sp7/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpKernel.php:100)
      at Symfony\Component\HttpKernel\HttpKernel->terminateWithException(object(ReflectionException), object(Request))
         (/srv/http/sp7/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/EventListener/DebugHandlersListener.php:116)
      at Symfony\Component\HttpKernel\EventListener\DebugHandlersListener::Symfony\Component\HttpKernel\EventListener\{closure}(object(ReflectionException))
         (/srv/http/sp7/vendor/symfony/symfony/src/Symfony/Component/ErrorHandler/ErrorHandler.php:592)
      at Symfony\Component\ErrorHandler\ErrorHandler->handleException(object(ReflectionException))                

WaiverBundle\Entity\File.php


    <?php

namespace WaiverBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use AppBundle\Entity\File as BaseFile;

/**
 * This class extends the base file class. Only the mapped entity and table name are different.
 *
 * @ORM\HasLifecycleCallbacks()
 * @ORM\Table(name="waiver_file")
 * @ORM\Entity
 */
class File extends BaseFile {
    /**
     * @ORM\ManyToOne(targetEntity="WaiverBundle\Entity\Waiver", inversedBy="file")
     * @ORM\JoinColumn(name="entity", referencedColumnName="id", nullable=true)
     * @var \WaiverBundle\Entity\Waiver
     **/
    protected $entity;
}
*emphasized text*

AppBundle\Entity\File.php

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * This class defines attachments throughout the application.
 *
 * @ORM\MappedSuperclass
 * @ORM\HasLifecycleCallbacks()
 */
class File {

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * NOTE: This is not a mapped field of entity metadata, just a simple property.
     * It is required for VichUploaderBundle and holds the actual file.
     * DO NOT rename this property since its name is hardcoded in several files.
     *
     * @var Symfony\Component\HttpFoundation\File\File
     * @Assert\File()
     */
    private $attachment;

    /**
     * @var string
     * @ORM\Column(type="string", nullable=false)
     */
    private $filename;

    /**
     * @var DateTime
     * @ORM\Column(type="datetime")
     */
    private $timestamp;

    /**
     * @ORM\ManyToOne(targetEntity="\UserBundle\Entity\User")
     * @ORM\JoinColumn(name="uploader", referencedColumnName="id")
     * @var \UserBundle\Entity\User
     */
    private $uploader;

    // GETTERS/SETTERS ETC.

    /**
     * @ORM\PrePersist
     */
    public function prePersist() {
        // set the timestamp for last update
        date_default_timezone_set('UTC');
        $this->timestamp = new \DateTime("now");
    }

    /**
     * If manually uploading a file (i.e. not using Symfony Form) ensure an instance
     * of 'UploadedFile' is injected into this setter to trigger the  update. If this
     * bundle's configuration parameter 'inject_on_load' is set to 'true' this setter
     * must be able to accept an instance of 'File' as the bundle will inject one here
     * during Doctrine hydration.
     *
     * @param \Symfony\Component\HttpFoundation\File\File|\Symfony\Component\HttpFoundation\File\UploadedFile $file
     *
     * @return File
     */
    public function setAttachment(\Symfony\Component\HttpFoundation\File\File $file = null)
    {
        // store file in file system
        $this->attachment = $file;

        if ($file) {
            // It is required that at least one field changes if you are using doctrine
            // otherwise the event listeners won't be called and the file is lost
            date_default_timezone_set('UTC');
            $this->timestamp = new \DateTime("now");
        }

        return $this;
    }

    /**
     * @return Symfony\Component\HttpFoundation\File\File|null
     */
    public function getAttachment()
    {
        return $this->attachment;
    }

    /**
     * NOTE: This is not a Doctrine getter. It is just a workaround to get the original file name (see issue #319)
     * Cut off filename up to and including the first underscore
     *
     * @return string
     */
    public function getOriginalFilename()
    {
        return substr($this->filename, strpos($this->filename, '_') + 1);
    }

    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set filename
     *
     * @param string $filename
     *
     * @return File
     */
    public function setFilename($filename)
    {
        $this->filename = $filename;

        return $this;
    }

    /**
     * Get filename
     *
     * @return string
     */
    public function getFilename()
    {
        return $this->filename;
    }

    /**
     * Set timestamp
     *
     * @param \DateTime $timestamp
     *
     * @return File
     */
    public function setTimestamp($timestamp)
    {
        $this->timestamp = $timestamp;

        return $this;
    }

    /**
     * Get timestamp
     *
     * @return \DateTime
     */
    public function getTimestamp()
    {
        return $this->timestamp;
    }

    /**
     * Set uploader
     *
     * @param \UserBundle\Entity\User $uploader
     *
     * @return File
     */
    public function setUploader(\UserBundle\Entity\User $uploader = null)
    {
        $this->uploader = $uploader;

        return $this;
    }

    /**
     * Get uploader
     *
     * @return \UserBundle\Entity\User
     */
    public function getUploader()
    {
        return $this->uploader;
    }

    /**
     * Set entity
     *
     * @param \AppBundle\Entity\FileAwareEntity $entity
     *
     * @return File
     */
    public function setEntity(\AppBundle\Entity\FileAwareEntity $entity = null)
    {
        $this->entity = $entity;

        return $this;
    }

    /**
     * Get entity
     *
     * @return \AppBundle\Entity\FileAwareEntity
     */
    public function getEntity()
    {
        return $this->entity;
    }
}

композитор.json

{
    "name": "stefan/sp28",
    "license": "proprietary",
    "type": "project",
    "autoload": {
        "psr-4": {
            "": "src/",
            "AppBundle\\": "src/AppBundle",
            "WaiverBundle\\": "src/WaiverBundle",
            "Mindpool\\LogBundle\\": "vendor/mindpool/logbundle"
        },
        "classmap": [
            "app/AppKernel.php",
            "app/AppCache.php"
        ]
    },
    "require": {
        "php": ">=7.1.3",
        "symfony/symfony": "^4.4.0",
        "doctrine/orm": "^2.7",
        "doctrine/doctrine-bundle": "~1.4",
        "symfony/swiftmailer-bundle": "~3.4",
        "symfony/monolog-bundle": "~3.1",
        "incenteev/composer-parameter-handler": "~2.0",
        "friendsofsymfony/user-bundle": "^2.1.2",
        "twig/twig": "^2.9",
        "salavert/time-ago-in-words": "^1.7.1",

        "stof/doctrine-extensions-bundle": "^1.2",
        "vich/uploader-bundle": "~1.12.1",
        "knplabs/knp-paginator-bundle": "^5.0",
        "mgilet/notification-bundle": "^3.1",

        "php-translation/symfony-bundle": "^0.6.1",
        "friendsofsymfony/elastica-bundle": "5.1",
        "ruflin/elastica": "^6",
        "friendsofsymfony/ckeditor-bundle": "^1.1",
        "paragonie/random_compat": "~2.0.18",
        "pagerfanta/pagerfanta": "^1.1",
        "harvesthq/chosen": "^1.8",

        "symfony/cache": "^4.0",
        "symfony/config": "^4.0",
        "symfony/console": "^4.0",
        "symfony/debug": "^4.0",
        "symfony/dependency-injection": "^4.0",
        "symfony/dotenv": "^4.0",
        "doctrine/annotations": "^1.8",
        "twig/extensions": "^1.5",
        "sensio/framework-extra-bundle": "^5.5",
        "jms/metadata": "^2.1"
    },
    "require-dev": {
        "symfony/phpunit-bridge": "^3.0"
    },
    "scripts": {
        "post-install-cmd": [
            "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::prepareDeploymentTarget"
        ],
        "post-update-cmd": [
            "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::prepareDeploymentTarget"
        ],
        "reset-bootstrap-cmd": [
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap"
            ]
    },
    "config": {
        "bin-dir": "bin",
        "platform": {
            "php": "7.3"
        }
    },
    "extra": {
        "symfony-app-dir": "app",
        "symfony-web-dir": "web",
        "symfony-assets-install": "relative",
        "incenteev-parameters": {
            "file": "app/config/parameters.yml"
        },
        "symfony": {
            "allow-contrib": false,
            "require": "4.4.*"
        }
    }
}

Я не вносил никаких изменений в используемые файлы, и WaiverBundle\File все еще существует в каталоге «WaiverBundle\Entity\File». Я также удалил кеш и перезапустил веб-сервер, но все равно получаю сообщение об ошибке. Я подозреваю, что это может быть как-то связано с используемым мной VichUploaderBundle, но я не вносил в него никаких изменений в процессе обновления.

Кто-нибудь знает, как избавиться от этой ошибки?


person Vinc    schedule 02.01.2020    source источник


Ответы (1)


Вы сами ответили на свой вопрос.

[…] WaiverBundle\File все еще существует в каталоге «WaiverBundle\Entity\File».

Это не одно и то же, из трассировки видно, что у вас есть аннотация, относящаяся к WaiverBundle\File вместо WaiverBundle\Entity\File.

person Chris Smith    schedule 03.01.2020
comment
Я искал любую аннотацию, относящуюся к WaiverBundle\File, но не нашел. У вас есть другие идеи, откуда могла появиться моя ошибка? - person Vinc; 03.01.2020
comment
у вас есть файл в WaiverBundle\Entity\File, но использование его с пространством имен auf WaiverBundle\File выглядит очень странно. Также вручную удалите var/cache/* (c:c не всегда работает в сочетании с метаданными или другими плагинами кэширования — также убедитесь, что вы перезапустили fpm) - person Rufinus; 04.01.2020
comment
@Vinc, если вам случится перезаписать класс, вам нужно обновить зависимости и т. д., поэтому вы всегда должны REFACTOR вместо удаления. Руфинус, пожалуйста, решите, хотите ли вы говорить по-немецки или по-инклиш :D - person clockw0rk; 04.08.2020