Yii Routes and URL Generation: Quick Explanation and Examples
Source

Yii Routes and URL Generation: Quick Explanation and Examples

Last updated:

Routing is very important on any web framework and this is also true on Yii. Apart from configuring the actual routes in your main.php config file, you'll probably use Yii::app()->createUrl() many, many times on your app.

Here is a small reminder on the basic stuff you need to know about routes on Yii.

Sample main.php config file showing routes

<?php
// previous lines ignored
'urlManager' => array(
    'urlFormat' => 'path',
    'showScriptName' => false,
    'rules' => array(
        // specific rules
        // route => controller/action 
        'departments/<id:\d+>/add_employee>' => 'departments/addEmployee',
        'employees/<id:\d+>/add_to_department/<department_name:\w+>' => 'employees/addToDepartment',   

        // catch-all rules
        // this file is read in order so it only matches if no other rules
        // above have matched
        '<controller:\w+>' => '<controller>/index',
        '<controller:\w+>/<id:\d+>' => '<controller>/view',
        '<controller:\w+>/<id:\d+>/<action:\w+>' => '<controller>/<action>'
    )
),

URL to Controller Action

The specific rules mean the following to Yii:

  • If you receive a request that matches the left-hand side, this is what Yii will do:

    • 'departments/5/add_employee' will cause function actionAddEmployee(5)to will be called in DepartmentsController, so you should have a function like this:
     <?php
     class DepartmentsController extends Controller{
    
     // previous lines ignored
     public function actionAddEmployee($id){
         // stuff...
     }
     // other methods
    
    • 'employees/15/add_to_department/sales' will cause function actionAddToDepartment(15,'sales') to be called in EmployeesController or, in other words:
     <?php
     class EmployeesController extends Controller{
    
     // previous lines ignored
     public function actionAddToDepartment($id,$department_name){
         // stuff
     }
     // other methods
    

This is how you generate a method call from a url. But how do you generate an url from a controller action?

Controller Action to URL

To generate a url from a controller/action route (for example, for links) you'll probably use Yii::app()->createUrl($route, $params). It takes a route (String) and parameters (Array), like this:

<?php

$url = Yii::app()->createUrl('departments/addEmployee', array('id' => 10));
// $url equals "/departments/10/add_employee"

$url2 = Yii::app()->createUrl('employees/addToDepartment',array('id' => 34, 'department_name' => 'marketing'));
// $url2 equals "/employees/34/add_to_department/marketing"

Dialogue & Discussion