tu peux faire tout ça avec le sqlite puisque que le xml dans le fond c'est que "un fichier" (pas convaincu pour le stream par contre), mais si ton but c'est la partage niveau API le plus simple encore uen fois seras le sqlite, ca prendra moins de temps de recréé un fichier XML suivant les données, (avec ton XML ça sera tout la table ou rien, ou alors gros traitement pour receer le XML voulu)
pour des fichier de config y'a pas de soucis, mais pour une utilisation type base de données autant utiliser ... une base de données
![]()
Merci bien du conseil ! Je vais voir si je peux faire tourner ça sur mon hébergement partagé, dans tous les cas ce sera plus rapide que de développer une prise en charge du XML et, dans un premier temps, ça pourrait faire l'affaire... Peut-être que d'ici à ce que j'ai un besoin indispensable de XML, OXM sera achevé
Bref, merci !
Un premier retour sur l'utilisation de sqlite, vu que la doc de sf2 est assez légère à ce sujet, on peut rencontrer des problèmes pour insérer des données en base.
Donc pour permettre la génération de la base et des tables en ligne de commande avec sqlite, il faut rajouter :
Dans parameters.ini
database_path=%kernel.root_dir%/db/ma_base.sqlite
Dans config.yml - partie doctrine:dbal:
path: %database_path%
En l’occurrence j'ai choisi de la placer dans /db/ parce que je devrais en avoir quelques unes, mais libre à vous de choisir le dossier qui vous convient.
(au passage, le projet OXM avance, des ajouts on eu lieu le 18/11/2011, ça me plait bien ça aussi !)
Merci pour le tutoriel sur Symfony.
Je repose ici ce que j'ai dit sur ton profil, car plus logique...
Je viens rapporter un problème dans le chapitre V-A. du 2ème tuto.
Chez moi, la page ne veut pas se charger tant que les lignes de routing.yml ne sont pas :
myapp_choisir_langue:
pattern: /choisir-langue/{langue}
defaults: { _controller: MyAppFilmothequeBundleefault:choisirLangue }
au lieu de
myapp_choisir_langue:
path: /choisir-langue/{langue}
controller: { _controller: MyAppFilmothequeBundleefault:choisirLangue }
EDIT : Dans ce chapitre, après modification des fichier yml, je me refais engueuler par Symfony pour la même raison
Autre problème :
Lors de la création du premier utilisateur, une erreur est arrivé sur la console.
J'ai trouvé ce lien qui offre une solution qui fonctionne.
http://konradpodgorski.com/blog/155/...d-for-account/
Merci Djay pour ton tuto. J'avance pas à pas, et j'en suis justement à cette ligne de commande : php app/console doctrine:generate:entities MyApp.
En ce qui me concerne la réponse obtenue est :
Début de Acteur.php (sans surprise normalement, vu que je n'ai fait qu'un copie colle)
Code : Sélectionner tout - Visualiser dans une fenêtre à part Fatal error : Namespace declaration statement has to be the very first statement in the script in ..mon_chemin..\Acteur.php on line 3
Merci par avance pour votre aide,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 <?php namespace MyApp\FilmothequeBundle\Entity; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Validator\Constraints as Assert; /** * @ORM\Entity */ class Acteur {
Bonjour aux Symfoniens,
Tout d'abord merci pour ce tuto clair
J'ai quand même quelques questions au niveau des formulaires et de leur gestion vis à vis des entity.
Ex de l'action du CRUD généré par symfony:
Je n'arrive pas à comprendre à quel moment $entity est rempli par le POST envoyé par le formulaire. Et parviens donc à récupérer les infos.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 public function createAction() { $entity = new User(); $request = $this->getRequest(); $form = $this->createForm(new UserType(), $entity); $form->bindRequest($request); if ($form->isValid()) { $em = $this->getDoctrine()->getEntityManager(); $em->persist($entity); $em->flush(); return $this->redirect($this->generateUrl('user_show', array('id' => $entity->getId()))); } return $this->render('DoodleUserBundle:User:new.html.twig', array( 'entity' => $entity, 'form' => $form->createView() )); }
J'ai remarqué que cela se produit lors de:qui set les valeurs à l'entity via le form ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $form->bindRequest($request);
Qu'en est-il des valeurs par défaut ? Comment les setter et surtout où ?
J'imagine que le mieux est de placer tout ça dans l'entity mais de quelle manière ? Apparemment il n'y a pas de constructeur pour cette classe.
Autre chose je voulais sha1 automatiquement le password via mon entity User.
J'ai donc modifié:
Mais le champ reste vide en db. (une valeur string en dur passe très bien)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 /** * Set password * * @param string $password */ public function setPassword($password) { $this->password = sha1($password); }
Merci pour vos conseils et explications !
Salut,
je fais remonter le sujet
Tout d'abord merci pour ce tuto bien détaillé.
J'ai un petit soucis lors de la création des actions de Création/Modification des acteurs.
En effet, le code donné pour le controller ActeurController ne me remonte pas les infos des acteurs lorsque je suis en modification avec un url du type : http://monurl/acteur/modifier/1
Sachant que j'ai bien des enregistrements dans la base de données.
Pour l'ajout et la suppression aucun soucis mais pas de remontée des valeurs en cas de modification
Quelqu'un a une idée ?
Merci pour ce Tuto - partie 1
Quelques rectifications qui proviennent certainement de l'évolution de Symfony 2
- dans les fichiers Categorie.php, Acteur.php et Film.php : lenght="250" doit être modifié en lenght=250 (enlever les "" pour des variables integer) avant de pouvoir créer les tables via la commande console.
- dans le fichier Form/ActeurForm.php il faut remplacer chaque fois FormBuilder par FormBuilderInterface
Tuto effectué le 25/02/2013
Bonsoir,
Merci pour ce tuto pratique
Le tutoriel a pris un peu la poussière, mais il peut se faire sans soucis avec la version actuelle de Symfony (2.2.1).
Par contre il est plus facile d'utiliser :
à place de
Code : Sélectionner tout - Visualiser dans une fenêtre à part return $this->render('MyAppFilmothequeBundle:Default:index.html.twig');
De même avec getEntityManager() utilisez plutôt getManager()
Code : Sélectionner tout - Visualiser dans une fenêtre à part return $this->container->get('templating')->renderResponse('MyAppFilmothequeBundle:Default:index.html.twig');
Chez moi j'utilise :
au lieu de
Code : Sélectionner tout - Visualiser dans une fenêtre à part class ActeurController extends Controller
Il y a-t-il une différence ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part class ActeurController extends ContainerAware
Bonjour,
la classe Symfony\Bundle\FrameworkBundle\Controller\Controller hérite de la classe Symfony\Component\DependencyInjection\ContainerAware
en ajoutant des méthode pour utiliser les services les plus courants du container
il suffit d'en parcourir le code:
https://github.com/symfony/symfony/b...oller.php#LC34
On peut donc utiliser l'une ou l'autre des méthodes cela ne change rien à la logique applicative.
Dans ce tutoriel, ne pas utiliser la classe Controller de Symfony, permet de mettre en évidence le role central que joue le container d'injection de dépendance dans une application Symfony.
C'est plus pédagogique en somme!
Avec la derniere version symfony 2.6 :
Voici quelques solutions aux problèmes qu'on peut rencontrer :
Problème : Solution :Problème lors de la génération automatique des accesseurs :
C:\wamp\www\Symfony2>php app/console doctrine:generate:entities MyApp
Generating entities for namespace "MyApp"
[Doctrine\Common\Annotations\AnnotationException]
[Type Error] Attribute "length" of @ORM\Column declared on property MyApp\F
ilmothequeBundle\Entity\Acteur::$nom expects a(n) integer, but got string.
doctrine:generate:entities [--path="..."] [--no-backup] nameEnlever les "" du length dans tous les entités
@ORM\Column(type="string",length="255")@ORM\Column(type="string",length=255) C:\wamp\www\Symfony2>php app/console doctrine:generate:entities MyApp
Generating entities for namespace "MyApp"
[Doctrine\Common\Annotations\AnnotationException]
[Semantical Error] The annotation "@Symfony\Component\Validator\Constraints
\MinLength" in property MyApp\FilmothequeBundle\Entity\Acteur::$nom does no
t exist, or could not be auto-loaded.
doctrine:generate:entities [--path="..."] [--no-backup] nameLe validator "MinLength" n'existe plus dans la version symfony 2.6
Donc il faut remplacer "MinLength(3)" par "Length(min=3)" dans tous les entités
@Assert\MinLength(3)@Assert\Length(min = 3)Problème lors de la création des formulaires :
Compile Error: Declaration of MyApp\FilmothequeBundle\Form\ActeurForm::buildForm() must be compatible with Symfony\Component\Form\FormTypeInterface::buildForm(Symfony\Component\Form\FormBuilderInterface $builder, array $options) in C:\wamp\www\Symfony2\src\MyApp\FilmothequeBundle\Form\ActeurForm.php line 8Il faut utiliser "FormBuilderInterface" à la place de "FormBuilder"
use Symfony\Component\Form\FormBuilder;public function buildForm(FormBuilder $builder, array $options)use Symfony\Component\Form\FormBuilderInterface;public function buildForm(FormBuilderInterface $builder, array $options) Attempted to call method "bindRequest" on class "Symfony\Component\Form\Form" in C:\wamp\www\Symfony2\src\MyApp\FilmothequeBundle\Controller\ActeurController.php line 30.La méthode "bindRequest" à été remplacé par "submit()" qui sera lui supprimé dans la version 3.0 donc il faut utiliser la méthode "handleRequest()"
if ($request->getMethod() == 'POST')
{
$form->bindRequest($request);
...
}Source : http://symfony.com/fr/doc/current/co...ct_submit.htmlif ($request->isMethod('POST'))
{
$form->handleRequest($request);
...
}
Salut les gens, j'aurais besoin d'aide
J'ai réussis à me rendre jusqu'aux templates du tutoriel, sauf que je me rend compte en exécutant le code que la partie sur les bases de données n'a pas fonctionnée. Les deux catégories que sont Comédie et Science-fiction ne s'affiche pas. Je présume qu'elles n'ont pas été créées, d'autant plus que le message « Aucune catégorie n'a été trouvée » est affiché.
Voici ce que le code me génère :
Attempted to call method "setNom" on class "MyApp\FilmothequeBundle\Entity\Categorie".
500 Internal Server Error - UndefinedMethodException
Et voici le code de ma fonction indexAction
public function indexAction() {
$em = $this->container->get('doctrine')->getEntityManager();
$categorie1 = new Categorie();
$categorie1->setNom('Comédie');
$em->persist($categorie1);
$categorie2 = new Categorie();
$categorie2->setNom('Science-fiction');
$em->persist($categorie2);
$em->flush();
$message = 'Catégories créées avec succès';
return $this->container->get('templating')->renderResponse('MyAppFilmothequeBundleefault:index.html.twig',
array('message' => $message)
);
}
Je n'arrive pas à saisir le problème, pourtant j'ai suivis les instructions à la lettre... Pouvez me filer un coup de pouce?![]()
En gros quoi ... t'as une methode setNom dans l'entity Categorie ? non alors tu n'as pas du faire le php app/console doctrine:generate:entities qui va bien ....Attempted to call method "setNom" on class "MyApp\FilmothequeBundle\Entity\Categorie".
500 Internal Server Error - UndefinedMethodException
Les tutos c'est inutile si tu ne cherches pas a comprendre ce que tu fais !
Comment se sentir con en une seule et simple étape... Allez savoir pourquoi j'avais complètement zappé cette ligne de commande. Probablement que j'ai été distrait par quelque chose et que je ne l'ai pas vu... C'est pas comme si je ne connaissais pas le sujet et que j'avais pas fait des recherches pour régler les bugs, car j'ai maintenant terminé le tutoriel et mon programme fonctionne super bien.
Merci en tout cas >_>
Salut à tous,
j'ai moi aussi dû m'adapter aux modifications à faire du fait que la version de Symphony du tuto est plus ancienne que la dernière version..
Heureusement grace à vos conseils je m'en suis sorti
J'ai une chose toutefois qui ne marche pas chez moi:Dans la partie VII-D. Enregistrement d'une première donnée il est écrit que "Pour éviter de créer ces catégories chaque fois que vous accédez à cette URL, vous pouvez mettre la ligne $em->flush(); en commentaire ou bien renommer la fonction indexAction() pour enregistrerCategorie()." toutefois dans mon cas si je recharge la page X fois à chaque fois il me réinsère les meme catégories créant inévitablement des doublons...
Code : Sélectionner tout - Visualiser dans une fenêtre à part $em->flush();
D'après la doc officielle de doctrine cette fonction évite en effet les doublons mais dans mon cas ça ne marche pas. L'un d'entre vous aurait-il eu ce problème?
Quelqu'un sait par hasard où est le problème? J'ai suivi scrupuleusement les indications du tuto (=j'ai rien de custom)
Merci d'avance
Hello,
J'ai essaye le tutoriel (http://j-place.developpez.com/tutori...avec-symfony2/).
J'utilise la verison 3.0.0
Cependant, j'ai eu une erreur :
ContainerAware a disparu sur la version 3 ?CRITICAL - Fatal Error: Class 'Symfony\Component\DependencyInjection\ContainerAware' not found
CRITICAL - Uncaught PHP Exception Symfony\Component\Debug\Exception\ClassNotFoundException: "Attempted to load class "ContainerAware" from namespace "Symfony\Component\DependencyInjection". Did you forget a "use" statement for another namespace?" at /var/www/html/symfony/src/MyApp/FilmothequeBundle/Controller/DefaultController.php line 11
Comment je peut faire pour contourner le problème ?
Partager