modules en mvc

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2 3

Ozzie PHP

Ozzie PHP

14/01/2013 16:13:17
Quote Anchor link
Nog even een vraag over een module...

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)
PHP script in nieuw venster Selecteer het PHP script
1
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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
class indexController {

  // Toon de homepage.
  public function indexAction() {
    $article_controller = new Article_Controller_Module();
    $articles = $article_controller->getArticles('homepage');
    $this->toView('articles', $articles);
    $this->showView('homepage.phtml');
  }

}

?>


En dan in homepage.phtml:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
Nieuwsberichten:<br><br>
<?php $articles->show(); ?>


Is dat hoe het (ongeveer) zou moeten?
Gewijzigd op 14/01/2013 16:14:25 door Ozzie PHP
 
PHP hulp

PHP hulp

04/05/2024 18:00:48
 
Wouter J

Wouter J

14/01/2013 16:45:23
Quote Anchor link
Nee, je hebt alleen nog maar controllers in modules nergens anders. En het moet ook niet controller/controller.php zijn, maar bijv. controller/IndexController.php. En niet model/model.php maar bijv. modle/ArticleModle.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.
 
Ozzie PHP

Ozzie PHP

14/01/2013 16:53:45
Quote Anchor link
Wouter, thanks voor je reactie en fijn dat je even meedenkt.

"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?
 
Wouter J

Wouter J

14/01/2013 16:59:24
Quote Anchor link
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.
 
Ozzie PHP

Ozzie PHP

14/01/2013 17:07:12
Quote Anchor link
Oké... even voor mijn beeldvorming om het beter te begrijpen...

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
/modules/PageModule/controllers/HomepageController.php (of indexController.php)
                               /ContactController.php (verwijst naar de contactpagina)


Zoiets?
 
Wouter J

Wouter J

14/01/2013 17:25:06
Quote Anchor link
Niet per se. Een UserModule kan uit zichzelf bijv. ook een pagina maken (denk bijv. aan een login, registratie en profiel) pagina. De ArticleModule maakt bijv. uit zichzelf een pagina waarop je artikelen kan terug zien.

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.
 
Ozzie PHP

Ozzie PHP

14/01/2013 17:31:35
Quote Anchor link
"De ArticleModule maakt bijv. uit zichzelf een pagina waarop je artikelen kan terug zien."

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?
 
Wouter J

Wouter J

14/01/2013 17:34:17
Quote Anchor link
Ja. Elke module zorgt voor z'n eigen routing en pagina's, alleen soms heb je wat algemene dingen die niet bij de een nog de andere module horen en die plaats je dan in een algemene module (bijv. een ApplicationModule, CommonModule, hoe je 'm noemen wilt)
Gewijzigd op 14/01/2013 17:35:17 door Wouter J
 
Ozzie PHP

Ozzie PHP

14/01/2013 17:38:57
Quote Anchor link
Oké, grappig :)

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?
 
Wouter J

Wouter J

14/01/2013 17:45:11
Quote Anchor link
Over het algemeen is het zo dat je probeert modules te maken die los van elkaar kunnen werken. Zoals ik net al zei, het is leuk om direct in de CommenModule\HomeController::indexAction de ArticleModule\ArticleController::listAction op te roepen, maar het is nog leuker in de configuratie aan te geven dat je graag deze lijst op de homepagina wilt. Bijv:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
# 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,
        ));
    }
}

?>
Gewijzigd op 14/01/2013 17:54:55 door Wouter J
 
Ozzie PHP

Ozzie PHP

14/01/2013 17:51:36
Quote Anchor link
Wowsie... dat is inderdaad wel heel gaaf!! :-))))))

Wat doet dit?

controllerName = $this->getContainer()->get('controller_resolver')->resolve($block);
 
Wouter J

Wouter J

14/01/2013 17:56:11
Quote Anchor link
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.
 
Ozzie PHP

Ozzie PHP

14/01/2013 18:01:23
Quote Anchor link
Ah ja... nice!! Wel gaaf dit soort dingen :)
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!
 
Ozzie PHP

Ozzie PHP

18/01/2013 00:07:51
Quote Anchor link
Wouter, nog even een vraagje...
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?
 
Wouter J

Wouter J

18/01/2013 00:14:00
Quote Anchor link
Ja, als je alle benodigde modules hebt wel. Soms ook nog met een algemene module die je dan wel moet maken.

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!!
 
Ozzie PHP

Ozzie PHP

18/01/2013 00:17:10
Quote Anchor link
Oké... nice! De templates hoef ik denk ik niet te overriden. Gewoon beetje goed css'en :-)
 

Pagina: « vorige 1 2 3



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.