Paweł
Koralewski
architekt aplikacji,
team leader
Karol
S.
Software Engineer @
VMware, Palo Alto,
USA
Temat: [Sf2] model
W doctrine2, z którego zapewne korzystasz zaimplementowany został wzorzec repozytorium. W tym celu tworzysz odpowiednią klasę dziedziczącą po EntityRepository.tutaj więcej o tym na stronie doctrine2: http://www.doctrine-project.org/docs/orm/2.0/en/refere...
a tutaj repozytorium w przykładowej aplikacji symfony: https://github.com/knplabs/KnpIpsum/blob/master/src/Knp...
Paweł
Koralewski
architekt aplikacji,
team leader
Temat: [Sf2] model
Karol S.:
W doctrine2, z którego zapewne korzystasz
A jeśli nie korzystam z Doctrine? To nie jest obligatoryjne. Wykorzystuję bazę PgSQL, z widokami i procedurami składowanymi do operacji na danych i szybciej mi napisać kwerendę z palca.
konto usunięte
Temat: [Sf2] model
Paweł, ładuj sobie gdzie Ci się żywnie podoba, jak masz jakiś Bundle, to zrób sobie w nim katalog Model/TableEntity.php i w nim ładuj metody które będą wywoływać procedury pl/pgsql.Pozdrawiam :)
Karol
S.
Software Engineer @
VMware, Palo Alto,
USA
Temat: [Sf2] model
Paweł Koralewski:
Karol S.:
W doctrine2, z którego zapewne korzystasz
A jeśli nie korzystam z Doctrine? To nie jest obligatoryjne.
Oczywiście, że nie jest :) Ale ponieważ 3/4 projektów na sf2 opartych jest na doctrine2, a Ty nie napisałeś, że z niego nie korzystasz, to tak założyłem. No i tak jak powiedział Przemek, skoro jedziesz z palca, to jedź tak dalej i wrzuć sobie to gdzie masz ochotę, byle by miało ręce i nogi.
Wojciech
Sznapka
CTO @ STS Zakłady
Bukmacherskie
Temat: [Sf2] model
Paweł Koralewski:
Gdzie się powinien znajdować plik klasy z funkcjami operującymi na danych? Chcę wyrzucić to z kontrolera, a w przykładach wszystko siedzi właśnie w kodzie akcji w kontrolerze. Czyli w podkatalogu MyBundle/Entity mam np. klasę Product i potrzebuję mieć zestaw funkcji operujących na tym produkcie, z których część będzie wykonywać operacje na bazie danych.
Paweł, moim zdaniem najlepiej pakować to wszystko w klasy Managerów, podobnie jak uczynili to w FOSUserBundle https://github.com/FriendsOfSymfony/FOSUserBundle/blob/...
1. Tworzysz sobie interfejs dla managera
2. Przez dependency injection przekazujesz odpowiednie serwisy (np EntityManager lub DocumentManager)
3. tworzysz implementację dla odpowiedniej warstwy modeli (encje, dokumenty, czysty sql, operacje na plikach xml, dostęp po API)
Dzięki takiemu podejściu masz ładną separację warstw i optymalną rozszerzalność out-of-the-box. Ja stosuję to w moich projektach i sprawdza się bardzo dobrze.
Paweł
Koralewski
architekt aplikacji,
team leader
Temat: [Sf2] model
Wybacz moje może proste pytania, nie czuję się mocny jeszcze w Sf2 :(Wojciech Sznapka:
1. Tworzysz sobie interfejs dla managera
po co?
2. Przez dependency injection przekazujesz odpowiednie serwisy (np EntityManager lub DocumentManager)
Gdzie je przekazuję?
3. tworzysz implementację dla odpowiedniej warstwy modeli (encje, dokumenty, czysty sql, operacje na plikach xml, dostęp po API)
Np. dla uproszczonego przypadku: mam produkty, które mają jedyną cechę - nazwa. Zrobiłem w \Entity\Product.php
<?phporaz \Model\ProductMapper.php
namespace Alden\xxx\Entity;
class Product {
public $name;
}
?>
<?phpzaś w kontrolerze
namespace Alden\xxx\Model;
use Alden\xxx\Entity\Product;
class ProductManager {
function ax() {
return array(
new Product('p1'),
new Product('p2'),
new Product('p3')
);
}
}
?>
use Alden\xxx\Model\ProductManager;
...
public function ffAction() {
$m = new ProductManager();
$x = $m->ax();
var_dump($x);
return $this->render('xxx:Default:ff.html.twig');
}
Co powinienem zmienić?Paweł Koralewski edytował(a) ten post dnia 02.11.11 o godzinie 00:15
Alan Gabriel
B.
Software Engineer,
IFX
Temat: [Sf2] model
Paweł Koralewski:
Gdzie się powinien znajdować plik klasy z funkcjami operującymi na danych?
W klasach serwisowych.
Najlepiej zachowując zasadę Single responsibility czyli nie wrzucać wszystkiego do jednej klasy, tylko logicznie porozdzielać na kilka.
Paweł Koralewski:
Wojciech Sznapka:1. Tworzysz sobie interfejs dla managera
po co?
Po to, żebyś mógł podmieniać implementację w czasie runtime. Przydatne do testów. Aczkolwiek nie wymagane... po prostu dobra praktyka i podwalina DI.
2. Przez dependency injection przekazujesz odpowiednie serwisy (np EntityManager lub DocumentManager)
Gdzie je przekazuję?
Tam gdzie uruchamiasz swoje modele, najczęściej do akcji, ale może to też być komenda CLI.
3. tworzysz implementację dla odpowiedniej warstwy modeli (encje, dokumenty, czysty sql, operacje na plikach xml, dostęp po API)
Np. dla uproszczonego przypadku: mam produkty, które mają jedyną cechę - nazwa. Zrobiłem w \Entity\Product.php
[...]
Sorry, ale ten przykład jest do bani. Spróbuj sklecić taki, który jasno nawiązuje do meritum Twojego pytania i na postawie którego można określić rozwiązanie.
Podobne tematy
-
Symfony » zarządzanie modułami stworzonymi przez... -
-
Symfony » [Sf2] własny User Provider -
-
Symfony » [sf2] odpowiednik sfPLValidatorsPlugin -
-
Symfony » [Sf2] formularze i D2 - update foreign key w skojarzonym... -
-
Symfony » [SF2] Problem z annotacją i validatorem -
-
Symfony » [sf2] PHPPDF + utf-8 -
-
Symfony » [SF2] Integracja FOSUserBundle + FOSFacebookBundle -
-
Symfony » [sf2] phpdoc w netbeans -
-
Symfony » [Sf2] zmienne sesyjne w mapperze -
-
Symfony » [Sf2] własna autentykacja -
Następna dyskusja: