2
votes

I believe I know how to do this, but wanted to verify with my awesome community peeps. =)

Here's an example:

I have a Controller class called 'tami', with an action 'index'.

I know that if I want someone to access that controller/action combo via an URL other than "/tami/" or "/tami/index", then I should add a route, via something like this:

Route::set('pretty_tami', 'these-are-my-initials(/<action>)')
    ->defaults(array(
        'controller' => 'tami',
        'action' => 'index',
    ));

But, users can still access this page via /tami/.

How can I turn off the default routing, so that the only valid routes are the ones I define?

I assume I can just remove the default route found in kohana/application/bootstrap.php. Is that correct? Or would that break something else?

3
Dont afraid, every script in your APPPATH dir can be changed for your needs. - biakaveron

3 Answers

3
votes

I'd say exactly the same as @simshaun — either remove the default route (leaving other controllers unreachable) or check in the before() function in Controller_Tami for the uri to see if it's what you're after.

If you're using Kohana 3.1, you can now use lambda logic/anonymous functions to define your routes.

Something like this would take the extra routing logic out of the controller (which is good as we're keeping it in one place):

Route::set('default', function($uri)
    {
        if ($uri == 'tami' OR $uri == 'tami/index')
        {
            // Route not allowed by the default methods
            throw new Kohana_404_Exception("Route not permitted");
        }
    },
    '(<controller>(/<action>(/<id>)))'
);

Something I haven't yet used but it looks amazingly powerful.

3
votes

I think the easiest way would be to remove the default route in your bootstrap file, yes. However, any controllers that you have not manually specified a route for can no longer be accessed.

What I would do is create a class, e.g. Controller_Derouter that Controller_Tami extends. Use the before() method in Controller_Derouter to test if the controller was accessed from the default route, and if so, throw a 404. I think you should be able to do that by comparing $this->request->controller against the first URI segment.

Edit: The solution mentioned above is unnecessary if you ever only plan on disabling the default route for just the Tami controller. If that's the case, you could just implement the before() method directly in the Tami controller.

1
votes

Maybe like this?

Route::set('pretty_tami', 'these-are-my-initials/<action>')
    ->defaults(array(
        'controller' => 'tami',
    ));

So there wouldn't be a default action. And you probably want to update the default route (if you still have one) with a regex to exclude tami.

Route::set('default', '(<controller>(/<action>(/<id>)))', array('controller' => '/^(?!tami)/'))
    ->defaults(array(
        'controller' => 'welcome',
        'action'     => 'index',
    ));