Zadejte hledaný výraz...

PHP – začínám s MVC

pista5
verified
rating uzivatele
22. 6. 2015 18:03:46
Zdravim,
zacinam s MVC a potreboval bych poradit s nasledujici situaci.
Mam kontroler pro spravu klientu "KontrolerKlienti", ktery pri zalozeni ci editaci klenta vola metodu v modelu "SpravceKlienta", ktera bud klienta do databaze zalozi, nebo opravi...
Pak mam kontroler "KontrolerSkupiny" a k tomu model "SpravceSkupin", ktery ma zase nastarosti spravu skupin.
Kazdy klient musi mit zalozenu alespon jednu skupinu.
A ted vaham... kdyz metoda v modelu "SpravceKlienta" zjisti, ze klient neexistuje a ma ho zalozit, je spravne v tomto modelu udelat instanci modelu "SpravceSkupin" a zavolat metodu pro zalozeni prvni skupiny, nebo by se melo zalozeni skupiny udelat v "KontrolerKlienti" hned po zalozeni klienta?
Je tedy principialne spravne, abych v modelu delal instanci jineho modelu a spoustel jeho metodu, nebo by se instance vsech modelu a vykonavani metod mely delat jen v kontroleru?
Diky za radu
22. 6. 2015 18:03:46
https://webtrh.cz/diskuse/php-zacinam-s-mvc/#reply1121184
Martin
verified
rating uzivatele
(62 hodnocení)
22. 6. 2015 19:48:06
Určitě bych to dal do kontroleru. To je čistší řešení.
22. 6. 2015 19:48:06
https://webtrh.cz/diskuse/php-zacinam-s-mvc/#reply1121183
ViPErCZ
verified
rating uzivatele
(21 hodnocení)
22. 6. 2015 20:11:23
Tak tak, ale podle mě je to ještě lepší oddělit do nějaké další mezivrstvy.
22. 6. 2015 20:11:23
https://webtrh.cz/diskuse/php-zacinam-s-mvc/#reply1121182
pista5
verified
rating uzivatele
23. 6. 2015 09:09:15
Diky za reakci... muzes mi prosim lehce naznacit, co myslis tim oddelit do mezivrstvy?
23. 6. 2015 09:09:15
https://webtrh.cz/diskuse/php-zacinam-s-mvc/#reply1121181
Filip T.
verified
rating uzivatele
(2 hodnocení)
23. 6. 2015 09:47:08
Řekl bych, že o tohle by se měl starat controller.
Metoda v modelu by měla vracet controlleru informaci zda se podarilo klienta vytvorit - pokud vrátí "true / id uživatele", pak by měl controller dále volat "SpravceSkupin" s ID daného uživatele a přidělit mu práva.
* každý model by se měl starat o své "problémy" a nešahat jinam :)
23. 6. 2015 09:47:08
https://webtrh.cz/diskuse/php-zacinam-s-mvc/#reply1121180
ViPErCZ
verified
rating uzivatele
(21 hodnocení)
23. 6. 2015 15:38:20
No Controller nechť je čistě kontroler a stará se tedy jen o předávání informací mezi modely a zobrazením. Jenže v tvém případě máš nějakou unikátní bussines logiku, kterou chceš vložit do modelu nebo do controlleru.
Do modelu ne, protože to je stupidní datovej kontejner a nechť pracuje řekněme vždy s jednou logikou (tabulkou).
Do controlleru už jo, ale bude-li toho hodně, tak to bude nepřehledné. Když se to zapouzdří do další třídy, tak se s tím dá lépe dál pracovat. Tedy něco jako UserManager, který bude pracovat s modely pro vytvoření uživatele. Tento Manager se pak bude volat z controlleru. Tedy mezivrstva mezi controllerem a modelem.
Napsal pista5;1204248
Diky za reakci... muzes mi prosim lehce naznacit, co myslis tim oddelit do mezivrstvy?
23. 6. 2015 15:38:20
https://webtrh.cz/diskuse/php-zacinam-s-mvc/#reply1121179
pista5
verified
rating uzivatele
24. 6. 2015 09:05:03
Jasne, chapu... diky moc vsem...
24. 6. 2015 09:05:03
https://webtrh.cz/diskuse/php-zacinam-s-mvc/#reply1121178
Vytvářet instanci modelu uvnitř jiného modelu je principiálně špatně. Samozřejmě je na tobě, jak to vyřešíš, ale je dobré si pamatovat, že metoda modelu mi má vrátit pouze nějaká surová data, která controller získá (a případně vytvoří novou instanci jiného modelu a předá tyto data jemu). Snaž se psát metody objektu co nejjednodušší. Říká se, že pokud má metoda více než 20 řádků, pak je napsána špatně :-) Ale podle mě je to blbost, důležité je psát kód tak, abych se v něm vyznal nejen já, ale i lidi, které do kódu kouknou. S tím souvisí i pojmenování controlleru a názvosloví obecně. Chápu, že máš rád češtinu, ale je dobré udělat si nějaké vlastní standardy a dodržovat je (nebo se inspirovat u běžně používaných) . Například pojmenovávat controllery a modely srozumitelně "CustomerController" nebo "getCustomer($customerId)", ale to je zase jiné téma ...
Jinak, to co tady někteří nakousli ohledně oddělení do další mezivrstvy, tak například ve frameworku Symfony2 se to řeší tak, že pro databázové záležitosti existují repository (de facto modely pro operace s databází), pro další záležitosti slouží services (služby, které se dají volat z controlleru. Pokud budu chtít parsovat data, která získám z modelu - použiji mezivrstvu, kam přesunu logiku dané věci. Služba mi prostě zprocesí data a controller žádnou logiku nevykonává, pouze se stará o celkové fungování).
Obecně tento princip je super v tom, že kód se stává hrozně přehledný a každá metoda objektu má kolikrát pouze třeba 20-30 řádků. A pokud si říkáš, že to nejde .. tak věř, že jde i na hodně velkých aplikacích :-)
---------- Příspěvek doplněn 01.07.2015 v 22:27 ----------
Samozřejmě ti nic nebrání používat v modelech DependencyInjection, názorná ukázka:
class MyCustomModel
{
/**
* @return array
*/
public function mySomeAction() {
return array('sample', 'data');
}
}
class MySecondModel
{
protected $customModel;
/**
* @param MyCustomModel $model Předání modelu přímo do konstruktoru
*/
public function __construct(MyCustomModel $model)
{
$this->customModel = $model;
}
/**
* @return array
*/
public function mySecondAction()
{
return $this->customModel->mySomeAction();
}
}
class CustomController
{
public function homepageAction()
{
$customModel = new MyCustomModel();
$secondModel = new MySecondModel($customModel);
print_r( $secondModel->mySecondAction() );
}
}
1. 7. 2015 22:13:56
https://webtrh.cz/diskuse/php-zacinam-s-mvc/#reply1121177
Pro odpověď se přihlašte.
Přihlásit