Diskuze: MVC - Wrappování common fukncí

PHP PHP MVC - Wrappování common fukncí American English version English version

Aktivity (1)
Avatar
MicBlack
Člen
Avatar
MicBlack:24. května 13:38

Ahoj,

při tvorbě stránek jsem právě narazil na to, že se mi v jednotlivých kontrolerech docela opakuje kód. tak mě napadlo ty jednotlivé fukce, které jsou pro všechny kontrolery společné, nějak zawrappovat. Zatím mě úplně nenapadlo efektivní a korektní řešení, tak jsem se chtěl zeptat - zda s tím někdo máte zkušenost a jak to případně řešíte?

Přijde mi zbytečné mít 5 kontrolerů a v každém z nich mít napsanou logiku na plnění dat do view, když je pro všechny kontrolery stejná.

Napadlo mě udělat nějaký CommonController, který by ty funkce wrappoval. Nicméně pak mě zastavilo to, že ten CommonController může dědit pouze z jednoho Controller a ne z těch 5, ačkoliv jsou jejich rozhraní stejná.

Díky za případné tipy.

 
Odpovědět 24. května 13:38
Avatar
Odpovídá na MicBlack
Martin Konečný (pavelco1998):24. května 15:28

Ahoj, implementace vzoru MVC se dá udělat na hodně způsobů. Bylo by možné nějak nastínit, jak vypadají tvé controllery?

Nahoru Odpovědět 24. května 15:28
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Odpovídá na MicBlack
Erik Šťastný:24. května 15:31

Když to tak čtu nemělo by spíše těch 5 kontrolerů dědit z CommonControlleru a ne naopak?

 
Nahoru Odpovědět 24. května 15:31
Avatar
MicBlack
Člen
Avatar
MicBlack:24. května 15:42

Jasně, snad se to trochu osvětlí.

Moje implementace je následující:

Kontroler
- SmerovacKontroler extends Kontroler
- ClankyKontroler extends Kontroler
- KontaktKontroler extends Kontroler
- HlavniStranka­Kontroler extends Kontroler

Kontroler definuje abstract metodu 'zpracuj', kterou child kontrolery implementují. Právě v té metodě 'zpracuj' mám uvnitř jednotlivých kontrolerů logiku, která je ve všech kontrolerech stejná - dle id dotáhne data a nasetuje proměnné do view:

$this->data['titulek'] = $dotahniLabel['title'];
$this->data['obsah'] = $dotahniLabel['text'];

Je to srozumitelnější? To zawrapování se mi moc nechce dělat tak, že si vytvoří php soubor a tam tu logiku hodím a pak dám jenom

include()

. Radši bych to řešil nějak objektově v rámci MVC, ale zatím mě nenapadlo jak.

 
Nahoru Odpovědět 24. května 15:42
Avatar
MicBlack
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
MicBlack:24. května 15:43

Doplněno. Snad to trochu osvětlí záměr.

 
Nahoru Odpovědět 24. května 15:43
Avatar
Odpovídá na MicBlack
Martin Konečný (pavelco1998):24. května 16:49

Je v něčem problém udělat si nějaký BaseController, který bude dědit od Kontroler, a všechny ty další controllery od toho Base? Zřejmě je to řešené pomocí místního tutoriálu, u kterého nevím, jak přesně vypadá, ale nešlo by udělat do toho controlleru nějakou funkci, která se zavolá?

Něco jako

class BaseController extends Controller
{

        public function zpracuj()
        {
                $this->data['titulek'] = $dotahniLabel['title'];
                $this->data['obsah'] = $dotahniLabel['text'];
        }

}

class ContactController extends BaseController
{

        public function zpracuj()
        {
                parent::zpracuj();

                // naplnění šablony dalšími daty
        }

}
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 24. května 16:49
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
MicBlack
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
MicBlack:20. července 10:45

Ještě mě napadlo - nešlo by použít Traits?

 
Nahoru Odpovědět 20. července 10:45
Avatar
Odpovídá na MicBlack
Martin Konečný (pavelco1998):20. července 18:03

S traity bych byl hodně opatrný. Z hlavy neznám přesnou definici, proč byly do jazyka přidány, ale dají se využít i špatným způsobem, i když se to zdá jako super nápad. Technicky by to určitě použít šlo, intuitivně si myslím, že to není zrovna správný případ využití :D

Nahoru Odpovědět 20. července 18:03
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Petr Čech
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Petr Čech:20. července 18:22

Pokud to použiješ rozumně, lze pomocí trait a interface dosáhnout jakési vícenásobné dědičnosti

Nahoru Odpovědět  +1 20. července 18:22
the cake is a lie
Avatar
Odpovídá na Petr Čech
Martin Konečný (pavelco1998):20. července 18:34

To máš pravdu, jen je s tím potřeba opatrně, protože použití traits lehce svádí k tomu, že si "inlcuduji" do tříd různé funkcionality a není to logicky správně :D U lidí, kteří s OOP nemají delší zkušenosti, bych se toho trochu bál. Kombinace s interfaces mě ale popravdě nenapadla, s těmi by to mohlo být o něco lepší. Díky za tip.

Nahoru Odpovědět  +2 20. července 18:34
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.