Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Routes in Codeigniter - Automatically

I have a problem with Codeigniter routes. I would like to all registered users on my site gets its own "directory", for example: www.example.com/username1, www.example.com/username2. This "directory" should map to the controller "polica", method "ogled", parameter "username1".

If I do like this, then each controller is mapped to this route: "polica/ogled/parameter". It's not OK:

$route["(:any)"] = "polica/ogled/$1";

This works, but I have always manually entered info in routes.php:

$route["username1"] = "polica/ogled/username1";

How do I do so that this will be automated?

UPDATE: For example, I have controller with name ads. For example, if you go to www.example.com/ads/ there will be listed ads. If you are go to www.example.com/username1 there are listed ads by user username1. There is also controller user, profile, latest,...

My Current routes.php:

$route['oglasi'] = 'oglasi';
$route['(:any)'] = "polica/ogled/$1"
$route['default_controller'] = 'domov';
$route['404_override'] = '';

I solved problem with this code:

$route['oglasi/(:any)'] = 'oglasi/$1';
$route['(:any)'] = "polica/ogled/$1"
$route['default_controller'] = 'domov';
$route['404_override'] = '';

Regards, Mario

like image 627
Puzo Avatar asked Oct 01 '11 06:10

Puzo


People also ask

What is the use of custom routes in CodeIgniter?

Routes are responsible for responding to URL requests. Routing matches the URL to the pre-defined routes. If no route match is found then, CodeIgniter throws a page not found an exception. Routes in CodeIgniter are defined using the below formula: Controller -is mapped to the controller name that should respond to the URL.

What is the difference between CodeIgniter routing and URL routing?

Routes in CI are responsible for responding to URL requests. Routing matches the URL to the pre-defined routes. If no CodeIgniter Route match is found then, CodeIgniter throws a page not found an exception. CI Routing is responsible for responding to URL requests.

What happens if no CodeIgniter route match is found?

If no CodeIgniter Route match is found then, CodeIgniter throws a page not found an exception. CI Routing is responsible for responding to URL requests. Routing matches the URL to the pre-defined routes. Controllers glue the models and views together.

How to test if CodeIgniter is responding to URL requests?

you can click on the New Contact and Edit Contact links and see what happens Routes in CI are responsible for responding to URL requests. Routing matches the URL to the pre-defined routes. If no CodeIgniter Route match is found then, CodeIgniter throws a page not found an exception. CI Routing is responsible for responding to URL requests.


2 Answers

The problem with your route is that by using :any you match, actually...ANY route, so you're pretty much stuck there. I think you might have two solutions:

1)You can selectively re-route all your sites controller individually, like:

$route['aboutus'] = "aboutus";
$route['where-we-are'] = "whereweare";
//And do this for all your site's controllers
//Finally:
$route['(:any)'] = "polica/ogled/$1";

All these routes must come BEFORE the ANY, since they are read in the order they are presented, and if you place the :any at the beginning it will happily skip all the rest.

EDIT after comment:

What I mean is, if you're going to match against ANY segment, this means that you cannot use any controller at all (which is, by default, the first URI segment), since the router will always re-route you using your defined law. In order to allow CI to execute other controllers (whatever they are, I just used some common web pages, but can be literally everything), you need to allow them by excluding them from the re-routing. And you can achieve this by placing them before your ANY rule, so that everytime CI passed through your routing rules it parses first the one you "escaped", and ONLY if they don't match anything it found on the URL, it passes on to the :ANY rule.

I know that this is a code verbosity nonetheless, but they'll surely be less than 6K as you said. Since I don't know the actual structure of your URLs and of your web application, it's the only solution that comes to my mind. If you provide further information, such as how are shaped the regular urls of your app, then I can update my answer

/end edit

This is not much a pratical solution, because it will require a lot of code, but if you want a design like that it's the only way that comes to my mind. Also, consider you can use regexes as the $route index, but I don't think it can work here, as your usernames are unlikely matchable in this fashion, but I just wanted to point out the possibility.

OR

2) You can change your design pattern slightly, and assign another route to usernames, something along the line of

$route['user/(:any)'] = "polica/ogled/$1";

This will generate quite pretty (and semantic) URLs nonetheless, and will avoid all the hassle of escaping the other routes.

like image 147
Damien Pirsy Avatar answered Sep 20 '22 00:09

Damien Pirsy


view this: http://www.web-and-development.com/codeigniter-minimize-url-and-remove-index-php/ which includes remove index.php/remove 1st url segment/remove 2st url sigment/routing automatically.it will very helpful for you.

like image 22
jiabo.zhang Avatar answered Sep 19 '22 00:09

jiabo.zhang