konto usunięte

Temat: Przesiadka ZF1 -> ZF2 - kilka pytań

Czołem!

Postanowiłem przerzucić się na ZF2, bo niewielkiej praktyce z ZF1. Powstało w mojej głowie w związku z tym nieco wątpliwości, będę wdzięczny jak pomożecie mi je rozwiać, głównie związane z modelem.

W ZF1 nie miałem potrzeby spędzania za dużo czasu w warstwie M, odpalałem ZFTool z opcją db-table.from-database i w kontrolerze jechałem z:

$x = Application_Model_DbTable_Test();
$x->blablabla


A tutaj, patrząc po przykładzie, to jest jakaś czarna magia, najpierw ręczne tworzenie obiektu, później pisanie funkcji modelu. Nie można tego zautomatyzować, tak jak w jedynce?

Druga sprawa to użycie w kontrolerze
$sm = $this->getServiceLocator();
$this->albumTable = $sm->get('Album\Model\AlbumTable');

Rozumiem, że unikamy jawnego tworzenia obiektów, ale przekazywanie nazwy jako string? Jest jakieś IDE, które potrafi organizować podpowiedzi do tego? Jak była to klasa, to praktycznie każde narzędzie to ogarniało, nie można tego jakoś zastąpić?

Przy okazji automatycznego tworzenia modeli, chociaż podchodzę sceptycznie do ORM, to spróbowałem z Doctrine. Generalnie spoko, tylko dlaczego do każdego kontrolera muszę doklejać kod, który przywołuje model w kilka linii, nie można tego jakoś zrobić globalnie?

public function getEntityManager()
{
if (null === $this->em) {
$this->em = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default');
}
return $this->em;
}


To chyba tyle pytań na razie, z góry dzięki za wskazówki.Ten post został edytowany przez Autora dnia 25.10.15 o godzinie 11:47

Temat: Przesiadka ZF1 -> ZF2 - kilka pytań

Nie pracowałem z ZF2 ale wydaje mi się że część pytań, które zadałeś nie jest specyficzna dla ZF2, dlatego drobne podpowiedzi do przetestowania:

- odnośnie podpowiadania przez IDE, to rzeczywiście może być z tym kłopot, ale zakładam że w klasie kontrolera masz zadeklarowaną zmienną $albumTable to udokumentowanie tej zmiennej powinno uruchomić podpowiadanie, np.:

/**
* @var Album\Model\AlbumTable
*/
private $albumTable;


- kwestia wołania getEntityManager() w każdym kontrolerze może być rozwiązana w bardzo prosty sposób, tzn. tworzysz klasę dziedziczącą po bazowej klasie kontrolera zawierającą metodę getEntityManager a następnie wszystkie kotrolery zamiast dzieczyć po klasie bazowej kontrolera ZF zmieniasz na dziedziczące po Twojej klasie, dzięki temu każdy kontroler będzie dziedziczył po klasie baziowej ZF poprzez Twoją nową klasę a dodatkowo w nowej klasie możesz dostarczać metody/zmienne wspólne dla wszystkich kontrolerów w jednym miejscu
Paweł Malisak

Paweł Malisak PHP Developer

Temat: Przesiadka ZF1 -> ZF2 - kilka pytań

Druga sprawa to użycie w kontrolerze
$sm = $this->getServiceLocator();
$this->albumTable = $sm->get('Album\Model\AlbumTable');

Rozumiem, że unikamy jawnego tworzenia obiektów, ale przekazywanie nazwy jako string? Jest jakieś IDE, które potrafi organizować podpowiedzi do tego? Jak była to klasa, to praktycznie każde narzędzie to ogarniało, nie można tego jakoś zastąpić?

możesz np. tak

$sm->get(AlbumTable::class);


ale najlepiej robić do wszystkiego fabrykę i wtedy


// fabryka
class AlbumTableFactory implements FactoryInterface
{
const TABLE_NAME = 'application.model.album_table';

// module.config.php

'service_manager' => [
'factories' => [
AlbumTableFactory::TABLE_NAME=> AlbumTableFactory::class,
// ...

// ...
$sm->get(AlbumTableFactory::TABLE_NAME);


Przy okazji automatycznego tworzenia modeli, chociaż podchodzę sceptycznie do ORM, to spróbowałem z Doctrine. Generalnie spoko, tylko dlaczego do każdego kontrolera muszę doklejać kod, który

Tak się nie powinno robić, kontroler nie powinien korzystać z serviceLocatora, najlepiej tworzyć kontrolery przez fabryką i w konstruktorze wstrzykujesz wszystko co potrzebujesz. I nie wstrzykujesz entityManagera tylko repozytoria, które są Ci potrzebne, a najlepiej przygotować serwis ( który też inicjujesz fabryką, który ma wstrzyknięte potrzebne tutaj repozytoria ) i na nim operujesz ;)

Dzięki temu uniezależniasz się od doctrine, zmienisz sobie kiedyś doctrine na co chcesz i nie musisz nic dotykać w kontrolerach. Serwisy, które przekazujesz do kontrolera są także niezależne od doctrine bo operują na repozytoriach.Ten post został edytowany przez Autora dnia 29.10.15 o godzinie 10:18

Następna dyskusja:

Routing - kilka pytań




Wyślij zaproszenie do