Фатальная ошибка symfony2 Невозможно повторно объявить класс

Хорошо, я занимаюсь этим уже два часа и вижу, что у некоторых других людей была эта ошибка, но я не могу сопоставить их причины/решения с моими.

Неустранимая ошибка: require() [function.require]: невозможно повторно объявить класс companycontroller в /var/www/biztv_symfony/vendor/symfony/src/Symfony/Component/ClassLoader/DebugUniversalClassLoader.php в строке 55.

Терминал дает лучшее сообщение об ошибке, указывающее мне на конечное предложение фактического класса, с которым он сообщает о проблемах (попытка повторного объявления).

Если я удалю или переименую файл companyController.php, он выдаст ошибку Symfony2, в которой говорится, что он искал класс, но не нашел его там, где ожидалось.

Если я верну файл на место, apache выдает ошибку php о том, что класс companyController не может быть переобъявлен.

У меня только один раз?!

Вот весь класс... если у кого-то хватит терпения попытаться мне помочь...

<?php

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

use BizTV\BackendBundle\Entity\company;
use BizTV\BackendBundle\Form\companyType;

/**
 * company controller
 *
 */

class companyController extends Controller
{
    /**
     * Lists all company entities.
     *
     */
    public function indexAction()
    {
        $em = $this->getDoctrine()->getEntityManager();

        $entities = $em->getRepository('BizTVBackendBundle:company')->findAll();

        return $this->render('BizTVBackendBundle:company:index.html.twig', array(
            'entities' => $entities
        ));
    }

    /**
     * Finds and displays a company entity.
     *
     */
    public function showAction($id)
    {
        $em = $this->getDoctrine()->getEntityManager();

        $entity = $em->getRepository('BizTVBackendBundle:company')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find company entity.');
        }

        $deleteForm = $this->createDeleteForm($id);

        return $this->render('BizTVBackendBundle:company:show.html.twig', array(
            'entity'      => $entity,
            'delete_form' => $deleteForm->createView(),

        ));
    }

    /**
     * Displays a form to create a new company entity.
     *
     */
    public function newAction()
    {
        $entity = new company();
        $form   = $this->createForm(new companyType(), $entity);

        return $this->render('BizTVBackendBundle:company:new.html.twig', array(
            'entity' => $entity,
            'form'   => $form->createView()
        ));
    }

    /**
     * Creates a new company entity.
     *
     */
    public function createAction()
    {
        $entity  = new company();
        $request = $this->getRequest();
        $form    = $this->createForm(new companyType(), $entity);
        $form->bindRequest($request);

        if ($form->isValid()) {
            $em = $this->getDoctrine()->getEntityManager();
            $em->persist($entity);
            $em->flush();

            /* Create adminuser for this company to go along with it */
            $userManager = $this->container->get('fos_user.user_manager');
            $user = $userManager->createUser();

            //make password (same as username)
            $encoder = $this->container->get('security.encoder_factory')->getEncoder($user); //get encoder for hashing pwd later
            $tempPassword = $entity->getCompanyName(); //set password to equal company name

            //Get company
            $tempCompanyId = $entity->getId(); //get the id of the just-inserted company (so that we can retrieve that company object below for relating it to the user object later)
            $tempCompany = $em->getRepository('BizTVBackendBundle:company')->find($tempCompanyId); //get the company object that this admin-user will belong to

            $user->setUsername($entity->getCompanyName() . "/admin"); //set username to $company/admin
            $user->setEmail('admin.'.$entity->getCompanyName().'@example.com'); //set email to non-functioning (@example)
            $user->setPassword($encoder->encodePassword($tempPassword, $user->getSalt())); //set password with hash
            $user->setCompany($tempCompany); //set company for this user            
            $user->setConfirmationToken(null); //we don't need email confirmation of account
            $user->setEnabled(true); //without a confirmation token, we of course also need to flag the account as enabled manually
            $user->addRole('ROLE_ADMIN');

            $userManager->updateUser($user);

            return $this->redirect($this->generateUrl('company_show', array('id' => $entity->getId())));

        }

        return $this->render('BizTVBackendBundle:company:new.html.twig', array(
            'entity' => $entity,
            'form'   => $form->createView()
        ));
    }

    /**
     * Displays a form to edit an existing company entity.
     *
     */
    public function editAction($id)
    {
        $em = $this->getDoctrine()->getEntityManager();

        $entity = $em->getRepository('BizTVBackendBundle:company')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find company entity.');
        }

        $editForm = $this->createForm(new companyType(), $entity);
        $deleteForm = $this->createDeleteForm($id);

        return $this->render('BizTVBackendBundle:company:edit.html.twig', array(
            'entity'      => $entity,
            'edit_form'   => $editForm->createView(),
            'delete_form' => $deleteForm->createView(),
        ));
    }

    /**
     * Edits an existing company entity.
     *
     */
    public function updateAction($id)
    {
        $em = $this->getDoctrine()->getEntityManager();

        $entity = $em->getRepository('BizTVBackendBundle:company')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find company entity.');
        }

        $editForm   = $this->createForm(new companyType(), $entity);
        $deleteForm = $this->createDeleteForm($id);

        $request = $this->getRequest();

        $editForm->bindRequest($request);

        if ($editForm->isValid()) {
            $em->persist($entity);
            $em->flush();

            return $this->redirect($this->generateUrl('company_edit', array('id' => $id)));
        }

        return $this->render('BizTVBackendBundle:company:edit.html.twig', array(
            'entity'      => $entity,
            'edit_form'   => $editForm->createView(),
            'delete_form' => $deleteForm->createView(),
        ));
    }

    /**
     * Deletes a company entity.
     *
     */
    public function deleteAction($id)
    {
        $form = $this->createDeleteForm($id);
        $request = $this->getRequest();

        $form->bindRequest($request);

        if ($form->isValid()) {
            $em = $this->getDoctrine()->getEntityManager();
            $entity = $em->getRepository('BizTVBackendBundle:company')->find($id);

            if (!$entity) {
                throw $this->createNotFoundException('Unable to find company entity.');
            }

            $em->remove($entity);
            $em->flush();
        }

        return $this->redirect($this->generateUrl('company'));
    }

    private function createDeleteForm($id)
    {
        return $this->createFormBuilder(array('id' => $id))
            ->add('id', 'hidden')
            ->getForm()
        ;
    }
}

person Matt Welander    schedule 02.08.2012    source источник
comment
Вы пытались найти companyController?   -  person Vitalii Zurian    schedule 02.08.2012
comment
у вас нет пространства имен, определенного в вашем контроллере. Может быть, это?   -  person unairoldan    schedule 02.08.2012
comment
Спасибо. Я только что восстановил crud для сущности, и это то, что я тоже обнаружил - вчера поздно вечером я добавил комментарий в верхнюю часть документа - должно быть, случайно выделил строку пространства имен, как только я начал вводить свой комментарий, тем самым заменив пространство имен с комментарием... Нельзя ли отметить этот ваш комментарий как ответ на ветку?   -  person Matt Welander    schedule 02.08.2012
comment
Убедитесь, что в классе нет двух методов с одинаковыми именами. Я заметил, что в моем классе было два метода indexAction, и это была ошибка, которую я видел.   -  person crmpicco    schedule 07.04.2015


Ответы (6)


Итак, оказывается, это была неуклюжая опечатка moi.

Но для всех, кто сталкивается с этим сообщением об ошибке в Symfony2:

Неустранимая ошибка: require() [function.require]: невозможно повторно объявить класс...

Вот подсказка: проверьте, не удалили ли вы случайно или опечатались пространство имен в файле, содержащем определение класса, который, как утверждает php, пытается переопределить.

Сообщение об ошибке php на самом деле не дает вам подсказки, чтобы искать это... =)

person Matt Welander    schedule 02.08.2012
comment
Отметьте этот ответ как принятый, чтобы этот вопрос не отфильтровывался Unanswered - person Vitalii Zurian; 02.08.2012
comment
У меня были похожие ошибки со свежей установкой Symfony (только что скачал, распаковал, без каких-либо модификаций) - оказалось, что проблемы были сгенерированы APC (файлы, включенные с помощью 'require', кэшируются APC). Поэтому мой совет: попробуйте отключить APC, если вы не найдете ошибок в своих файлах. :) - person Marek; 03.12.2012
comment
Я нашел этот вопрос, когда Symfony2 PropelBundle начал сообщать «Неустранимая ошибка: невозможно переопределить AdHocTask», предотвращая сборку модели и SQL. Для всех, кто приходит сюда с той же ошибкой Propel, очистка кеша Symfony сработала. - person A.M. D.; 01.08.2014
comment
Блин, да, тоже опечатка. Глядя на количество голосов, я предполагаю, что мы, программисты symfo, неуклюжи :) - person djfm; 10.10.2014
comment
@ Марек, с точки зрения непрофессионала ... взорви тайники. Я сделал это в var/cache app/cache bin\console cache:clear, а затем пересобрал с помощью composer install. Я получил ошибку о ContainerAwareInterace при обновлении с 2.4 до 3.1. - person Ray Foss; 11.07.2016

Лично я просто удалил кэш вручную, и это сработало.

rm -rf app/cache/*

Очистка кеша не решила мою проблему.

person ReaperSoon    schedule 11.04.2018
comment
Иногда удаления только кеша может быть недостаточно. При необходимости запустите composer dump-autoload. - person sh6210; 13.01.2020

redeclare class - Вероятно, есть два класса с тем же именем

person Eran Or    schedule 19.11.2012

Иногда, если вы соблазнились копированием/вставкой, проверьте свои имена классов, пространства имен и другие «опечатки», которые могли произойти. (копировать/вставить - дьявол программирования :/)

person Michael Kargl    schedule 11.01.2013

Как и в других ответах, в моем случае я переименовал класс, но не содержащий файл. Каждый класс должен быть объявлен в файле с тем же именем. Так что проверьте и это.

person Arild    schedule 10.11.2014

В моем случае это был оператор use в пространстве имен, в котором использовалось то же имя класса (но другой путь).

namespace Bsz\RecordTab;
use \Bsz\Config\Libraries; // I used  this in constructor
class Libraries 
{
...
}

Без директивы use это сработало

person Corni    schedule 05.08.2016