So I'm trying to build a route with sub directories and following the Kerkness wiki guide but keep getting errors. If someone could point out what I'm doing wrong I would greatly appreciate it.
http://kerkness.ca/wiki/doku.php?id=routing:building_routes_with_subdirectories
The code:
Route::set('default', '(<directory>(/<controller>(/<action>(/<id>))))', array('directory' => '.+?'))
->defaults(array(
'directory' => 'admin',
'controller' => 'main',
'action' => 'index',
));
The url:
/admin/weather/feedback
The file:
/application/classes/controller/admin/weather/feedback.php
class Controller_Admin_Weather extends Controller_Admin_Base {
The error:
ReflectionException [ -1 ]: Class controller_admin_weather does not exist
Weather needs to be the controller not feedback. Make a weather.php in the admin folder and put the controller as Controller_Admin_Weather and then the action action_feedback.
As #mikelbring said, your controller class is named wrongly. A class in that file should be called Controller_Admin_Weather_Feedback
Do you really need so many optional segments in your route?
Also; if there are no variable elements to the urls you can just stick with defaults like this:
Route::set('my_route_name', 'admin/weather/feedback')
->defaults(array(
'directory' => 'admin/weather',
'controller' => 'feedback',
'action' => 'index',
));
If your class was in /application/classes/controller/admin/weather.php and had an action_feedback(...) method, you could use the following route
Route::set('my_route_name', 'admin/weather/feedback')
->defaults(array(
'directory' => 'admin',
'controller' => 'weather',
'action' => 'feedback',
));
Related
I have tried the following way
Route::set('sections', '<directory>(/<controller>(/<action>(/<id>)))',
array(
'directory' => '(admin|affiliate)'
))
->defaults(array(
'controller' => 'home',
'action' => 'index',
));
Instead of Home controller in Campaign folder I need to load Home Controller from Campaign/City folder by default. I have used the above code in bootstrap.php, but it gives 'URL not found on this server' error
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.
I have controllers
--controllers
--Administrator
-Base.php
-Admin.php (extend Base.php)
-controller1.php
-controller2.php
-etc
And my route looks like this
Route::set('administrator', 'Administrator(/<controller>(/<action>(/<id>)))')
->defaults(array(
'directory' => 'Administrator',
'controller' => 'base',
'action' => 'index',
));
Try to load this controller and i get message Not found
What's wrong?
UPDATE!
class Controller_Administrator_Base extends Controller_Template {
public $template = 'panel/index';
public function action_index(){
echo 'kupakonia';
}
} // End Welcome
All routes. I was trying alot of sugesstions from google and nothing helps, and I write something becouse i cant update this tobic becouse is too much code inside.
Still can't update.
Route::set('default', '(<controller>(/<action>(/<id>)))')
->defaults(array(
'controller' => 'read',
'action' => 'index',
));
Route::set('user', '(<controller>(/<action>(/<id>)))')
->defaults(array(
'controller' => 'user',
'action' => 'index',
));
Route::set('administrator', 'administrator(/<controller>(/<action>(/<id>)))')
->defaults(array(
'directory' => 'Administrator',
'controller' => 'base',
'action' => 'index',
));
Any sugestions?
Ps. still can't update this topic :/ Wtf must be more characters in tekst than in code ?
this is my first asc on stackoverflow. So sorry for this ;)
You have two catch all routes (default and user) in your Bootstrap file. These two routes do exactly the same.
Also, since these routes are catch all and the order of the routes matter, this means if the catch all route is the first it will match all URLs.
Try this:
Route::set('administrator', 'administrator(/<controller>(/<action>(/<id>)))')
->defaults(array(
'directory' => 'Administrator',
'controller' => 'base',
'action' => 'index',
));
Route::set('default', '(<controller>(/<action>(/<id>)))')
->defaults(array(
'controller' => 'read',
'action' => 'index',
));
Another thing, it is usually bad practice to have a catch all route. Try to create routes specific for your Controllers.
I know that there are countless threads about this, but I would appreciate a quick pointer to explain what I am missing here. I have a controller called Controller_Index_Orders which resides in /conroller/orders/index.php. It has one method action_index(). I then have the following Route code for it:
Route::set('orders', 'orders(/<action>)')
->defaults(array(
'controller' => 'orders',
'action' => 'index',
));
When I go to baseUrl/orders/ or baseUrl/orders I am getting a 404. What am I missing here?
EDIT:
Controller_Orders is now in /controllers/orders.php Route as follows:
Route::set('orders', 'orders(/<action>)')
->defaults(array(
'controller' => 'orders',
'action' => 'index',
));
Going to baseUrl/orders or baseUrl/orders/ still not functioning.
EDIT2:
Default Route.
Route::set('default', '((/(/)))')
->defaults(array(
'controller' => 'index',
'action' => 'index',
));
Your naming is all screwed up. If you have a controller called Controller_Index_Orders it should reside in classes/controller/index/orders.php. You'll also need to specify the proper controller in your route: 'controller' => 'index_orders'. You might have to throw a directory key in there too.
I'm trying to implement localization in my website. Currently, the basic (English) website is at http://domain.com/controller/action and I want each localization to be at http://domain.com/locale/controller/action. Basically, if a user visit the latter URL, Kohana will use the same controller and action than for the English version. In code, I will simply swap the strings.
Currently, I tried by adding the following route but that didn't work:
// This is my default route:
Route::set('default', '(<controller>(/<action>(/<overflow>)))', array('overflow' => '.*?'))
->defaults(array(
'controller' => 'home',
'action' => 'index',
));
// This the route for the localizations:
Route::set('locale', '(<locale>(/<controller>(/<action>(/<overflow>))))', array('overflow' => '.*?'))
->defaults(array(
'controller' => 'home',
'action' => 'index',
));
With this setup, if I visit http://domain.com/es/controller/action, I will get a 404 error. Any idea how I should setup my routes to make this work?
Edit:
Just to complete matino and John Himmelman's answer, if I simply swap the rules as suggested, it will work. However, the "locale" route would then become the catch-all route and you will always have to specify the locale, even if all you need is the default one (in my case "en" / English). To fix that, you can limit the "locale" parameter to the locales you support. For example:
Route::set('locale', '(<locale>(/<controller>(/<action>(/<overflow>))))', array('locale' => '(fr|zh|en)', 'overflow' => '.*?'))
->defaults(array(
'controller' => 'home',
'action' => 'index',
));
Route::set('default', '(<controller>(/<action>(/<overflow>)))', array('overflow' => '.*?'))
->defaults(array(
'controller' => 'home',
'action' => 'index',
));
In that case, only URLs that start with "fr", "zh" or "en" will be supported. Additionally, unsupported locales will return a 404 errors, and "domain.com/controller/action" will correctly display the default, English locale.
Kohana applies routes in the order they appear in your bootstrap. This is why your default/catch-all route should always be defined last.
From KO 3.0 routing doc:
It is important to understand that routes are matched in the order
they are added, and as soon as a URL matches a route, routing is
essentially "stopped" and the remaining routes are never tried.
Because the default route matches almost anything, including an empty
url, new routes must be place before it.
As suggested, swapping routes will resolve the issue.
// This the route for the localizations:
Route::set('locale', '(<locale>(/<controller>(/<action>(/<overflow>))))', array('overflow' => '.*?'))
->defaults(array(
'controller' => 'home',
'action' => 'index',
));
// This is my default route:
Route::set('default', '(<controller>(/<action>(/<overflow>)))', array('overflow' => '.*?'))
->defaults(array(
'controller' => 'home',
'action' => 'index',
));
I am having some trouble coming up with the routes for the following scenario...
I have a module controller in say...
/modules/mymodule/classes/controller/mymodule.php (class Controller_Mymodule)
and the url being
/mymodule/
and then I want to have the admin controller
/modules/mymodule/classes/controller/admin/mymodule.php (class Controller_Admin_Mymodule)
but the url would be
/admin/mymodule/
I am trying this route below but I am getting the error: Unable to find a route to match the URI: admin
Route::set('admin', 'admin/<controller>(/<action>(/<id>))')
->defaults(array(
'directory' => 'admin',
'controller' => 'pages',
'action' => 'index',
));
Unable to find a route to match the
URI: admin
Does it mean that admin/mymodule works? Anyway, admin will failed because your route has required controller param. Here is the same route with optional controller segment:
Route::set('admin', 'admin(/<controller>(/<action>(/<id>)))')
->defaults(array(
'directory' => 'admin',
'controller' => 'pages',
'action' => 'index',
));
PS. You can skip action param because 'index' is a default value.