MVC-framework werkt op linux maar niet op windows

Pagina: 1
Acties:
  • 739 views

Acties:
  • 0 Henk 'm!

  • maartenlambrech
  • Registratie: Mei 2006
  • Laatst online: 04-05-2024
Ik gebruik nu al een jaar het simpele MVC-framework van "phpit.net". (Spijtig genoeg ligt hun site al enige tijd plat)
Dit werkt goed met apache op linux (Gentoo), maar weigert te werken onder windows.

Aangezien dat Mod-rewrite aan staat, is mijn eerste idee dat het iets te maken heeft met de 'directories' van windows en linux. Meerbepaald het verschil tussen slashes en backslashes.

Error tijdens laden pagina op windowsserver:
code:
1
2
3
4
5
Fatal error: Uncaught exception 'Exception' with message 'Invalid controller path:
 `C:\Program Files\htdocs\DEMO\library\mvc\../../application/controllers\`'
 in C:\Program Files\htdocs\DEMO\library\mvc\classes\router.php:21 
Stack trace: #0 C:\Program Files\htdocs\DEMO\index.php(18): Router->setPath('C:\Program File...') #1 {main} thrown in
 C:\Program Files\htdocs\DEMO\library\mvc\classes\router.php on line 21


Startup.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
<?php
error_reporting (E_ALL);
if (version_compare(phpversion(), '5.1.0', '<') == true) { die ('PHP5.1 Only'); }

// Constants:
define ('DIRSEP', DIRECTORY_SEPARATOR);

// Get site path
$site_path = realpath(dirname(__FILE__) . DIRSEP . '..' . DIRSEP) . DIRSEP;
define ('site_path', $site_path);

// For loading classes
function __autoload($class_name) {
    $filename = strtolower($class_name) . '.php';
    $file = site_path . 'classes' . DIRSEP . $filename;

    if (file_exists($file) == false) { 
        return false;
    }

    include ($file);
}


$registry = new Registry;
?>



Index.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
// Start sessions
    session_start();
// Include the config settings
    require 'config.php';
// Include the templatepower class
    require( "library/templatepower/class.TemplatePower.inc.php");
// Startup tasks
    require 'library/mvc/includes/startup.php';
// Load router
    $router = new Router($registry);
    $registry->set ('router', $router);
    $router->setPath (site_path . '../../application/controllers');
    $router->delegate();
?>


Router.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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<?php
/**
The Router class has to analyze the request, and then load the correct command.
**/

Class Router {
    private $registry;
    private $path;
    private $args = array();

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

    }

    function setPath($path) {
        $path = trim($path, '/\\');
        $path .= DIRSEP;

        if (is_dir("/".$path) == false) {
            throw new Exception ('Invalid controller path: `' . $path . '`');
        }

        $this->path = "/".$path;
    }

    function getArg($key) {
        if (!isset($this->args[$key])) { return null; }
        return $this->args[$key];
    }

    function delegate() {
        // Analyze route
        $this->getController($file, $controller, $action, $args);

        // File available?
        if (is_readable($file) == false) {
            $this->notFound('no-file');
        }

        // Include the file
        include ($file);

        // Initiate the class
        $class = 'Controller_' . $controller;
        $controller = new $class($this->registry);

        // Action available?
        if (is_callable(array($controller, $action)) == false) {
            $this->notFound('no-action');
        }

        // Run action
        $controller->$action($args);
    }

    private function extractArgs($args) {
        if (count($args) == 0) { return false; }
        $this->args = $args;
    }
    
    private function getController(&$file, &$controller, &$action, &$args) {
        $route = (empty($_GET['route'])) ? '' : $_GET['route'];

        if (empty($route)) { $route = 'index'; }

        // Get separate parts
        $route = trim($route, '/\\');
        $parts = explode('/', $route);

        // Find right controller
        $cmd_path = $this->path;
        foreach ($parts as $part) {
            $fullpath = $cmd_path . $part;
            
            // Is there a dir with this path?
            if (is_dir($fullpath)) {
                $cmd_path .= $part . DIRSEP;
                array_shift($parts);
                continue;
            }

            // Find the file
            if (is_file($fullpath . '.php')) {
                $controller = $part;
                array_shift($parts);
                break;
            }
        }

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

        // Get action
        $action = array_shift($parts);
        if (empty($action)) { $action = 'index'; }

        $file = $cmd_path . $controller . '.php';
        $args = $parts;

    }


    private function notFound() {
        die("404 Not Found");
    }

}

?>

Acties:
  • 0 Henk 'm!

  • Barleone
  • Registratie: Maart 2009
  • Laatst online: 20:45
Allereerst, wat heb je zelf al geprobeerd? i.e. al eens alle slashes vervangen van een paar regels, en verdwijnen dan je errors aangaande die regels?
Ik weet, het is warm. Maar enige trial-and-error verwachten we hier op GoT toch wel.

Tweakers.net 6 nostalgie! - Wayback Machine
Have you tried turning it off and on again?


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Wat doet dit op Windows?
PHP:
1
if (is_dir("/".$path) == false) {

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • BCC
  • Registratie: Juli 2000
  • Laatst online: 18:43

BCC

False returnen :)

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


Acties:
  • 0 Henk 'm!

  • maartenlambrech
  • Registratie: Mei 2006
  • Laatst online: 04-05-2024
Wat ik zelf al gedaan heb:

De $path variabele aangepast zodat deze overeenstemt met de map waarin mijn controllers staan. Dan geeft hij nog steeds dezelfde error, maar met de juiste dir van mijn controllers in de plaats:
code:
1
2
3
Fatal error: Uncaught exception 'Exception' with message 'Invalid controller path:
 `http://localhost/DEMO/application/controllers\`'
 in C:\Program Files\htdocs\DEMO\library\mvc\classes\router.php:21



De $path variabele geprint en gezien dat hij op het einde een backslash plaatst. Na het script te veranderen zodat hij deze niet meer zet, geeft hij dezelfde error, maar zonder de backslash op het einde:
code:
1
2
3
Fatal error: Uncaught exception 'Exception' with message 'Invalid controller path:
 `http://localhost/DEMO/application/controllers`'
 in C:\Program Files\htdocs\DEMO\library\mvc\classes\router.php:21


Ook met een gewone slash op het einde geeft hij:
code:
1
2
3
Fatal error: Uncaught exception 'Exception' with message 'Invalid controller path:
 `http://localhost/DEMO/application/controllers/`'
 in C:\Program Files\htdocs\DEMO\library\mvc\classes\router.php:21
CodeCaster schreef op donderdag 02 juli 2009 @ 16:59:
Wat doet dit op Windows?
PHP:
1
if (is_dir("/".$path) == false) {
Dit moet controleren of de verwijzing naar de 'controller-map' juist is. Afhankelijk van de url zoekt hij dan de juiste controller. Dit zet ook een slash voor het path. Ik heb deze in mijn bovenstaande voorbeelden verwijderd aangezien ik een directe url gebruikt heb met "http://localhost/DEMO" ipv "/DEMO".

[ Voor 18% gewijzigd door maartenlambrech op 02-07-2009 17:22 ]


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Maareh...die slash wordt er nu voor gezet, dan krijg je toch iets als "/C:\Program Files\" achtig iets. Dat kan toch niet valideren? Dus opzich lijkt t me logisch.

Acties:
  • 0 Henk 'm!

  • hostname
  • Registratie: April 2009
  • Laatst online: 20:16
Je moet wel filesystem-URL's opgeven (C:\bla\blah\blah) en geen HTTP-URL's (http://localhost/DEMO/blah/) ;)

Maar waar het mis gaat is deze regel:
PHP:
1
    $router->setPath (site_path . '../../application/controllers');

Hier staat hardcoded een forward-slash, terwijl op Windows backslashes gebruikt worden. Hiervoor wordt ook de DIRSEP constant voor aangemaakt, maar die word hier (perongeluk?) niet gebruikt. Vervangen met
PHP:
1
    $router->setPath (site_path . '..' . DIRSEP . '..' . DIRSEP . 'application' . DIRSEP . 'controllers');

Moet het crossplatform maken.

[ Voor 71% gewijzigd door hostname op 02-07-2009 17:58 ]


Acties:
  • 0 Henk 'm!

  • maartenlambrech
  • Registratie: Mei 2006
  • Laatst online: 04-05-2024
Duizend maal dank aan "Cartman!" en "Hostname"!
De combinatie van jullie antwoorden waren de oplossing voor mijn probleem.
Hartelijk dank voor de snelle en behulpzame antwoorden.

Toch nog een kleine opmerking:
Door de slash in het begin te verwijderen werkt dit script niet meer op linux.
Geen idee of daar een oplossing voor is of als ik gewoon twee verschillende scripts moet gebruiken.

[ Voor 37% gewijzigd door maartenlambrech op 02-07-2009 18:16 ]


Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
Waarom voeg je dan geen simpele 'if' toe?
PHP:
1
2
3
4
5
if($_SERVER["SERVER_SIGNATURE"] == "Apache  xxxxxxxxxxxxxxxxxxxxxxx") {
      $slash = "/";
} else {
      $slash = "";
}


Ik heb hierboven maar even zo wat neergezet, zo checkte ik vroeger altijd op welke server ik draaide.
Voor meer informatie:
Cliky

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Wellicht in je requirements zetten dat je een linux server nodig hebt net zoals het een goed idee is om bepaalde eisen te stellen aan de versies van de software.

Acties:
  • 0 Henk 'm!

  • Barleone
  • Registratie: Maart 2009
  • Laatst online: 20:45
Allereerst, ik ben geen mod, maar ik probeer me ook in te zetten om het hier op niveau te houden.
Dit is echt één van de meest basic problemen waar je als devver tegenaan loopt bij het zowel voor Linux als voor Windows ontwikkelen van apps. Omdat het zo basic is staat ook internet vol met oplossingen. Aangezien je zelf al aangaf dat het waarschijnlijk te maken heeft met slashes hadden een paar zoektermen in google wonderen voor je kunnen verrichten. Ik heb op GoT niet gezocht, maar ik ben ervan overtuigd dat je ook hier wel een aantal topics had kunnen vinden.
Ik hoop dat je in het vervolg wat meer inzet toont, en dat je niet voor elk n00b-vraagje hier een topic opent.
Disclaimer: hoewel dit nogal zeurderig klinkt is dit naar mijn bescheiden mening echt een topic waar het gebrek aan inzet vanaf spat.

Tweakers.net 6 nostalgie! - Wayback Machine
Have you tried turning it off and on again?


Acties:
  • 0 Henk 'm!

  • hostname
  • Registratie: April 2009
  • Laatst online: 20:16
Manueltje22 schreef op donderdag 02 juli 2009 @ 18:27:
Waarom voeg je dan geen simpele 'if' toe?
PHP:
1
2
3
4
5
if($_SERVER["SERVER_SIGNATURE"] == "Apache  xxxxxxxxxxxxxxxxxxxxxxx") {
      $slash = "/";
} else {
      $slash = "";
}


Ik heb hierboven maar even zo wat neergezet, zo checkte ik vroeger altijd op welke server ik draaide.
Voor meer informatie:
Cliky
PHP heeft hiervoor de constante DIRECTORY_SEPERATOR. Werkt ook meteen met alle webservers die op Linux draaien, want er zijn er echt wel meer dan Apache :)

@maarten:
Op Linux beginnen paden altijd met een /, op Windows met C:\, dus ik denk dat daar je probleem in zit. Eventjes checken op PHP_OS zou het moeten verhelpen (if PHP_OS != Windows { add slash; } )

[ Voor 12% gewijzigd door hostname op 02-07-2009 20:07 ]


Acties:
  • 0 Henk 'm!

  • maartenlambrech
  • Registratie: Mei 2006
  • Laatst online: 04-05-2024
Barleone schreef op donderdag 02 juli 2009 @ 19:04:
Allereerst, ik ben geen mod, maar ik probeer me ook in te zetten om het hier op niveau te houden.
Dit is echt één van de meest basic problemen waar je als devver tegenaan loopt bij het zowel voor Linux als voor Windows ontwikkelen van apps. Omdat het zo basic is staat ook internet vol met oplossingen. Aangezien je zelf al aangaf dat het waarschijnlijk te maken heeft met slashes hadden een paar zoektermen in google wonderen voor je kunnen verrichten. Ik heb op GoT niet gezocht, maar ik ben ervan overtuigd dat je ook hier wel een aantal topics had kunnen vinden.
Ik hoop dat je in het vervolg wat meer inzet toont, en dat je niet voor elk n00b-vraagje hier een topic opent.
Disclaimer: hoewel dit nogal zeurderig klinkt is dit naar mijn bescheiden mening echt een topic waar het gebrek aan inzet vanaf spat.
Heb jij thuis ook zo'n glazen bol waar je in kan zien wat ik allemaal geprobeerd heb?
Het is niet omdat het voor jou "basic" lijkt, dat een niet-professionele ontwikkelaar er niet mee in de problemen kan geraken. De oorzaak van mijn probleem had namelijk twee oorsprongen en die had ik niet beide in een keer gevonden.

Voor de rest van de forumleden: bedankt voor de nuttige informatie!

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Barleone bedoelt te zeggen dat wij ook niet kunnen weten wat jij geprobeerd hebt als je dit niet verteld, das wel de bedoeling is op GoT. Het is inderdaad een vrij simpel probleem dat je met wat echo's best had kunnen zien ook naar mijn mening. Niet erg dat je het niet in 1 keer weet, wij hebben t ook moeten leren natuurlijk. Het is belangrijk om te leren debuggen, iets wat je nog niet onder de knie hebt blijkbaar.

Ik weet niet of Router.php behoort tot het framework, als dit wel zo is hebben ze er niet zo goed overna gedacht imo. Wellicht eens orienteren op een ander framework wat wel goed doorontwikkeld is en wordt (en ze zelf hun eigen site in de lucht kunnen houden).

Acties:
  • 0 Henk 'm!

  • Barleone
  • Registratie: Maart 2009
  • Laatst online: 20:45
maartenlambrech schreef op vrijdag 03 juli 2009 @ 20:55:
[...]

Heb jij thuis ook zo'n glazen bol waar je in kan zien wat ik allemaal geprobeerd heb?
  • :? Daar vroeg ik je om in mijn eerste post.
  • :s Je post in mijn andere topic was zeker een foutje? ;)
  • Wat cartman en ik je dus proberen te zeggen, kun je uitgebreid lezen in Het algemeen beleid #topicplaatsen
    Even lezen, en in het vervolg ook graag zo toepassen. Op die manier kunnen tweakers je beter helpen en zo wek je zelf een betere indruk.
  • Verder lijkt me de raad van cartman ook goed: zorg voor een degelijk framework :)

[ Voor 25% gewijzigd door Barleone op 04-07-2009 03:09 . Reden: lijstje van gemaakt voor overzicht ]

Tweakers.net 6 nostalgie! - Wayback Machine
Have you tried turning it off and on again?


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

maartenlambrech schreef op vrijdag 03 juli 2009 @ 20:55:
[...]

Heb jij thuis ook zo'n glazen bol waar je in kan zien wat ik allemaal geprobeerd heb?
Het is niet omdat het voor jou "basic" lijkt, dat een niet-professionele ontwikkelaar er niet mee in de problemen kan geraken. De oorzaak van mijn probleem had namelijk twee oorsprongen en die had ik niet beide in een keer gevonden.

Voor de rest van de forumleden: bedankt voor de nuttige informatie!
Jij als topicstarter moet er juist voor zorgen dat wij topicbeantwoorders geen glazen bol nodig hebben: je moet alles vertellen wat je geprobeerd hebt, en uitleggen wat je probleem is.

Tweehonderd regels code posten is absoluut niet gelijk aan uitleggen wat je probleem is; als je dat doet weet eenieder dat je je probleem niet genoeg hebt geanalyseerd.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:56

Creepy

Tactical Espionage Splatterer

maartenlambrech schreef op vrijdag 03 juli 2009 @ 20:55:
[...]

Heb jij thuis ook zo'n glazen bol waar je in kan zien wat ik allemaal geprobeerd heb?
Ho even. Hier gaan we er vanuit dat je aangeeft wat je hebt geprobeerd. Dit laat aan ons zien dat je wel degelijk zelf er mee aan de slag wilt gaan i.p.v. ff snel een oplossing scoren en het voorkomt het melden van oplossingen die je zelf allang hebt geprobeerd.

Hoe "basic" iets is maakt in prinipe helemaal niks uit hier. Zolang je zelf maar wel laat zien dat je er wel degelijk mee bezig bent geweest. Dat je dus dit soort posts krijgt heb je dus eerder aan jezelf te danken ;)

Puur en alleen naar je startpost kijkende is dat een post die we hier liever niet zien. Je geeft inderdaad nagenoeg niet aan wat je hebt geprobeerd en je geeft maar gewoon al je code i.p.v. dat je een kleiner test geval geeft. Wij zijn er hier niet om jouw code te debuggen, dat zul je in eerste instantie zelf moeten doen. Als je niet aangeeft dat (en ook wat !) je dat hebt gedaan dan is de vraag om meer relevante info en code (dus niet alle code!) 1 van de eerste die je zult krijgen. Bij verder uitblijven van info is de kans op een slot vrij groot.

Aangezien je probleem voor nu is opgelost en we genoeg offtopic zijn gegaan gaat deze op slot. Wil je voor een eventueel volgend topic het algemeen beleid waar je tijdens registratie mee akkoord bent gegaan nog even doorkijken? Dan weet je wat hier nu eigenlijk de bedoeling is.

[ Voor 37% gewijzigd door Creepy op 04-07-2009 16:12 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1

Dit topic is gesloten.