modules en mvc
Stel dat je een module hebt met een eigen controller, model en views en eigen classes. Dan zou de directorystructuur er zo uit kunnen zien:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
/modules/article/classes/article.php
/articlecollection.php
/controllers/controller.php
/models/model.php
/views/article.phtml
/articlecollection.phtml
Alleen nu vraag ik me af... ik ben gewend dat een controller action wordt aangeroepen op basis van de opgevraagde url. Hoe werkt dat nu met zo'n controller van een module? Roep je die gewoon vanuit de code aan?
Stel je wilt op de homepage een article tonen. Krijg je dan een indexController met een indexAction() waarin je vervolgens de controller van de module aanroept? Dus zoiets? (code is fake code, het gaat even om het idee)
Code (php)
En dan in homepage.phtml:
Is dat hoe het (ongeveer) zou moeten?
Gewijzigd op 14/01/2013 16:14:25 door Ozzie PHP
En tevens hou ik niet zo van de map classes. Plaats klasse onder een groep waarin ze thuis horen, in dit geval bijv. Article.
"En het moet ook niet controller/controller.php zijn, maar bijv. controller/IndexController.php"
Kan 1 module eigenlijk meerdere controllers bevatten?
"En tevens hou ik niet zo van de map classes. Plaats klasse onder een groep waarin ze thuis horen, in dit geval bijv. Article."
Oké, maar waar moet ik die classes dan plaatsen? Wel in de module toch? Bedoel je dan dat ik in de module een map "Article" moet maken?
"Nee, je hebt alleen nog maar controllers in modules nergens anders."
Dit is interessant. Kun je eens uitleggen wat je hiermee bedoelt? Stel dat ik op mijn homepage banners en articles wil tonen. Dit zijn 2 modules. Mijn idee was dan een indexController te hebben met een indexAction en dat je dan in die indexAction de beide modules aanroept. Hoe zou jij dat dan doen?
Quote:
Kan 1 module eigenlijk meerdere controllers bevatten?
Had je die vraag al niet 4 keer eerder gesteld? Nogmaals: Ja
Quote:
Oké, maar waar moet ik die classes dan plaatsen? Wel in de module toch? Bedoel je dan dat ik in de module een map "Article" moet maken?
Ja, bijv. module/ArticleModule/Article/ArticleCollection.php
Quote:
Kun je eens uitleggen wat je hiermee bedoelt? Stel dat ik op mijn homepage banners en articles wil tonen. Dit zijn 2 modules. Mijn idee was dan een indexController te hebben met een indexAction en dat je dan in die indexAction de beide modules aanroept. Hoe zou jij dat dan doen?
Wat ik er mee bedoel is dat je dus niks anders hebt dan modules. Dus als jij een indexAction wilt doen heb je bijv. een CommonModule waarin een HomeController staat die weer een indexAction heeft die de andere modules aanroept.
Nog mooier zou het zijn als je doormiddel van configuratie aangeeft welke controller aangeroepen zouden moeten worden, zodat je de ArticleModule en BannerModule niet een dependency maakt van de CommonModule.
Die commonmodule zou ik bijvoorbeeld ook PageModule kunnen noemen. En in die page module zet ik dan eigenlijk alle controllers voor alle pagina's? Dus zoiets:
Code (php)
1
2
2
/modules/PageModule/controllers/HomepageController.php (of indexController.php)
/ContactController.php (verwijst naar de contactpagina)
/ContactController.php (verwijst naar de contactpagina)
Zoiets?
Tevens zou je misschien wel een CmsModule gaan maken die bijv. een PageController heeft met een showPageAction die een bepaalde pagina uit de DB haalt.
Oké, ik probeer even de routing dan door te krijgen...
Dan zou je dus bijv. deze url hebben www.mijnsite.nl/articles en die roept dan de article controller aan die een pagina met artikelen toont. Correct?
Maar stel nu dat ik op een pagina, bijvoorbeeld www.mijnsite.nl/diversen, zowel artikelen als banners wil tonen, dan zou ik bijv. in de PageModule een "DiversenController" maken die dan weer de controller van de article en de banner module aanroept.
Op die manier?
Gewijzigd op 14/01/2013 17:35:17 door Wouter J
Dus alle controllers, models en views binnen modules. Is het dan slim om "generieke" en "project-specifieke" modules te maken? Of gooi je alles op één hoop?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# config/config.yml
common_module:
homepage:
blocks: ['Article:Article:list', 'Banner:Banner:list']
<?php
// module/CommonModule/Controller/HomeController.php
namespace CommonModule\Controller;
use OzzieMvc\Framework\Mvc\Controller;
class HomeController extends Controller
{
public function indexAction()
{
$blocks = $this->getContainer()->get('configuration.common_module')->homepage->blocks;
$blocksHtml = [];
foreach ($blocks as $block) {
list($controller, $action) = $this->getContainer()->get('controller_resolver')->resolve($block);
$blocksHtml[] = call_user_func(array($controller, $action));
}
$this->render('...', array(
'blocks' => $blocksHtml,
));
}
}
?>
common_module:
homepage:
blocks: ['Article:Article:list', 'Banner:Banner:list']
<?php
// module/CommonModule/Controller/HomeController.php
namespace CommonModule\Controller;
use OzzieMvc\Framework\Mvc\Controller;
class HomeController extends Controller
{
public function indexAction()
{
$blocks = $this->getContainer()->get('configuration.common_module')->homepage->blocks;
$blocksHtml = [];
foreach ($blocks as $block) {
list($controller, $action) = $this->getContainer()->get('controller_resolver')->resolve($block);
$blocksHtml[] = call_user_func(array($controller, $action));
}
$this->render('...', array(
'blocks' => $blocksHtml,
));
}
}
?>
Gewijzigd op 14/01/2013 17:54:55 door Wouter J
Wat doet dit?
controllerName = $this->getContainer()->get('controller_resolver')->resolve($block);
Quote:
controllerName = $this->getContainer()->get('controller_resolver')->resolve($block);
Een Resolver zet een logical name om een naam die PHP kan verstaan. De string 'Article:Article:list' is makkelijk om te schrijven, maar PHP zal hier niks van begrijpen. De ControllerResolver zet dit dan om naar ArticleModule\Controller\ArticleController::listAction.
Merk overigens op dat ik die regel nu een beetje heb aangepast. De ControllerResolver geeft nu een array terug met de controller (ArticleModule\Controller\ArticleController) en de action (listAction) dit zorgt ervoor dat hij wat mooier aan te roepen is in de call_user_func functie.
Wel even een heel andere manier van werken, dus wat dat betreft wel even een omschakeling.
Wel heel erg leuk! Hoop dat het gaat lukken. Bedankt voor zover!
Als je dus alleen modules gebruikt, en als daar al je controllers, models en views in zitten... bouw je dan je website / webshop eigenlijk alleen nog maar met een configuratiebestand waarmee je alles aan elkaar koppelt?
Het is gewoon een kwestie van inladen van juiste modules, goed configureren en de templates van deze modules overriden zodat alles dezelfde stijl krijgt. Welkom en de geweldige wereld van OO en zijn flexibiliteit!!
Oké... nice! De templates hoef ik denk ik niet te overriden. Gewoon beetje goed css'en :-)