Comment créer une relation bidirectionnel avec symfony 2 ?

Bonjour,

Aujourd’hui je vais encore faire un petit tutoriel sur Symfony 2. Je vais vous expliquer les notions de relation bidirectionnel et comment le mettre en place dans nos entité.

Pour ce tutoriel notre cas d’étude sera :

-Nos utilisateur sont inscrit dans des groupes.

-Un groupe possèdes plusieurs utilisateur.

Le sujet nous est donc posé. Pour répondre au mieux à ce problème épineux nous allons donc devoir modéliser deux classes : Utilisateur et Groupe.

Pour le moment nous ne parlons pas de la relation bidirectionnel.

Une fois que vous avez défini vos champ sur le papier je vous invite a faire un coup de commande par la console :

php app/console doctrine:generate :entity

puis laissez-vous guider. Mais attention ne rajouter pas de champ en lien avec notre lien.

On doit le rajouter a la main.

Donc passons a notre lien bidirectionnel.

Déjà qu’est-ce que c’est ?

Rien de plus qu’une propriétés de vos objet qui vous permettra par exemple de vous retourner les infos sur les groupes auxquelles un utilisateurs appartient. Ou au contraire savoir quelle utilisateurs et dans ce groupe.

Comme je vous le fait entendre je parle de propriétés et pas de champ de table, parce que une propriétés bidirectionnel ne sera pas traduit par un champ dans votre base de données. Tout cela sera traduit en une table qui sera gérer par votre ORM.

C’est cela la bidirectionnalité on peu des deux côtés récupérer les informations. Maintenant que nous avons saisi le principe, passons à la pratique.

Pour ce faire il va aussi falloir définir ce qu’on appelle l’entité propriétaire. C’est l’entité porteuse de notre lien. Cela import peut vu que c’est un lien bidirectionnel mais c’est comme ça.

Disons simplement dans notre cas que se sera Utilisateur.

Code :

// dans utilisateur

// première étape définir la propriété

/**

/* @ORM\ManyToMany(targetentity= ‘Namespace\bundle\Entity\Groupe’, inversedBy= »Utilisateurs)

**/

private $Groupes ;

// ensuite définir dans le constructeur ceci

$this->Groupes = new // array ;

// ensuite faire un getter puis le add

public function getGroupes()

{

return $this->Groupes ;

}

// le add

public function add(Namespace\bundle\Entity\Groupe $newGroupe)

{

$this->Groupe[] = $newGroupe ;

}

et voilà un côté de fait.

De l’autre côtés dans groupes.

Ajoutez y ça :

@ORM\ManyToMany(targetEntity= ‘Namespace\bundle\Entity\Utilisateur’, mappedBy=’Groupes’

private $Utilisateurs ;

même chose de l’autre côté

par la suite a chaque fois que vous rajouter l’utilisateur dans un groupe, ajoutez le aussi dans Groupes->addUtilisateur($mycurrentUser) ;

NB : pour savoir exactement marche bidirectionnalité c’est simplissime côté propriétaire utiliser inversedBy et il suffit d’inverser par la propriété de la targetentity correspondante. Et vice versa.

Comment importer bootstrap a son projet symfony 2

Bonsoir,

Aujourd’hui j’ai peut rencontré un soucis que j’ai peut ressoude très vite mais qui m’a donner du fil à retordre. Bootstrap ! Comment fait on pour l’utiliser dans Symfony 2 ? bonne question non;).

Déjà avant de commencer parlons un peu de ce qu’est Bootstrap. C’est un framework css qui permet donc de rendre vos sites plus joli. Ce dit framework a était initié par twitter donc ne vous inquiéter pas si l’aspect de certaines choses vous parais familière.

Vous me dirait jusque là rien de nouveau, et pourtant ce framework utilise LESS, c’est langage pourrait-on dire qui va permettre optimisé le css. L’exemple le plus fragrant intervient sur l’héritage

.MonID #maclasse

{

font-family : Nyala ;

}

,MonID #maclasse ul

{

color:#E915F3 ;

}

cela fait beaucoup de code. Maintenant LESS

.MonID{

font-family:Nyala ;

#maclasse{

ul{color :#E915F3;}

}

}

Un peu moins non ? Pour ma part l’association LESS + Bootstrap s’avère parfait si comme moi, vous n’êtes pas bon en design.

Maintenant qu’on à vu un peu ce que ça apporte voyons comment le joindre dans nos projet.

Tout d’abord il faut le télécharger soit a la main mais je vous conseil de passer par le méthode je met mon lint git dans mon depts puis je fait :

php bin/vendors update

ensuite

php app/console assets:intall web

qui est un peu plus best pratrice !

Ensuite comme je vous les dit bootstrap utilise LESS il va donc falloir le télécharger aussi

mettez le dans src/namespace/monbundle/ressources/public/js

puis faite :

php app/console assets:install web (encore une fois ou rassembler les deux en un seul :p )

maintenant dans votre vue mettez y cela :

<link rel= »stylesheet/less » href= »{{asset(‘bundles/monbundle/css/bootstrap/less/bootstrap.less’)}} »>

<script src= »{{asset(‘bundles/monbundle/js/less-1.3.0.min.js’)}} »></script>

ensuite à vous de jouer !

Non je rigole pour le moment j’ai pas le temps de vous en montrez plus mes voici des liens bien fait:p

 Je le trouve bien celui-ci 😀

http://www.grafikart.fr/tutoriels/html-css/bootstrap-twitter-182

Comment importer Jquery dans un bundle dans Symfony 2

Bonsoir,

Comme promis je vais faire un autre tutoriel. Bon par contre un peu moins tendu que le gros que je viens de finir sur le webservice restfull.

Alors pour être gentil et pas trop paraître pour un geek je ferais simplement un petit truc sympathique.

Alors ce petit tutoriel va consister à montrer comme télécharger jquery et l’importer dans votre bundle.

Nous admettrons dans ce tutoriel que vous avez déjà créer un bundle ^^.

Tout d’abord télécharger jQuery :  http://jqueryui.com/download

dézippé le tout dans votre bundle :

Symfony/src/VotreBundle/Resources/public/js/

ensuite en mode commande il vous suffit de faire cela :

php app/console assets:install web

ensuite dans votre code utiliser comme cela :

{{asset (‘bundles/nomdevotrebundle/js/leslibconcerner.js’)}}

petite astuce par exemple pour changer de style rien de plus simple télécharger un nouveau style et d’importer le style grâce a la feuille de style du répertoire télécharger.

 

Pourquoi les mettre dans ressources publique si elle vont finir dans web/ ?

 

La question est très pertinente. Tout simplement il faut revenir sur l’architecture de Symfony. Le répertoire web/ contient les ressource ditent publique de vos bundle donc quant vous faite asset() il va rechercher dans ce web ou sont les sources de votre demande. C’est pour cela qu’il faut les mettre dans ressources/public. Attention tout doncument qui ne s’y trouve pas sera perdu à votre prochain import par le module assets garder bien a l’esprit que c’est pour permettre l’utilisation de ressource publique. Car je le rappelle a la base Symfony permet de créer des module qui pourrons être apporter dans d’autre projet comme des packages si vous comprenez ça vous avez saisi le principe.

Comment faire un WebService De A à Z en passant par les JPA :p (Partie 4)

Hello,

je termine ce que j’ai commencer cette semaine. Ceci est donc la dernière parti de ce tutoriel qui nous aura porter à travers plusieurs étapes. Nous avons vu les entités qui seront retranscrite dans notre base de donnée grâce à hibernate et aux JPA.

Donc nous allons faire notre dernière parti mais avant tout un point de cour technique pour bien comprendre la suite des évènements

Parlons des requête HTTP. Tout d’abord il faut savoir que celle-ci son subdivisé en 8 types ou pour utiliser le jargon associé en méthodes qui on chacune une action qui leur est propre.

je vais vous les listez :

– GET : Permet de demander des ressources. elle ne pourra que vous retourner un résultat.

-HEAD : Permet de demander des informations sur le serveur ou autre.

-POST : Permet de créer des nouveau objet sur la ressource.

-OPTIONS : Permet d’obtenir des options sur la communication avec le serveur.

-CONNECT : Permet de faire tuneling si vous avez un proxy ;p

-PUT : Permet d’ajouter ou de modifier une ressources.

-DELETE : Permet de suprimer la ressource souhaiter.

Donc maintenant que vous savez cela vous comprendrez mieux la suite.

Etape 1 : créer AuteurRest

Dans com.josselinchevalay..tutoriel.rest nous allons créer un objet intitulé AuteurRest qui nous permettra de gérer les fonctionnalité qui serons centré sur Auteur.

bon voici le code ^^

petite explication des annotations :

-PATH : permet de préciser un chemin vers la ressource ou encore à passer des paramètre comme un identifiant ^^.

-ensuite il y a les annotions qui représente les méthodes.

– Cosumes : Permet de présicer qu’on attend dans notre cas du Json dans la requête.

-Produces: Permet de dire qu’on va retourner du Json.

Important : Nous allons mettre deux annotations nécessaire pour évité que notre classe AuterRest ne boucle sur une propriétés  de l’objet Auteur.

au-dessus de citations mettez y @XmlTransient @JsonIgnore

une fois cela fait ben on passe a la prochaine étape.

Etape 2 : CitationRest

Maintenant nous allons mettre en place une méthode pour lister les citations d’un auteur.

@GET @Path(« /auteur/{id} »)
public List<Citation> getById(@PathParam(« id ») long id)
{
return citationDao.findByAuteur(id);
}

et voilà webService done :p

Comment faire un WebService De A à Z en passant par les JPA :p (Partie 3)

Hello,

La suite de ce tutoriel ! Récapitulons un peu ce qu’on a fait juste là :

– Créer le projet (important :p ) .

– Mettre les libraires Hibernate et Jersey.

– Créer les entités.

Etape 1 : Créer une interface Dao

Nous allons maintenant créer notre interface dao qui déclarera les fonctionnalités de base de JPA. Les fonctionnalités à apporté sont les opérations CRUD (create, reach, update et delete).

Voici ce que vous devez avoir dans votre interface.

Etape 2 : Créations l’interface

Nos JPA aurons des méthodes bien à elle qui pourra comme par exemple la JPA de citation aura une méthode findByAuteur. Dont voici le code :p

Maintenant ce qui va suivre va être compliqué ^^ vraiment un peu. nous allons devoir créer des ficher puis les modifier un peu à certain moment.

Commençons par editer un persistence manger : il sera charger de gérer la persistence où si vous préferer l’enregistrement de nos entity dans la base de données.

PersistenceManager : Le code

Nous allons donc créer ce fichier dans le package  com.josselinchevalay.tutoriel.util

Vous pouvez le voir on lie le fichier persistence.xml  contenu dans src/META-INF/ dans cette classe. Cela ce fait par le persistence unit comme cela notre PersistenceManager sera exactement ou envoyer les requête qu’il générera.

Maintenant nous allons créer une class intitulé DaoFactory mais Attention elle va subir quelque changement par la suite ^^

DaoFactory : le code (dans com.josselinchevalay.tutoriel.dao)

Voici le code nécessaire pour le moment.

Les jpa

Comme promis dans le titre du tutoriel nous allons attaquer par la partie importante du code les JPA :p . Pas de souci nous allons les créer en douceur. Tout ce passera bien ! croyez moi !

Etape 1 : JpaAuteurDao

Nous allons commencer par JpaAuteurDao qui permettra de gérer le persistence des auteurs.

Le code est spliter en 2 partie ^^

Voilà ^^ gros code :p

(Pour commentaire j’aurais peut créer un variable transaction pour y mettre em.getTransaction() )

passons à JpaCitationDao

Voila Maintenant nous allons revenir vers DaoFactory ^^ eh oui  le retour !

Et voila vous avez tout !

Maintenant je vais créer une nouvelle page pour la dernière parti Le webservice :p

Comme ça ce tutoriel sera fini :p

Comment faire un WebService De A à Z en passant par les JPA :p (Partie 2)

Hello,

Suite de ce tutoriel sur le webService restfull en java. Pour résumé ce qu’on à fait :

– On a créer le projet.

-On a mis en place Jersey.

-On a mis en place Hibernate.

Maintenant passons au code ! la parti la plus intéressante.

Etape 1 : Les entity

Pour ce tutoriel nous allons faire quelque chose de simple. Nous allons créer deux entités rien de méchant :

– auteur : qui sera composer d’un nom, prénom et un mail.

– citation : qui sera composé d’une citation, une note et parce qu’on est des fou une date de publication !


Pour plus de clarté nous allons divisé le code en sous parti ^^

Etape 1 :  Les annotations

nous allons commencer par les annotations pour permettre à hibernate et jersey de pouvoir renvoyer et gérer la persistence de nos entity.

package com.josselinchevalay.tutoriel.entity;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.xml.bind.annotation.XmlRootElement;

@Entity @XmlRootElement @SuppressWarnings(« serial »)
public class Auteur implements Serializable {

}

NB : les annotations commencerons toujours par un « @ ».  Comme on peut le voir il y a 3 annotations :

– @Entity : permet a hibernate de pouvoir persister l’objet  dans notre base de données.

– @XmlRootElement : permettra à jersey de convertir votre objet en extrait de code xml ou json.

-@SupressWarnings(« serial ») : permet de ne pas lever certaine erreur ou avertisement.

Attention : Ne pas oublier d’implémenter Serializable qui permettra de sérialisé ou de dé sérialisé l’objet.

Etape 2 : l’objet en lui même 

Comme vous pouvez le voir ci-dessus il n’y a pas de code. C’est un choix de ma part comme cela on ce concentre point par point sur l’important. Pour suivre nous allons donc voir les propriété de notre objet qui rappelons le seront d’un id ( important pour la base), un nom, prénom et une adresse mail.

@Id @GeneratedValue
private Long id;
@Column(length=25,nullable=false)
private String nom;
@Column(length=25,nullable=false)
private String prenom;
@Column(length=255,nullable=false,unique=true)
private String mail;

Le code ci-dessus nous permet de générer les attributs de nos objet pour alléger la lecture j’ai pas mis le reste. Donc voici l’essentiel mais n’oubliez pas de générer les Getter Setter car nos propriétés sont privé.

Commençons les hostilités par l’identifiant on peu y voir les annotations @Id et @GeneratedValue. @Id permet à hibernate de préciser que ce champ sera la clé primaire de votre table qui sera générer par votre entity. @GeneratedValue  spécifie que la valeur sera créer automatiquement ou plus précisément : elle sera auto-incrémenté.

Bon je vous propose d’expliquer en détail mail et ces annotations au lieu de tous les faire. l’annotations Column est facultatif si vous la mettez pas elle prendra des valeurs par défaut. Si vous la précisez c’est que vous voulez y mettre des contraintes particulières comme ici pour le mail. Dans ce projet on veux que le mail respect certaines contraintes qu’il est une taille inférieur ou égal a 255 caractères, qu’il doit pas être null et enfin doit être unique.

Voici ce que vous devriez obtenir.  

Etape 3 : créer l’entity Citation

Bon pour accélérer la cadence je met le code en screenshot ^^

Je vais revenir sur 2 points qui me paraisse bien ici :

– @Lob : permet de déclarer un champ texte d’une taille importante.

– @Temporal : permet de déclarer des champ de type datetime.

Etape 4 : Créer les jointures entre les objets 

Pour connaître les citations d’un auteur il va falloir mettre en place ce qu’on appelle les jointure pour cela. cela ce fait par l’ajout de propriétés et avec des annotations.

Dans Auteur:

@OneToMany(mappedBy= »auteur »)
private List<Citation> citations;

cela nous permet ainsi de pouvoir connaître les citations d’un auteur.

Dans Citation

@ManyToOne
@JoinColumn
private Auteur auteur;

quand nous connaissons la citation il peut être sympathique de connaître l’auteur.

Voilà vous avez vos entity prêt à servir !

Pour la prochaine étape je vais à nouveau refaire un page :p