Como estender o aplicativo de esqueleto ZF2 – entidades com foreign keys

O meu aplicativo de esqueleto ZF2 funciona bem de acordo com o guia do usuário Zend. Mas agora estou correndo em círculos tentando estender o aplicativo para que o artista de um álbum não seja mais uma string, mas uma chave estrangeira da tabela de artistas no meu db.

Criei todos os modelos, controladores, visualizações para criar, editar e visualizar artistas, o que também funciona bem. Mas como combino os dois para que minha lista de álbuns mostre o nome do artista?

Eu uso uma estratégia de hidratante como sugerido aqui ? Em caso afirmativo, como eu o implemento? O manual Zend \ Stdlib \ Hydrator \ Strategy não me diz onde registrar uma estratégia de hidratante. Sim, há um código de implementação curto:

$foo = new Foo(); $foo->setFoo("bar"); $foo->setBar("foo"); $hydrator = new ClassMethods(); $hydrator->addStrategy("foo", new Rot13Strategy()); 

Mas, onde é que isso vai? No meu AlbumController? E por que todo mundo diz que os hidratadores são “principalmente usados ​​para formas”?

Ou não é um hidratante o que estou procurando depois de tudo? Outra coisa em que continuo encontrando na minha busca por uma solução é a injeção de dependência. Mais uma vez eu encontrei esse tipo de tutorial , mas ao usar as classs A, B e C e não me dizer onde todos esses fragments de código não ajudam a entender o conceito.

Eu acho que o que eu quero fazer é bastante comum, e eu estou cambaleando que não consigo encontrar nenhum tutorial do mundo real. Depois de horas de pesquisa, tenho certeza de que estou muito perto de uma interrupção – mas não consigo mais ver e precisar de um impulso. Obrigado 🙂

Os hidrelétricos são usados ​​sempre que você precisa obter dados dentro ou fora de um object / entidade, o que pode ser ao usar um formulário, ou também ao salvar ou carregar uma entidade a partir do armazenamento.

Eu não usaria o Hydrator para preencher seus objects com objects relacionados (por exemplo, para adicionar um object antiestático ao seu álbum). Eu deixaria isso até seus serviços / mapeadores.

Aqui está um exemplo de como eu faria isso:

Album.php

 artist = $artist; } public function getArtist() { return $this->artist; } } 

AlbumHydrator.php

Isso pode variar, você usaria getters / setters ou propriedades, dê uma olhada nos hidreactores base para decidir qual rota você deseja tomar.

O seu Hydrator irá tirar os objects montados e devolver os dados que você precisaria para mostrar um formulário ou salvar a persistência, etc.

  $object->getArtist()->getId(), 'albumn_name' => $object->getAlbumName() ) } // .. etc } 

AlbumService.php

 _getAlbumMapper()->find($id); $artist = $this->_getArtistMapper()->findByAlbum($id); $album->setArtist($artist); return $album; } /** * Get the Mapper * * @return Application\Mappers\AlbumMapper */ protected function _getAlbumMapper() { return $this->getServiceManager() ->get('AlbumMapper') ; } // .. } 

Você configuraria seu serviço na configuração do Service Manager, como este:

 'AlbumService' => function($sm) { $mapper = $sm->get('AlbumMapper'); $service = new Application\Service\AlbumService(); $service->setAlbumMapper($mapper); return $service; }, 

Você então usa seu serviço para criar o gráfico de object que você precisa. Você teria mapeadores separados para cada uma das entidades, e os serviços podem usar os mapeadores para gerar os objects que você precisa.

Você geralmente teria um Hydrator para cada uma das entidades, e os mapeadores usariam aqueles para preencher os objects para você. Isso dependeria de sua implementação, você pode usar o TableGateway ou algo em vez dos mapeadores, o que ainda funcionaria ok.

Um exemplo agora de acessar seus objects quando estiver dentro do seu controlador

SomeController.php

 public function albumAction() { $id = (int) $this->params()->fromRoute('id', FALSE); if( ! $id) { // do something with errors etc .. return $this->redirect()->toRoute('default_route', array( 'controller' => 'index', 'action' => 'index' )); } $request = $this->getRequest(); $album = $this->getServiceLocator()->get('AlbumService')->find($id); $artistName = $album->getArtist()->getName(); return new ViewMdoel( 'album' => $ablum, 'artistName' => $artistName ); } 

Populando charts de objects ao usar collections é um pouco mais complicado, mas eu tenderia a usar o preguiçoso e proxies virtuais para esse tipo de configuração, que basicamente adiaria o carregamento dos objects que você precisa até que você os exija, verifique isso:

http://phpmaster.com/intro-to-virtual-proxies-1/ http://phpmaster.com/intro-to-virtual-proxies-2/