[PHP] Meerdere classes in MVC

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben mij op dit moment in MVC aan het verdiepen en heb de sprong in het diepe eens gemaakt en ben begonnen met een simpel framework op te zetten.

Mijn structuur ziet er op dit moment als volgt uit (even in code tags voor de tabjes ;)):
- system/
    application/
       controllers/
       models/
       views/
    cache/
    framework/
      init.php
      basecontroller.class.php
      registry.class.php
      router.class.php
      template.class.php
    libs/
      smarty/
- public/
    index.php
    .htaccess


Ik heb tot nu toe de basis opgezet, de router werkt, de registry en de controller werken ook, en kan ik dus al een Hello World eruit krijgen :). Nu ben ik bezig een zogenaamde input class te maken waar ik m'n GET/POST verkeer doorheen wil laten lopen, aangezien ik hier bij vorige projecten ook gebruik van maakte en ik dit erg handig vond :)

Ik heb dus een input.class.php in de framework map aangemaakt. Maar hoe moet ik hier nu gebruik van maken binnen m'n view? De class wordt namelijk nergens geladen en ik neem aan dat ik niet alles static aan moet gaan maken/roepen.

Is het de bedoeling dat ik per controller opgeef welke 'hulp classes' ik in wil laden, hier vervolgens een instantie van maak en die in m'n registry opsla die vervolgens weer door de controller in geladen wordt? Maar dan gaat de $this-> notatie nog steeds niet werken, iets wat ik wel graag zou willen.

Ik heb naar CodeIgniter gekeken hoe zij dit oplossen, maar daar werd ik niet veel wijzer uit. Ze laden één lege Singleton class (CI_Base), waar vervolgens niks gedaan wordt. De hoofdcontroller extend deze vervolgens, waarna de classes ingeladen worden aan de hand van een array. Wat ik niet begrijp hoe zij later wel de $this-> notatie kunnen gebruiken.

Graag zou ik jullie meningen hierover lezen en ontvang ik graag advies over hoe ik dit het beste aan kan pakken.

Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

offtopic:
Je weet dat je ook [pre][/pre] tags kan gebruiken?

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
BtM909 schreef op maandag 25 mei 2009 @ 22:07:
offtopic:
Je weet dat je ook [pre][/pre] tags kan gebruiken?
Juistem, nog mooier ;)

Acties:
  • 0 Henk 'm!

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Kijk eens naar het KohanaPHP framework. Die is een stuk netter dan Code Igniter. Daarnaast is hij ook een stuk makkelijker te begrijpen voor iemand die onbekend is met het framework en werkt met PHP5 autoload functionaliteit.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
eghie schreef op maandag 25 mei 2009 @ 22:14:
Kijk eens naar het KohanaPHP framework. Die is een stuk netter dan Code Igniter. Daarnaast is hij ook een stuk makkelijker te begrijpen voor iemand die onbekend is met het framework en werkt met PHP5 autoload functionaliteit.
Bedankt voor je reactie. Ik ga eens een kijkje nemen.

Acties:
  • 0 Henk 'm!

  • Kwastie
  • Registratie: April 2005
  • Laatst online: 19-09 10:42

Kwastie

Awesomeness

Zelf vind ik dat de kracht van een framework juist zit in het niet hoeven te schrijven van 'basis' functionaliteit.

Voordelen bestaand framework:

- Basis funtionaliteit zoals: Authentication, Acces Control list, Database.
- Documentatie ! (Als je aan een eigen framework werkt met méér dan 1 persoon is informatie overdragen tijd rovend, 'Standaard' frameworks hebben over het algemeen goede documentatie)
- Community die kan helpen met eventuele problemen.

Nadelen van een bestaand framework:

- Debuggen op framework niveau lastig (niet genoeg kennis van code zelf),
- Iemand anders is er verantwoordelijk voor dat bugs worden opgelost.

Zelf vind ik Zend Framework een erg goed Framework met erg veel functionaliteit!

When I get sad i stop being sad and be awesome instead


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Hier ook een Zend Framework gebruiker :) In Zend Framework kunnen (hoeft niet!) je inputvars verlopen via de request-controller. Je kunt ook zelf een plugin maken die je aan de front-controller hangt om bepaalde filteringen te doen. ZF is vrij uitgebreid, wellicht kun btj een beetje afkijken hoe zij het doen :)

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Zend Framework :9~.

Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Leuk dat iedereen z'n voorkeur voor frameworks uit, maar daar gaat dit topic niet over.
quote: Jesper P.
Ik heb dus een input.class.php in de framework map aangemaakt. Maar hoe moet ik hier nu gebruik van maken binnen m'n view? De class wordt namelijk nergens geladen en ik neem aan dat ik niet alles static aan moet gaan maken/roepen.
Je zou voor elke view een 'helper registry' kunnen configureren, een class die een X aantal Helpers heeft (zoals je input) die vanuit een bepaalde view beschikbaar is (bijvoorbeeld $helper->input->doeIets() in je view). In je Controller configureer je dan ook, aan de hand van welke view gerenderd moet worden, welke helpers er voor die view beschikbaar moeten zijn. Die kun je in je view helper registry stoppen en die doorsturen naar je view, samen met je gegevens.

Je kunt ook een variant van het singleton patroon maken (sowieso zou je ver van singleton af moeten blijven als je OO wilt programmeren), Google eens naar 'Service Locator' of 'Service Locator Pattern'. Komt op hetzelfde neer als bovenstaande paragraaf, maar dan zonder dat je in je controller voor elke view (of groep views) aan moet geven welke helpers je wilt gebruiken.
Maar dan gaat de $this-> notatie nog steeds niet werken, iets wat ik wel graag zou willen.
$this->? Dus je wilt je view templates 'binnen' een class declareren? :/, beter dat je dat niet doet. Maak gewoon je template aan als een 'los' PHP bestand, en roep daarin functies aan van objecten die door je controller naar je view template(s) gestuurd worden. Je kunt natuurlijk ook een template laag als Smarty gebruiken, die heeft sowieso al een verzameling helpers beschikbaar voor zaken als input en escaping en dergelijke.

iig, persoonlijk vind ik het 'registreer helpers per view / controller' het handigst. Zal ook niet al te moeilijk te implementeren zijn.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Overigens denk ik dat ze veel van die $this-> dingen met magic-methods doen. Dat is een optie van PHP, die je hier kunt vinden: http://nl3.php.net/manual/en/language.oop5.magic.php

Je kunt instanties van klassen dan bijvoorbeeld bewaren in een array en middels een magic method dingen aanroepen. Voorbeeldje van de PHP.net site:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
class MethodTest {
    public function __call($name, $arguments) {
        // Note: value of $name is case sensitive.
        echo "Calling object method '$name' "
             . implode(', ', $arguments). "\n";
    }

    /**  As of PHP 5.3.0  */
    public static function __callStatic($name, $arguments) {
        // Note: value of $name is case sensitive.
        echo "Calling static method '$name' "
             . implode(', ', $arguments). "\n";
    }
}

$obj = new MethodTest;
$obj->runTest('in object context');

MethodTest::runTest('in static context');  // As of PHP 5.3.0
?>


Bron: http://nl3.php.net/manual....oop5.overloading.methods

Acties:
  • 0 Henk 'm!

  • Kwastie
  • Registratie: April 2005
  • Laatst online: 19-09 10:42

Kwastie

Awesomeness

YopY schreef op dinsdag 26 mei 2009 @ 09:09:
Leuk dat iedereen z'n voorkeur voor frameworks uit, maar daar gaat dit topic niet over.
Wat ik alleen probeer aan te geven is dat het niet nodig is om een eigen framework te programmeren, omdat er mooie bestaande frameworks zijn. Maar dat zelf een framework maken ook voor- en nadelen kan hebben. :9

When I get sad i stop being sad and be awesome instead


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@YopY

Hier heb ik heel veel aan! Bedankt voor je reply.

@Huhu

Het gaat me niet eens zo zeer om $this->, maar puur het feit dat zij objecten benaderen ipv 'functies' (static notatie is in principe gewoon een functie call, imo).

@Kwastie

Daar gaat dit topic niet over. Ik realiseer me dat er mooie bestaande frameworks zijn, maar ik wil het design pattern leren.

Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Kwastie schreef op dinsdag 26 mei 2009 @ 09:52:
[...]


Wat ik alleen probeer aan te geven is dat het niet nodig is om een eigen framework te programmeren, omdat er mooie bestaande frameworks zijn. Maar dat zelf een framework maken ook voor- en nadelen kan hebben. :9
Weet ik, ik ben ook een tegenstander van het zelf opnieuw uitvinden van het wiel, ;). Maar da's in dit geval niet van toepassing, zie bovenstaande post.

@Jesper: yw <+:)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik zal even melden hoe ik het opgelost heb.

De basecontroller die ik extend ziet er nu als volgt uit:

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
<?php 

abstract class baseController {
    
    protected $registry;
    
    public function __construct($registry) {
        $this->registry = $registry;
    }
    
    /**
     * All controllers must contain an index method
     */
    abstract function index();
    
    
    public function loadCoreClasses($classes = array()) {
        if(count($classes)) {
            foreach($classes as $var => $class) {
                $this->$var = new $class;
            }
        }
    }
}

?>


Ik kan nu via m'n controller de gewenste helpers inladen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php 

class indexController extends baseController {
    
    public function index() {
        
        $this->loadCoreClasses(array('input' => 'Input'));
        
        echo $this->input->getvar('test');     // index.php?test=123, echo'd nu dus 123 :)
        
        $this->registry->template->var = 1;
        $this->registry->template->var2 = 2;
        $this->registry->template->show('index');
    }
}

?>


Nu zou ik ze alleen nog graag via een variable aan kunnen roepen, $helpers->input ipv $this->input, ik denk dat dat namelijk wat overzichtelijk is. Nog even mee hobbyen :)

[ Voor 9% gewijzigd door Verwijderd op 27-05-2009 09:20 ]


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
dan maak je toch een loadHelper functie in je baseController? Dan doe je bijv. $inputHelper = $this->loadHelper('Input); oid.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik laat 'em nu gewoon een array met objecten returnen :)

Dus $helpers = $this->loadCoreClasses(array('input => 'Input'));

Kan ik vervolgens gebruiken als

$helpers['input']->getvar('test');

Vind ik zelf vrij netjes :)

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Kwestie van smaak denk ik dan. Ik vind een array met classes erin op zo'n manier niet zo mooi.
Pagina: 1