The array that is passed as the third parameter to Route::set()
restricts the values that can be passed to the route. In your code array('directory' => '(admin|affiliate)')
restricts the directory parameter to be either 'admin' or 'affiliate' To have it go deeper you would need to modify the route.
The Kohana Routing Guide has a bunch of examples using filters to route in any way you could possibly imagine, but you could route to subdirectories without turning to filters.
For example, with the following directory structure:
classes/Controller/
Admin/
Cupertino/
Home.php (Controller_Admin_Cupertino_Home)
Home.php (Controller_Admin_Home)
Affiliate/
Cupertino/
Home.php (Controller_Affiliate_Cupertino_Home)
Home.php (Controller_Affiliate_Home)
And the following route:
Route::set('sections', '<directory>(/<controller>(/<action>(/<id>)))',
array(
'directory' => '(admin/cupertino|admin|affiliate/cupertino|affiliate)'
))
->defaults(array(
'controller' => 'home',
'action' => 'index',
));
The URLs index.php/admin
, index.php/admin/cupertino
, index.php/affiliate
, and index.php/affiliate/cupertino
will route through their respective controllers.
Subdirectories need to be listed before their parents otherwise Kohana will always match to the parent. e.g. the following will always route to Controller_Admin_Home
even for the URL index.php/admin/cupertino
:
`array('directory' => 'admin|admin/cupertino')`.
Using filters might look something like the following:
Route::set('admin_subsections', 'admin/<directory>(/<controller>(/<action>(/<id>)))',
array(
'directory' => '(cupertino|sanjose|santacruz)'
))
->filter(function($route, $params, $request)
{
// append "admin/" to the directory param
$params['directory'] = 'admin/' . $params['directory'];
return $params; // Returning an array will replace the parameters
})
->defaults(array(
'controller' => 'home',
'action' => 'index',
));
Route::set('sections', '<directory>(/<controller>(/<action>(/<id>)))',
array(
'directory' => '(admin)'
))
->defaults(array(
'controller' => 'home',
'action' => 'index',
));
And again, order matters.