C# týden C# týden
Pořádné programy s pořádnou klávesnicí zdarma. Více zde
Pouze tento týden sleva až 80 % na C# .NET

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.5.2018 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.5.2018 13:38
Avatar
Odpovídá na MicBlack
Martin Konečný (pavelco1998):24.5.2018 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.5.2018 15:28
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Odpovídá na MicBlack
Erik Šťastný:24.5.2018 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.5.2018 15:31
Avatar
MicBlack
Člen
Avatar
MicBlack:24.5.2018 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.5.2018 15:42
Avatar
MicBlack
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
MicBlack:24.5.2018 15:43

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

 
Nahoru Odpovědět 24.5.2018 15:43
Avatar
Odpovídá na MicBlack
Martin Konečný (pavelco1998):24.5.2018 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.5.2018 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.7.2018 10:45

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

 
Nahoru Odpovědět 20.7.2018 10:45
Avatar
Odpovídá na MicBlack
Martin Konečný (pavelco1998):20.7.2018 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.7.2018 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.7.2018 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.7.2018 18:22
the cake is a lie
Avatar
Odpovídá na Petr Čech
Martin Konečný (pavelco1998):20.7.2018 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.7.2018 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.