[php] Single point of entry (MVC)

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben wat aan het uitproberen namelijk het MVC pattern.
Hiervoor heb ik een heleboel informatie op het net gevonden echter zit ik nog met 1 probleem waar ik geen oplossing voor vind.

Ik maak gebruik van een single point of entry (index.php) en een router.class.php zorgt ervoor dat de correcte controller en view aangesproken wordt. Echter heb ik nu een probleem wanneer er bv in een css file een url link staat naar een image... Deze wordt ook via de router gestuurd waar hij een controller voor zoekt en uiteindelijk een 404 melding geeft ipv de image... Hoe los ik dit nu op?

.htaccess:
code:
1
2
3
4
5
6
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php?rt=$1 [L,QSA]


router.class.php
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
<?php

class router {
 
    private $registry;
    private $path;
    public $file;
    public $controller;
    public $action;

    public function __construct($registry) {
        $this->registry = $registry;
    }

    public function setPath($path) {
        if(is_dir($path) == false){
            FB::warn('Invalid controller path: `' . $path . '`', 'Router');
            return false;
        }
        FB::info($path, 'path');
    $this->path = $path;
    }

    public function loader(){
    /*** check the route ***/
    $this->getController();

    /*** if the file is not there diaf ***/
    if (is_readable($this->file) == false){
            $this->file = $this->path.'/error404.php';
            $this->controller = 'error404';
    }

    /*** include the controller ***/
    include $this->file;

    /*** a new controller class instance ***/
    $class = $this->controller . 'Controller';
    $controller = new $class($this->registry);

    /*** check if the action is callable ***/
    if (is_callable(array($controller, $this->action)) == false){
            $action = 'index';
    }else{
            $action = $this->action;
    }

    /*** run the action ***/
    $controller->$action();
    }

    private function getController() {

        /*** get the route from the url ***/
        $route = (empty($_GET['rt'])) ? '' : $_GET['rt'];

        if (empty($route)){
                $route = 'index';
        }else{
            /*** get the parts of the route ***/
            $parts = explode('/', $route);
            $this->controller = $parts[0];
            if(isset( $parts[1])){
                $this->action = $parts[1];
            }
        }

        if (empty($this->controller)){
            $this->controller = 'index';
        }

        /*** Get action ***/
        if (empty($this->action)){
            $this->action = 'index';
        }

        FB::info($this->action, 'Router action');
        /*** set the file path ***/
        $this->file = $this->path .'/'. $this->controller . 'Controller.php';

    }

}

?>

Acties:
  • 0 Henk 'm!

Verwijderd

Meest eenvoudig: gooi die resources in een aparte directory, en gebruik RewriteCond om die directory uit te sluiten zodat je daar niet mee in de problemen komt.

Acties:
  • 0 Henk 'm!

  • Basz0r
  • Registratie: April 2009
  • Niet online
Je moet ervoor zorgen dat je een directe url hebt. Oftewel geen url zoals 'style/stylesheet.css', want dat zal namelijk worden verwerkt door je router klasse. Maar een url zoals 'http://localhost/style/stylesheet.css', dit zal namelijk gewoon leiden naar de link en wordt niet verwerkt door je router.

Overigens kan je dit doen door in een config een 'base' url in te stellen waarna je bijvoorbeeld dit doet in je code:

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

// Base url
$GLOBALS['base'] = "http://localhost/";

function baseurl()
{
      return $GLOBALS['base'];
}


echo baseurl() . "style/stylesheet.css";

?>

(Dit is geen complete code, maar een voorbeeld van hoe je het zou kunnen doen ;))

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bij die baseurl hebje nog het probleem dat binnen een css file of js file geen php kan staan...

Een probeersel van een .htaccess, echter doet hij het niet... waarom?

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php?rt=$1 [L,QSA]

RewriteRule ^images$ images [NC]
RewriteRule ^images/$ images/ [NC]

[ Voor 59% gewijzigd door Verwijderd op 24-05-2010 21:40 ]


Acties:
  • 0 Henk 'm!

  • Basz0r
  • Registratie: April 2009
  • Niet online
Verwijderd schreef op maandag 24 mei 2010 @ 21:30:
Bij die baseurl hebje nog het probleem dat binnen een css file of js file geen php kan staan...

Ga ik mij een smoete verdiepen in het hele modrewrite gedoe want daar ken ik niets van... Was simple .htaccessje van het net
Dat is inderdaad een minpunt aan het baseurl gedoe, maar de cms'en en PHP raamwerken die ik ken (Wordpress, CodeIgniter) maken hier wel gebruik van.

Dan denk ik dat een goede .htaccess bestand meer kan doen dan omslachtige functies gebruiken.

Acties:
  • 0 Henk 'm!

  • Kwastie
  • Registratie: April 2005
  • Laatst online: 15-09 09:54

Kwastie

Awesomeness

Basz0r schreef op maandag 24 mei 2010 @ 21:14:
Je moet ervoor zorgen dat je een directe url hebt. Oftewel geen url zoals 'style/stylesheet.css', want dat zal namelijk worden verwerkt door je router klasse. Maar een url zoals 'http://localhost/style/stylesheet.css', dit zal namelijk gewoon leiden naar de link en wordt niet verwerkt door je router.

Overigens kan je dit doen door in een config een 'base' url in te stellen waarna je bijvoorbeeld dit doet in je code:

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

// Base url
$GLOBALS['base'] = "http://localhost/";

function baseurl()
{
      return $GLOBALS['base'];
}


echo baseurl() . "style/stylesheet.css";

?>

(Dit is geen complete code, maar een voorbeeld van hoe je het zou kunnen doen ;))
Ik vraag me af of je überhaupt wel door hebt wat het probleem is.

Zelf gebruik ik deze:

code:
1
2
3
4
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f    
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L]


Misschien werkt hij niet omdat die regex op alles matched? :o

Edit: Ook geverifieerd dat de paden werken zonder rewrite rule? (want een niet bestaand bestand zou ook naar je index verwijzen)

[ Voor 5% gewijzigd door Kwastie op 24-05-2010 21:43 ]

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


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Kwastie schreef op maandag 24 mei 2010 @ 21:40:
[...]


Ik vraag me af of je überhaupt wel door hebt wat het probleem is.

Zelf gebruik ik deze:

code:
1
2
3
4
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f    
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L]


Misschien werkt hij niet omdat die regex op alles matched? :o

Edit: Ook geverifieerd dat de paden werken zonder rewrite rule? (want een niet bestaand bestand zou ook naar je index verwijzen)
Niet bestaande bestanden verwijzen ook naar de index maar worden door de router naar de 404controller gestuurd. Ik ken helaas zeer weinig van ModRewrite wat ik zeker eens ga moeten opzoeken hoe dat allemaal eigenlijk in elkaar zit maar gebruikte net even jou voorbeeld van htaccess echter werkt enkel mijn index dan maar doe ik bv domein.com/admin/start dan zou hij normaal de adminController aanspreken met actie start maar dat gebeurd nu niet

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Deze htaccess heeft het probleem verholpen:
code:
1
2
3
4
5
6
7
8
9
10
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php?rt=$1 [L]

RewriteRule ^views/images$ ^views/images$ [NC]
RewriteRule ^views/js$ ^views/js$ [NC]
RewriteRule ^views/css$ ^views/css$ [NC]

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Ik gebruik altijd deze:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

# Security: Don't allow browsing of directories
Options -Indexes


De -s en -l doen net wat meer (en beter) dan de -f.

Acties:
  • 0 Henk 'm!

  • flashin
  • Registratie: Augustus 2002
  • Laatst online: 17-12-2023
Of je zet uitzonderingen gewoon in je .htaccess met een RewriteCond.

RewriteCond %{REQUEST_URI} !(uitzondering.php|assets)
RewriteRule .* index.php

Acties:
  • 0 Henk 'm!

  • TJHeuvel
  • Registratie: Mei 2008
  • Niet online
Check ook even de beveiliging van je systeem, bij je huidige implementatie kan de gebruiker alle classes aanroepen die hij wilt!
Je zou kunnen verifiëren of de controller class welke je binnen krijgt wel je base-Controller class extend.

Freelance Unity3D developer


Acties:
  • 0 Henk 'm!

  • RedHat
  • Registratie: Augustus 2000
  • Laatst online: 09-09 17:16
Of laat je CSS door PHP/Template Engine parsen.

[ Voor 20% gewijzigd door RedHat op 25-05-2010 10:45 ]


Acties:
  • 0 Henk 'm!

  • Freeaqingme
  • Registratie: April 2006
  • Laatst online: 16-09 11:34
Waarom zou je dat willen? Enige reden die ik kan verzinnen is het opzettelijk verhogen van de laadtijden bij de gebruiker, de server willen overbelasten, etc.

No trees were harmed in creating this message. However, a large number of electrons were terribly inconvenienced.


Acties:
  • 0 Henk 'm!

  • kwaakvaak_v2
  • Registratie: Juni 2009
  • Laatst online: 02-06 12:29
freakingme schreef op dinsdag 25 mei 2010 @ 11:07:
Waarom zou je dat willen? Enige reden die ik kan verzinnen is het opzettelijk verhogen van de laadtijden bij de gebruiker, de server willen overbelasten, etc.
ben ik met je eens, sommige systemen gebruiken php om dynamische css files te maken, zodat de gebruiker dan in het cms een kleurtje of een font kan zetten. Zelf vind ik het dan een stuk netter om het systeem dan een css file te laten generen en die te includen.

Voor parameters van php -> javascript te transporteren gebruik ik meestal een klein stukje inline javascript waar ik met wat echo's of een template engine de variabelen daar weg zet ipv een heel stuk javascript door php te trekken.

En voor de volledigheid, mijn .htacces voor mijn simpele controler (structuur is http://url/method/parameter1/parameter etc. etc.


code:
1
2
3
4
RewriteCond %{REQUEST_URI} !/(upload|css|images|scripts)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?action=$1 [L]

Driving a cadillac in a fool's parade.

Pagina: 1