• Aucun résultat trouvé

Inf340 Systèmes d’information

N/A
N/A
Protected

Academic year: 2022

Partager "Inf340 Systèmes d’information"

Copied!
17
0
0

Texte intégral

(1)

Inf340 Systèmes d’information

Quatrième site

(2)

Objectifs

Objectif :

• Démonstration de ce que vous aurez à faire en TP

• Présentation de Doctrine

• Le site permet de gérer des galeries d’images.

(3)

Bilan du troisième site

Nous avions un site :

• Avec une gestion de la sécurité

• Qui utilise des composants existants

• Facilement déployable

• Simple à maintenir

Mais ActiveRecord contraint la base : pas de clefs multiples + un id par table.

(4)

ORM

Un mapping objet-relationnel (en anglais object- relational mapping ou ORM) est une

technique de programmation informatique qui crée l'illusion d'une base de données

orientée objet à partir d'une base de données relationnelle en définissant des

correspondances entre cette base de données et les objets du langage utilisé. On pourrait le désigner par « correspondance entre monde objet et monde relationnel » (Wikipedia).

(5)

ORM

• A une classe (une entité) correspond une table

• A un attribut correspond une colonne

• Possibilité d’avoir des cycles de vie (Triggers)

(6)

Description des entités

Soit au format XML, soit au format YAML, soit avec des annotations, nous utiliserons ces dernières.

//**

* Utilisateur *

* @Table(name="utilisateur", uniqueConstraints={@UniqueConstraint(columns={"login","description"})}) * @Entity (repositoryClass="\models\repositories\UtilisateurRepository")

*/

class Utilisateur {

/**

* L'identifiant unique de l'utilisateur

* @var string $id

*

* @Column(name="id", type="integer", nullable=false)

* @Id

* @GeneratedValue(strategy="IDENTITY");

*/

private $id;

/**

* Le login sert à l'ouverture de session et est unique * @var string $login

*

* @Column(name="login", type="string", length=45, nullable=false) */

private $login;

(7)

Possibilité de règles de visibilité

Outre les contraintes de mapping objet relationnel, il est possible d’exprimer des contraintes de visibilité.

Par exemple un utilisateur peut voir l’ensemble de ses images.

/**

* @OneToMany(targetEntity="Image", mappedBy="utilisateur")

*/

private $images;

(8)

Possibilité de cycle de vie

Lorsque l’on détruit un utilisateur, il faut détruire ces images et ce non seulement dans la base mais aussi sur le système de gestion de fichier.

/**

* Image *

* @Table(name="image")

* @Entity(repositoryClass="\models\repositeries\ImageRepository") * @HasLifecycleCallbacks

*/

class Image

/**

* @preRemove */

public function deleteFile() {

(9)

Les dépôts

Les entités possèdent un repository par défaut qui contient les méthodes suivantes :

public function findAll()

public function findBy(array $criteria)

public function findOneBy(array $criteria)

Il est possible d’hériter de EntityRepository est de redéfinir ces méthodes.

Nous utiliserons les repository comme des composants

métiers en ajoutant les méthodes d’accès à notre modèle.

(10)

Les dépôts

Dans l’entité : @Entity (repositoryClass="\models\repositeries\UtilisateurRepository") Dans le dépôt : class UtilisateurRepository extends \Doctrine\ORM\EntityRepository {

public function create($login, $level, $password, $description) {

} }

Les dépôts sont accessibles via le nom de l’entité :

$em = $this->doctrine->em;

$repository = $em->getRepository('models\Utilisateur');

$repository->create($login, $password, $level, $description);

(11)

Le gestionnaire d’entité

• EntityManager est la classe qui a pour

responsabilité de gérer la persistance des objets.

• Pour nous :

Dans un contrôleur qui a chargé doctrine : $em =

$this->doctrine->em;

Dans un dépôt : $em = $this->getEntityManager();

(12)

Création

• Construire un objet puis le rendre persistant et réaliser l’écriture :

$utilisateur1 = new models\Utilisateur('admin', 0, 'pass', 'le chef');

$utilisateur2 = new models\Utilisateur('toto', 1, 'toto', 'pas le chef');

$em->persist($utilisateur1);

$em->persist($utilisateur2);

$em->flush();

(13)

Suppression

• Trouver l’entité puis la supprimer :

$utilisateur = $this->findOneByLogin($login);

$em->remove($utilisateur);

$em->flush();

(14)

Modification

• Trouver l’entité, la modifier puis la sauvegarder.

$utilisateur = $this->findOneByLogin($login);

$utilisateur->setPassword($password);

$utilisateur->setLevel($level);

$utilisateur->setDescription($description);

$em->persist($utilisateur);

$em->flush();

(15)

Interrogation

• En utilisant find :

Find FindAll FindOne FindOneBy

(16)

Autre requêtes

• DQL : Un langage de requêtes objet

$max= $em->createQuery('SELECT max(i.url)

FROM models\Image i')->getSingleScalarResult();

• Des requêtes natives

$em->getConnection()->exec('alter table image auto_increment=1');

(17)

Limitations rencontrées

• L’impossiblité d’avoir des associations n-n paramétrées.

• La gestion des champs autoincrementant avec mysql pas de séquence et pas de table

doctrine pour les gérer.

Références

Documents relatifs

Puisque le petit rectangle est contenu dans le grand, la transformation peut être vue comme une transformation de R dans lui-même; et il s’agit d’une contraction car pour tout

Cette méthode utilise le fait que I et P regardent les points A et A' et les points B et B' sous le même angle égal à l'angle de la similitude directe. Les points IPAA' d'une part

Cette construction ne demande que le tracé de deux droites et celui de cercles circonscrits à 3 points et peut donc s'effectuer à l’aide d’une règle et

Cependant, suivant le principe qui peut le plus peut le moins, nous ne gardons que les qualités affines de S, en remarquant que : les points d'intersection des droites d'un

(On suppose qu’on sait construire un cercle passant par 3 points sans tracer les m´ ediatrices.). La droite EF coupe AB

S est le seul point commun aux deux photos car s’il en existait un autre, S’, on aurait SS’=3 SS’, donc S’ confondu avec S. Si A’B’ est aligné avec A, donc P en A, on

Si les cotés correspondants sont parallèles, AA’, BB’, CC’ et DD’ sont concourants en un point O qui est le point invariant cherché.. Sinon, AB et A’B’ se coupent en un

Nous expliquons dans cet article les lignes directrices qui ont guidé la conception de ce format, notamment : la volonté de représenter toutes les étapes d'un