233K Views

Leer Proxy Objecten en Lui Laden

Leer is een Object Relational Mapper (ORM) dat ligt op de top van een krachtige Database Abstraction Layer (DBAL). Wanneer je bezig bent met Symfony (+ Leer) voor een tijdje, bent u gebonden te zijn gekomen over de Leer van de Proxy-Objecten.

Als je ooit hebt gegenereerd, een entiteit die verbonden is met een andere entiteit, en hebben een kijkje genomen op de argumenten voor de functie verband met die entiteit in de gegenereerde entiteit bestand, zou je hebben gemerkt dat de extra backslash voor de type-declaratie voor het argument van de functie. In dit geval, ‚\‚ voor ‚ProxyBundle\Entity\Subjects‚. Als je net als mij, je hebt je misschien afgevraagd over dat backslash, en je moet weten over de Leer van de Proxy-Objecten te begrijpen is het doel.

Op een algemene dag-tot-dag basis, een ontwikkelaar moet niet worden gehinderd door een proxy-object, ze moeten transparant zijn voor uw code. En Leer doet dat perfect. Ik herinner me de eerste keer dat ik echt moest een kijkje nemen bij hen was, toen liep ik tegen een probleem met de cache. Je hoeft niet te weten welke Proxy-Objecten zijn en wat ze helpen te bereiken, maar het is zeker handig om te weten. Dat is waar we het vandaag over hebben.

Leer Proxy-Objecten:

Leer de Proxy-Objecten zijn voornamelijk gebaseerd op twee modellen: Proxy-Patroon, en Lui Patroon Laden.

Volgens de documentation:

Een proxy-object is een object dat in de plaats gezet of gebruikt in plaats van de „echte“ object. Een proxy object kan gedrag toevoegen aan het object dat wordt geproxied zonder dat het object zich bewust van te zijn. In de Doctrine 2, proxy-objecten zijn gebruikt voor het realiseren van verschillende functies, maar vooral voor transparante lui-laden.

Proxy-objecten met hun luie-laden voorzieningen helpen om de deelverzameling van de objecten die reeds in het geheugen is aangesloten op de rest van de objecten. Dit is een essentiële eigenschap omdat het zonder dat zou er altijd kwetsbaar gedeeltelijke objecten aan de buitenste randen van uw object graph.

Om het in eenvoudige termijn, een proxy-object is gewoon een wrapper object dat zich uitstrekt van de functionaliteit van de basis entiteit klasse en geeft het luie het laden van vaardigheden. Wanneer u aan om een entiteit uit een database, de basis entiteit is volledig geïnitialiseerd zijn, met uitzondering van de entiteiten die worden geassocieerd met het. Deze entiteiten zijn dan gedeeltelijk geladen en verpakt in een proxy-object. Op dit punt, alleen de id van de bijbehorende entiteit is bekend. En als we dan verdere toegang van een methode of eigenschap van deze proxy-object, Leer zal een verzoek aan de database laden van die eigenschap als het niet al geladen.

Zoals gezegd, dit gebeurt volledig transparant voor uw toepassing te wijten aan het feit dat de volmacht strekt zich uit van uw entiteit klasse. Dus wanneer u aanhouden of spoel uw diensten aan de Database, hoeft u zich geen zorgen hoeft te maken over de vraag of u een proxy-object of de feitelijke entiteit. U kunt de Doctrine Documentation meer weten over het binnenwerk van Leer en hoe ze in het optimaliseren van query ‚ s.

Waarom Proxy-Objecten?

Er is echt niet veel te proxy objecten. Het is gewoon een wrapper object ligt op de top van de basis entiteit en breidt het zijn lui-laden functionaliteiten. Het belangrijkste voordeel van deze functionaliteit biedt, is in het optimaliseren van uw database-query ‚ s. Als je het uitvoeren van grote query ‚ s, of het ophalen van een grote hoeveelheid gegevens uit de database, Leer stappen in en laadt alleen de gegevens die nodig is bij de tijd, het verminderen van de uitvoering. Vervolgens bij de verdere eigenschappen zijn toegankelijk van deze entiteiten, Leer zal ze laden van de database als ze niet zijn reeds geladen.

Het probleem dat blijft is dat je nodig hebt om te weten wanneer je het maken van te veel data base verzoek te laden individuele eigenschappen wanneer het zinvol is om te laden van de gehele onderneming zelf. Natuurlijk, dit is afhankelijk van hoe je het model van uw toepassing het loont dus om te weten wanneer te laden entiteiten via proxy objecten en bij het laden van diensten door te eager ophalen.

Standaard, als je op te halen van een entiteit uit de database, ze zijn volledig geïnitialiseerd, maar de bijbehorende entiteiten zijn slechts gedeeltelijk geladen. Bovendien, als u weet dat de id van base entiteit, kunt u gedeeltelijk laden zonder het initialiseren van een van haar eigenschappen. Om dit te doen:

Hier, je zou het instellen van een verwijzing naar het doel entiteit.

Standaard, verbonden rechtspersonen lui zijn geladen, zoals gezegd. Echter, als u ze nodig hebt geïnitialiseerd worden volledig, je kan gewoon instellen fetch: EAGER, as shown below:

With fetch: EAGER, in plaats van lui geladen, de bijbehorende entiteiten worden volledig is geïnitialiseerd.

 

Gedeeltelijke Objecten:

Veel mensen kunnen verwarren Gedeeltelijke Objecten met Proxy-Objecten en het is belangrijk om te weten het verschil tussen de twee. Een gedeeltelijke object is een object waarvan de status niet volledig is geïnitialiseerd na te zijn samengesteld uit de database en die is losgekoppeld van de rest van de gegevens.

In tegenstelling tot de proxy-objecten, het gebruik van partiële objecten is over het algemeen afgeraden. Bij het werken met partiële objecten, moet men zich bewust zijn van de eigenschappen en methoden zijn veilig toegankelijk en degenen die dat niet zijn. Bovendien, velden die niet zijn opgehaald uit de database niet bijgewerkt door de EntityManager de UnitOfWork zelfs als ze veranderd in uw objecten. Dit is in tegenstelling tot de proxy-objecten, waar zelfs als u de toegang van een methode of eigenschap die niet zijn geïnitialiseerd, ze zijn veilig toegankelijk zijn, omdat ze zullen worden geladen uit de database door de proxy.

U kunt meer informatie over Gedeeltelijke Objecten 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!
  • css.php