Paweł
Koralewski
starszy programista,
wiem ile nie wiem
Temat: [Sf2] model
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.
Karol S. System Engineer
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
starszy programista,
wiem ile nie wiem
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.
Przemek Czekaj Programista PHP
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. System Engineer
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
Software Architect,
XSolve
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
starszy programista,
wiem ile nie wiem
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. Programista
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.
