Paweł Koralewski

Paweł Koralewski architekt aplikacji,
team leader

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.

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

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.

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

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

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
<?php

namespace Alden\xxx\Entity;

class Product {

public $name;

}

?>
oraz \Model\ProductMapper.php
<?php

namespace Alden\xxx\Model;

use Alden\xxx\Entity\Product;

class ProductManager {

function ax() {
return array(
new Product('p1'),
new Product('p2'),
new Product('p3')
);
}

}

?>
zaś w kontrolerze
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.

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.



Wyślij zaproszenie do