Jump to content

Kp5-Dispatching-Views Errors


Recommended Posts



I have been going through your php training video and i have done all up to php_advanced_pt2 which includes :







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:





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.






if i remove



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 by rickyspires
Link to comment
Share on other sites

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



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?




Link to comment
Share on other sites

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




Link to comment
Share on other sites

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




Link to comment
Share on other sites

  • 2 weeks later...

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>';

//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];




Link to comment
Share on other sites

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.

Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Create New...