10
votes

CakePHP 3.0

I'm getting a "Missing Route" error for a route that exists.

Here are my routes:

#my admin routes...
Router::prefix('admin', function($routes) {
    $routes->connect('/', ['controller'=>'Screens', 'action'=>'index']);
    $routes->connect('/screens', ['controller'=>'Screens', 'action'=>'index']);
    $routes->connect('/screens/index', ['controller'=>'Screens', 'action'=>'index']);
    //$routes->fallbacks('InflectedRoute');
});

Router::scope('/', function ($routes) {

    $routes->connect('/login', ['controller' => 'Pages', 'action' => 'display', 'login']);    
    $routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);

    $routes->fallbacks('InflectedRoute');
});

Plugin::routes();

Basically I just added the top section (for admin routing) to the default routes that come out of the box.

When I visit /admin/screens/index I see the following error:

enter image description here

Notice the error message says:

Error: A route matching "array ( 'action' => 'add', 'prefix' => 'admin', 'plugin' => NULL, 'controller' => 'Screens', '_ext' => NULL, )" could not be found.

...which is strange because I am not trying to access the add action. The params printed below look correct.

What is going on?

2
Urgh Cake. Using 2.0 I had problems with cached models. I found turning debug to 2 would sort it out. I am assuming you have cleared cache etcMike Miller
The debug configurations seem to have changed a bit. It's now a boolean, which I have set to TRUE. Just to be safe I also deleted all the cache files in tmp/ and it's still doing it.emersonthis
That would exhaust my go-to's. Looks like ndm has more useful insightsMike Miller

2 Answers

15
votes

Take a closer look at the stacktrace, the error dosn't occour in the dispatching process, which you seem to think, it is being triggered in your view template, where you are probably trying to create a link to the add action, and reverse-routing cannot find a matching route, hence the error.

The solution should be obvious, connect the necessary routes, being it explicit ones like

$routes->connect('/screens/add', ['controller' => 'Screens', 'action' => 'add']);

catch-all ones

$routes->connect('/screens/:action', ['controller' => 'Screens']);

or simply the fallback ones that catch everything

$routes->fallbacks('InflectedRoute');
0
votes

This work for me in case of use prefix admin :-

Router::prefix('admin', function ($routes) {
    // Because you are in the admin scope,
    // you do not need to include the /admin prefix
    // or the admin route element.
    $routes->connect('/', ['controller' => 'Users', 'action' => 'index']);
    $routes->extensions(['json', 'xml']);
    // All routes here will be prefixed with `/admin`
    $routes->connect('/admin', ['controller' => 'Order', 'action' => 'index']);
    // And have the prefix => admin route element added.
    $routes->fallbacks(DashedRoute::class);
});