Symfony“, "utiliser" déclaration pour un autre espace de noms?”
J'ai un problème avec les espaces de noms dans la connexion de ma classe entité abstraite-type de la classe.
J'avais besoin de créer un AbstractType
Classe que j'ai appelé BlogFactory. J'ai l'intention de l'utiliser dans mon la createAction
fonction de mon BlogController.php classe d'Entité pour créer des entrées de blog.
Mon BlogFactory
classe est créée dans le Forme/Blog répertoire de mon bundle, comme la structure de l'arbre montre.
.
.
.
src/Blogger/BlogBundle/
├── Controller
│ ├── BlogController.php
│ └── PageController.php
├── DataFixtures
│ └── ORM
│ └── BlogFixtures.php
├── Entity
│ ├── Blog.php
│ ├── Blog.php~
│ └── Enquiry.php
├── Form
│ ├── Blog
│ │ ├── BlogFactory.php
│ │ └── Factory.php
│ └── EnquiryType.php
├── Resources
│ ├── config
│ │ ├── config.yml
│ │ ├── routing.yml
│ │ └── services.yml
.
.
.
Dans le BlogController.php
classe d'entité, je inclure les éléments suivants utilisation instruction:
namespace Blogger\BlogBundle\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Blogger\BlogBundle\Form\Blog\BlogFactory;
class BlogController extends Controller{
.
.
.
avec le suivant createAction
fonction:
public function createAction(){
$form = $this->createForm(new BlogFactory(), new Blog(),
array(
'action' => $this->generateUrl('blog_create'),
'method' => 'POST',
)
);
$form->add('submit', 'submit', array('label'=>'Create'));
return $form;
}
Voici le code dans mon BlogFactory
classe:
namespace Blogger\BlogBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
class BlogFactory extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('title');
$builder->add('author');
$builder->add('blog');
$builder->add('image');
}
public function getName()
{
return 'newblog';
}
}
Cependant, mon problème est que j'obtiens l'erreur suivante:
The autoloader expected class "Blogger\BlogBundle\Form\Blog\BlogFactory" to be defined in file "/var/www/Symfony-Blog/src/Blogger/BlogBundle/Form/Blog/BlogFactory.php". The file was found but the class was not in it, the class name or namespace probably has a typo
Je suis tout à fait bloqué et vous ne savez pas comment résoudre ce problème.
Mise à JOUR:
Comme suggéré par Gnucki, j'ai ajouté espace de noms du Blogueur\BlogBundle\Form\Blog; à mon BlogFactory.php et Blogger\BlogBundle\Form\Blog\BlogFactory; à BlogController.php, et a obtenu le légèrement différente d'erreur ci-dessous:
Attempted to load class "Blog" from namespace "Blogger\BlogBundle\Controller".
Did you forget a "use" statement for another namespace?
use Blogger\BlogBundle\Form\Blog\BlogFactory
. Sans use
la new BlogFactory
est traité que dans le même répertoire.Comme dans le même espace de noms.
Dans votre contrôleur, vous devez utiliser Blogger\BlogBundle\Form\Blog\BlogFactory; ou besoin d'utiliser tout le chemin en créer de nouveaux BlogFactory()
Merci pour vos réponses. Auriez-vous l'esprit en regardant le code de nouveau que je suis certain que je suis en train de faire ce que vous avez suggéré, mais j'obtiens toujours la même erreur. Je m'excuse parce que j'ai collé la mauvaise classe abstraite première fois - j'ai maintenant corrigé.
vous pourriez avoir oublié d'installer une dépendance. Cela provoque également "oublier une instruction "use" erreur".
OriginalL'auteur sisko | 2014-12-29
Vous devez vous connecter pour publier un commentaire.
Il y a un problème de correspondance entre les répertoires et les espaces de noms:
Vous dire que la classe
BlogFactory
est dansForm/Blog/BlogFactory.php
et vous définissez la classe dans l'espace de nomsBlogger\BlogBundle\Form
.Vous devriez utiliser cet espace de noms pour votre classe
BlogFactory
:Puis spécifiez ces mentions d'utilisation de votre contrôleur:
Explication:
Dans une simple application PHP, l'utilisation de certains
require
ouinclude
d'inclure des fichiers les uns des autres. Mais c'est vraiment ennuyeux. Au lieu de cela, vous pouvez utiliser un la fonction de chargement automatique de gérer cela. Symfony2 met en œuvre, d'une manière qu'un espace de noms est mappé sur un répertoire d'une manière logique. Par exemple, la classeBlogger\BlogBundle\Entity\Blog
peut être trouvé dans/Blogger/BlogBundle/Entity/Blog.php
.Si vous souhaitez utiliser la classe dans un autre (avec un autre espace de noms (donc un autre répertoire)), vous pouvez utiliser par exemple:
ou:
Imaginez, vous êtes dans un autre espace de noms sans que l'utilisation:
La classe
Blog
sera interprété comme une classeBlogger\BlogBundle\Controller\Blog
.Maintenant, avec l'utilisation,
Blog
sera interprété commeBlogger\BlogBundle\Entity\Blog
.Voir les espaces de noms en PHP pour plus d'informations.
Ajouter
use Blogger\BlogBundle\Entity\Blog;
dans votre contrôleur.Je vous remercie. Que ai eu de travail. Pourriez-vous offrir une explication, j'ai donc de mieux comprendre comment cela fonctionne et comment elle fix it: la prochaine fois? Merci encore
J'ai ajouté une explication. Dites-moi si c'est pas clair ou si vous voulez quelques détails.
OriginalL'auteur Gnucki