rickyspires Posted August 22, 2013 Report Share Posted August 22, 2013 (edited) Hello. I have been going through your php training video and i have done all up to php_advanced_pt2 which includes : kp3-setting-up-htaccess-for-controllers.mov kp4-dispatching-requests-to-multiple-controllers.mov kp5-dispatching-views.mov The first video seems fine but somewhere in kp4 and kp5 it all goes wrong and it doesn't work how it should. I have been over and over it and can't find the problem. I have even installed your own files found in "php_advanced_sourcefiles / kp5-dispatching-views " and i am getting exactly the same errors. I am using mamp pro and i have tried the script on php 5.2.17, php5.3.14 and php 5.4.4 which i am currently using. My files are located in: /Users/rickyspires/Sites/TRAINING/PHP_OOP/MVC/public these are the errors i am getting: Notice: Undefined offset: 2 in /Users/rickyspires/Sites/TRAINING/PHP_OOP/MVC/public/index.php on line 22 Fatal error: Uncaught exception 'Exception' with message 'Please implement a function called Action!' in /Users/rickyspires/Sites/TRAINING/PHP_OOP/MVC/site/app/controllers/ControllerAbstract.php:31 Stack trace: #0 /Users/rickyspires/Sites/TRAINING/PHP_OOP/MVC/public/index.php(37): site\app\controllers\ControllerAbstract->dispatch() #1 {main} thrown in /Users/rickyspires/Sites/TRAINING/PHP_OOP/MVC/site/app/controllers/ControllerAbstract.php on line 31 If i remove $pfx from list($pfx, $controllerName,$actionName) = preg_split('/[\/\\\]/',$uri); in index.php it fixes the first problem because $pfx is not defined any where but it is probably not the correct thing to do. and if i remove else throw new \Exception("Please implement a function called $method!"); from ControllerAbstract.php it fixes the second error but is probably not the correct thing to do. when i remove that code and go to my local site (http://training-mvc.com'>http://training-mvc.com) the site is blank if i got to: http://training-mvc.com its blank http://training-mvc.com/index/ its blank http://training-mvc.com/index/welcome its blank Thank you Ricky Spires Edited August 22, 2013 by rickyspires Quote Link to comment Share on other sites More sharing options...
mantis Posted August 27, 2013 Report Share Posted August 27, 2013 I seem to have a similiar problem I get the error messages Notice: Undefined variable: controller in c:\xampp\htdocs\playground\killer_php\public\index.php on line 45 Fatal error: Call to a member function dispatch() on a non-object in c:\xampp\htdocs\playground\killer_php\public\index.php on line 45 Line 45 contains $controller->dispatch(); Just to be on the save side I exchanged my code with the download code so I'm sure there is no typo - has anyone got an idea? Regards mantis Quote Link to comment Share on other sites More sharing options...
mantis Posted August 31, 2013 Report Share Posted August 31, 2013 After the above problem did not give me any peace I played around with the index.php file and came to the conclusion that the problem lies with the URI I use xampp 1.8.3 (php 5.5.1, Apache 2.4.4) My File path is: F:\xampp\htdocs\killer_php (htdocs is the root for localhost) If I echo print some of the variables I get: echo APPLICATION_PATH .'<br />'; I get F:\xampp\htdocs\killer_php so far so good The next thing I echoed was the REQUEST_URI on index in the public folder echo '<br />Request URI: ' . $uri . '<br />'; This outputs Request URI: /killer_php/public/index/ Also this is still good However is I echo the controller Name after: list($pfx, $controllerName,$actionName) = preg_split('/[\/\\\]/',$uri); but before the switch I get Controller Name: killer_php Obviously this is wrong as it is supposed to be index, I tried to adjust the path but to no avail I would be glad if someone could help or point me in the right direction Regards mantis Quote Link to comment Share on other sites More sharing options...
mantis Posted September 1, 2013 Report Share Posted September 1, 2013 For all those that have the same problem as me here is a dirty workaround In the file /public/index.php find the line list($pfx, $controllerName,$actionName) = preg_split('/[\/\\\]/',$uri); and replace with: //list($pfx, $controllerName,$actionName) = preg_split('/[\/\\\]/',$uri); $uri_e = preg_split('/[\/\\\]/', $uri); $nrs = count($uri_e); $nrs1 = ($nrs - 2); /* * Uncomment the next 4 lines if you are not getting the right result * then adjust the number in the line above */ //echo '<pre>'; //echo 'The number of the array identifier :' . $nrs1 . '<br />'; //echo 'The value of the array node: ' . $uri_e[$nrs1] . '<br />'; //print_r(preg_split('/[\/\\\]/', $uri)); /* * This is where the "magic" happens */ if ($uri_e[$nrs1] === 'index' && $uri_e[$nrs1 + 1] === '' || $uri_e[$nrs1] === 'public' && $uri_e[$nrs1 + 1] === '') { $controllerName = 'index'; $actionName = ''; } elseif ($uri_e[$nrs1] != '' && $uri_e[$nrs1 + 1] != '') { $controllerName = $uri_e[$nrs1]; $actionName = $uri_e[$nrs1 + 1]; } elseif($uri_e[$nrs1] === 'test' && $uri_e[$nrs1 + 1] === '' ){ $controllerName = 'test'; $actionName = ''; }else { echo 'Controller can not be found'; } /* * Which controller is passed ? * Uncomment the next line to find out */ //echo '<br />Controller Name: ' . $controllerName . '<br />'; Thats all, this way you can at least follow the rest of the tuts Hope it helps Regards mantis Quote Link to comment Share on other sites More sharing options...
mantis Posted September 9, 2013 Report Share Posted September 9, 2013 As the above does not work that well and is all but elegant I sat down and refactored the code. Firstly find the lines (of the original code) $uri = strtolower($_SERVER['REQUEST_URI']); list($pfx, $controllerName,$actionName) = preg_split('/[\/\\\]/',$uri); and replace with: $uri = strtolower($_SERVER['REQUEST_URI']); $url = preg_split('/[\/\\\]/', $uri); //See if you are on target by un commenting the following two lines index should be $url[3] //echo '<pre>'; //print_r($url); //list($pfx, $controllerName,$actionName) = preg_split('/[\/\\\]/',$uri); // this does not work unless you are in the root if ($url[3] === "") { $controllerName = "index"; $actionName = ""; } else { $controllerName = $url[3]; $actionName = $url[4]; } Regards mantis Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.