web-dev-qa-db-fra.com

erreur fatale symfony2 Impossible de redéclarer la classe

Ok, ça fait deux heures que je suis là et je vois que d'autres personnes ont eu cette erreur, mais je ne peux pas sembler faire correspondre leurs causes/résolutions avec les miennes.

Erreur fatale: require () [function.require]: impossible de redéclarer le contrôleur de société de classe dans /var/www/biztv_symfony/vendor/symfony/src/Symfony/Component/ClassLoader/DebugUniversalClassLoader.php on line 55

Le terminal affiche un meilleur message d'erreur en me dirigeant vers la clause de fin de la classe réelle avec laquelle il signale des problèmes (tentative de redéclare).

Si je supprime ou renomme le fichier companyController.php, une erreur Symfony2 est générée, indiquant que le fichier a cherché la classe mais ne l'a pas trouvée à l'endroit prévu.

Si je remets le fichier à sa place, Apache génère une erreur php indiquant que la classe companyController ne peut pas être redéclarée.

Je ne l'ai qu'une fois?!

Voici toute la classe ... si quelqu'un a la patience d'essayer de m'aider ...

<?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()
        ;
    }
}
18
Matt Welander

Donc, il s’avère que c’était là une faute de frappe encombrante.

Mais pour tous ceux qui rencontrent ce message d'erreur dans Symfony2:

Erreur fatale: require () [function.require]: impossible de redéclarer la classe ...

Voici un indice: vérifiez si vous avez accidentellement supprimé ou typo: ed l'espace de noms dans le fichier qui contient la définition de la classe que php prétend essayer de redéfinir.

Le message d'erreur php ne vous donne pas vraiment d'indice pour chercher ça ... =)

54
Matt Welander

Dans mon cas, il s'agissait d'une instruction use sous l'espace de noms qui utilisait le même nom de classe (mais un autre chemin). 

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

Sans la directive d'utilisation, cela a fonctionné

0
Corni

Personnellement, je viens de supprimer le cache manuellement et cela a fonctionné

rm -rf app/cache/*

Effacer le cache ne réglait pas mon problème.

0
ReaperSoon

redeclare class - Il est probable qu'il existe deux classes portant le même nom

0
Eran Or

Semblable à d'autres réponses, dans mon cas, j'avais renommé la classe mais pas le fichier contenant. Chaque classe doit être déclarée dans un fichier portant le même nom. Alors vérifiez cela aussi.

0
Arild

Parfois, si vous êtes séduit par copier/coller, vérifiez vos noms de classe, espaces de noms et autres "fautes de frappe" qui auraient pu se produire. (copier/coller est le diable de la programmation: /)

0
Michael Kargl