Convention based routing for PHP based on Symfony components.

Croute is great because:

Code Quality Rank: L4
Monthly Downloads: 149
Programming language: PHP
License: MIT License
Tags: Routers     Routing     Router    
Latest version: v1.4.1

Croute alternatives and similar libraries

Based on the "Routers" category.
Alternatively, view Croute alternatives based on common mentions on social networks and blogs.

Do you think we are missing an alternative of Croute or a related project?

Add another 'Routers' Library



Latest Version on Packagist [Software License](LICENSE.txt) Build Status Coverage Status SensioLabsInsight

Convention based routing for PHP based on Symfony components.

Croute is great because:

  • You don't need to maintain a routing table
  • Promotes consistent code organization
  • Allows for customization through annotations and events

Install via Composer

Via the command line:

composer.phar require thewunder/croute ~1.0

Or add the following to the require section your composer.json:

"thewunder/croute": "~1.0"


Your index.php should look something like this:

$router = Router::create($eventDispatcher, ['Your\\Controller\\Namespace'], [$dependency1, $dependency2]);

Your controllers should look something like this:

namespace Your\Controller\Namespace

class IndexController extends Croute\Controller
    public function __construct($dependency1, $dependency2)

     * Will be available at http://yourdomain/
     * and require the "required" (body or querystring) request parameter
    public function indexAction($required, $optional = null)
        echo 'Crouter Controller'; //you can echo or return a symfony Response

     * Available at http://yourdomain/test
    public function testAction()
        return new Response('Test Action');

The name of the controller determines which url it appears as:

It supports nested namespaces so that:


Croute optionally supports controller and action annotations through the excellent minime/annotations library. To add an annotation handler simply:


Two annotations are included (but must be added) out of the box @httpMethod and @secure.


Restricts the allowed http methods. Returns a 400 response if the method does not match.

     * @httpMethod POST
    public function saveAction()


Requires a secure connection. If the connection is not https send a 301 redirect to the same url with the https protocol.

 * @secure
class IndexController extends Controller


Symfony events are dispatched for every step in the routing process. A total of 12 events are dispatched in a successful request:

  1. router.request
  2. router.controller_loaded
  3. router.controller_loaded.{ControllerName}
  4. router.before_action
  5. router.before_action.{ControllerName}
  6. router.before_action.{ControllerName}.{actionName}
  7. router.after_action
  8. router.after_action.{ControllerName}
  9. router.after_action.{ControllerName}.{actionName}
  10. router.before_response_sent
  11. router.response_sent
  12. router.response_sent.{ControllerName}
  13. router.response_sent.{ControllerName}.{actionName}

The {ControllerName} will be sans 'Controller' and {actionName} sans 'Action' i.e IndexController::indexAction -> router.before_action.Index.index.

At any time before the response is sent, in an event listener you can set a response on the event to bypass the action and send instead.

    public function myListener(ControllerLoadedEvent $event)
        $event->setResponse(new Response('PermissionDenied', 403));

Error Handling

Proper error handling is not really something that I can do for you. It's up to you to determine how to do logging, how and when to render a pretty error page. To handle errors, implement the EventHandlerInterface and set your error handler on the router. Your class will be called when common routing events occur (i.e. 404 errors) and when there is an exception during the routing process.


Please see [CONTRIBUTING](CONTRIBUTING.md) for details.

*Note that all licence references and agreements mentioned in the Croute README section above are relevant to that project's source code only.