41K Views

Doutrina Objetos de Proxy e Carregamento lento

Updated 10 December 2021

Facebook Linkedin

Doutrina é um Object Relational Mapper (ORM) que fica no topo de um poderoso Banco de dados (Camada de Abstração de DBAL). Quando você foi trabalhar com o Symfony (+ Doutrina) por um tempo, você é obrigado a ter vindo através da Doutrina Objetos de Proxy.

Se você já gerou uma entidade que está associada a outra entidade, e tem tido um olhar argumentos para a função associada com a entidade gerada entidade de arquivo, você pode ter observado que a barra invertida extra antes de a declaração de tipo para a função de argumento. Neste caso, ‘\‘ antes ‘ProxyBundle\Entidade\Sujeitos‘. Se você gosta de mim, você pode estar se perguntando sobre o que de barra invertida, e o que você precisa saber sobre a Doutrina de Proxy de Objetos para compreender a sua finalidade.

No geral, o dia-a-dia, um programador não deve ser incomodado por um objecto de proxy, eles devem ser transparentes para o seu código. E a Doutrina que realiza perfeitamente. Lembro-me da primeira vez que eu realmente tinha que ter um olhar para eles foi quando eu encontrei um problema com o cache. Você não precisa saber que Objectos de Proxy são e o que elas ajudam a realizar, mas com certeza ajuda para saber. É isso que nós vamos falar hoje.

a Doutrina Objetos de Proxy:

Doutrina Objetos de Proxy são baseados, principalmente, em dois Padrões de Projeto: Padrão de Proxy, e o Padrão de Carregamento lento.

De acordo com o documentation:

de Um objecto de proxy é um objeto que é colocado no local ou utilizado em vez do “real” do objeto. Um objecto de proxy pode adicionar comportamento para o objeto que está sendo intermediada por proxy, sem que o objeto de estar consciente. Na Doutrina 2, objetos de proxy são usados para realizar várias funções, mas, principalmente, transparente para a lazy-loading.

objectos de Proxy com o seu carregamento lento instalações de ajuda para manter o subconjunto de objetos que já estão na memória conectada ao resto dos objetos. Esta é uma propriedade essencial, já que sem ele não seria sempre frágil parcial objetos nas bordas externas do seu objeto gráfico.

Para colocá-lo no termo simples, um objeto proxy é simplesmente um objeto wrapper que estende a funcionalidade da base de entidade de classe e fornece-o com carregamento lento habilidades. Quando você buscar uma entidade de um banco de dados, a entidade base está totalmente inicializado, exceto as entidades que estão associadas a ele. Essas entidades são, em seguida, parcialmente carregados e envolto em um objeto de proxy. Neste ponto, apenas a identificação do associado da entidade é conhecida. Então, quando nós ainda acessar um método ou propriedade deste objeto proxy, Doutrina irá fazer uma solicitação para o banco de dados para carregar essa propriedade se não estiver já carregado.

Como disse antes, isso acontece totalmente transparente para o aplicativo, devido ao fato de que o proxy se estende de sua entidade de classe. Assim, sempre que você persistem, ou lavar o seu entidades para o Banco de dados, você não precisa se preocupar se você tem um objecto de proxy ou a entidade real. Você pode consultar o a Doutrina de Documentação para saber mais sobre os detalhes internos de Doutrina e forma de abordar a otimizar suas consultas.

Por Objetos de Proxy?

Não há realmente muito para objectos de proxy. É simplesmente um objeto wrapper que fica na parte superior da base da entidade e se estende para incluir carregamento lento de funcionalidades. A principal vantagem esta funcionalidade fornece é no sentido de optimizar os seus consultas de banco de dados. Quando você está executando grandes consultas, ou a obtenção de uma grande quantidade de dados a partir do banco de dados, Doutrina passos e carrega apenas os dados que é necessário, no momento, reduzindo o tempo de execução. Em seguida, quando outras propriedades são acessados a partir destas entidades, a Doutrina vai carregá-los a partir do banco de dados se eles já não são carregados.

O problema que permanece é o que você precisa saber quando você está fazendo muitas solicitação de banco de dados para carregar propriedades individuais quando faz sentido para carregar toda a entidade em si. Claro, isso depende de como você o modelo de seu aplicativo para que ele paga para saber quando a carga de entidades por meio de objetos de proxy e quando carregar entidades por meio de busca antecipada (eager fetching.

Por padrão, quando você buscar uma entidade do banco de dados, eles são totalmente inicializada, mas as entidades associadas são apenas parcialmente carregada. Além disso, se você souber o id de entidade base, parcialmente, você pode carregá-lo sem inicializar qualquer uma das suas propriedades. Para fazer isso:

Aqui, você seria a definição de uma referência para a entidade de destino.

Por padrão, entidades associadas são preguiçosos carregado, como disse antes. No entanto, se você precisar deles para ser inicializado completamente, você pode simplesmente definir fetch: ANSIOSO, como mostrado abaixo:

Com fetch: ANSIOSO, em vez de ser preguiçoso carregado, as entidades associadas será totalmente inicializado.

Parcial Objetos:

Muita gente pode confundir Parcial Objetos com Objetos de Proxy e é importante saber a diferença entre os dois. Parcial de um objeto é um objeto cujo estado não é totalmente inicializado após ser reconstituído a partir do banco de dados e que está desconectada do restante de seus dados.

Em contraste com objetos de proxy, o uso parcial de objetos é geralmente desencorajado. Quando se trabalha com parciais de objetos, a pessoa precisa estar ciente de propriedades e métodos que são totalmente acessíveis e aqueles que não o são. Além disso, os campos que não são recuperados do banco de dados não serão atualizados pelo EntityManager do UnitOfWork mesmo se eles forem alterados em seus objetos. Isto está em contraste com objetos de proxy, onde mesmo se você acessar um método ou propriedade que não sejam inicializados, eles estão seguros e acessíveis, uma vez que vai ser carregado a partir do banco de dados devido ao proxy.

Você pode aprender mais sobre Parcial Objetos 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!