37K Views

La Doctrine des Objets Proxy et le Chargement Paresseux

Updated 10 December 2021

Facebook Linkedin

La Doctrine est un Object Relational Mapper (ORM) qui se trouve au sommet d’une puissante Couche d’Abstraction de Base (DBAL). Lorsque vous avez été travailler avec Symfony (+ Doctrine) pour un certain temps, vous êtes lié à venir à travers la Doctrine de la foi des Objets Proxy.

Si vous avez déjà généré une entité qui est associée à une autre entité, et nous avons pris un coup d’oeil à la arguments pour la fonction associée à cette entité dans le générés entité fichier, vous pourriez avoir remarqué la barre oblique inverse supplémentaire avant la déclaration de type de l’argument de fonction. Dans ce cas, ‘\ « avant » ProxyBundle\Entity\Sujets‘. Si vous êtes comme moi, vous pourriez avoir demandé à ce sujet une barre oblique inverse, et que vous devez savoir à propos de la Doctrine de la foi des Objets Proxy pour en comprendre le but.

Sur un jour le jour, un développeur ne devrait pas être dérangé par un objet proxy, ils doivent être transparents à votre code. Et la Doctrine accomplit parfaitement. Je me souviens de la première fois que j’ai dû prendre un coup d’oeil a été quand j’ai rencontré un problème avec le cache. Vous n’avez pas besoin de savoir ce que les Objets Proxy sont et ce qu’ils aident à accomplir, mais c’est sûr qu’il est utile de connaître. C’est ce que nous allons parler aujourd’hui.

la Doctrine des Objets Proxy:

La Doctrine du Proxy Objets sont basés principalement sur deux Modèles de Conception: Modèle de Proxy, et Paresseux Schéma de Chargement.

Selon le documentation:

Un proxy de l’objet est un objet qui est mis en place ou utilisé à la place du “réel” de l’objet. Un objet proxy peut ajouter un comportement de l’objet proxy sans que l’objet ne soit au courant. Dans la Doctrine 2, objets proxy sont utilisés pour réaliser plusieurs fonctions, mais principalement pour la transparence de lazy-loading.

objets Proxy avec leur chargement différé des installations aider à garder le sous-ensemble d’objets qui sont déjà dans la mémoire connectée au reste des objets. C’est une propriété essentielle car sans elle il y aurait toujours fragile partielle des objets sur les bords extérieurs de votre objet graphique.

Pour le mettre en terme simple, un objet proxy est tout simplement un objet wrapper qui étend les fonctionnalités de l’entité de base de la classe et donne du chargement différé des capacités. Lorsque vous chercher une entité à partir d’une base de données, l’entité de base est complètement initialisé, à l’exception des entités qui leur sont associées. Ces entités sont ensuite partiellement chargée et encapsulé dans un objet proxy. À ce stade, seul l’id de l’entité associée est connue. Puis, quand nous avons accès à une méthode ou propriété de ce proxy de l’objet, de la Doctrine fera une demande à la base de données à charger que bien si c’est pas déjà chargé.

Comme dit avant, ce qui se passe entièrement transparente à votre demande en raison du fait que le mandataire s’étend de votre classe d’entité. Donc, chaque fois que vous persistez ou rincez-vous les entités de la Base de données, vous n’avez pas besoin de vous inquiéter si vous avez un proxy de l’objet ou de l’entité réelle. Vous pouvez consulter le la Doctrine de la Documentation pour en savoir plus sur le fonctionnement interne de la Doctrine et de leur approche dans l’optimisation de vos requêtes.

Pourquoi des Objets Proxy?

Il n’y a vraiment pas beaucoup d’objets proxy. C’est tout simplement un objet wrapper qui se trouve en haut de l’entité de base et l’étend pour inclure le chargement différé des fonctionnalités. Le principal avantage de cette fonctionnalité est dans l’optimisation de vos requêtes de base de données. Lorsque vous êtes à l’exécution de grosses requêtes, ou l’extraction d’une grande quantité de données provenant de la base de données, la Doctrine étapes et charge uniquement les données qui sont nécessaires à la fois, réduisant ainsi le temps d’exécution. Puis, quand d’autres propriétés sont accessibles à partir de ces entités, la Doctrine va les charger à partir de la base de données si elles ne sont pas déjà chargé.

Le problème qui demeure est que vous devez savoir lorsque vous avez faire trop de demande de base de données pour charger les propriétés individuelles lorsque cela a du sens pour charger l’ensemble de l’entité elle-même. Bien sûr, cela dépend de comment le modèle de votre application de sorte qu’il paie pour savoir quand la charge entités à travers les objets proxy et quand pour charger les entités à travers le chargement agressif.

Par défaut, lorsque vous récupérer une entité à partir de la base de données, ils sont complètement initialisé, mais les entités associées sont seulement partiellement chargé. Par ailleurs, si vous connaissez l’id de l’entité de base, vous pouvez charger partiellement sans l’initialisation d’une de ses propriétés. Pour ce faire:

Ici, vous seriez définition d’une référence à l’entité cible.

Par défaut, les entités associées sont paresseux, chargé, comme l’a dit avant. Toutefois, si vous avez besoin d’eux pour être complètement initialisé, vous pouvez simplement mettre fetch: EAGER, comme indiqué ci-dessous:

Avec fetch: EAGER, au lieu d’être paresseux chargé, les entités associées seront entièrement initialisé.

 

Partielle des Objets:

Beaucoup de gens peuvent confondre Partielle des Objets avec des Objets Proxy et il est important de connaître la différence entre les deux. Partielle d’un objet est un objet dont l’état n’est pas entièrement initialisé après avoir été reconstitué à partir de la base de données et qui est déconnecté du reste de ses données.

En revanche pour des objets proxy, l’utilisation partielle des objets est généralement déconseillée. Lorsque vous travaillez avec partielle des objets, on doit être conscient de propriétés et de méthodes qui sont accessibles de manière sûre et celles qui ne le sont pas. En outre, les champs qui ne sont pas extraites de la base de données ne sera pas mise à jour par l’EntityManager est UnitOfWork même si elles sont modifiées dans vos objets. Ceci est en contraste à des objets proxy, où même si vous avez accès à une méthode ou une propriété qui ne sont pas initialisés, ils sont accessibles de manière sûre depuis ils seront chargés à partir de la base de données en raison de la procuration.

Vous pouvez en apprendre plus à propos Partielle des Objets here.

Category(s) Doctrine uvdesk
. . .

Leave a Comment

Your email address will not be published. Required fields are marked*


1 comments

  • Roman Malovanyi
    Thanks, great article!