×
Press M for TOC
Press -> (next arrow key) for next posting
Press <- (previous arrow key) previous posting
Advertisement
Web Development , Learn Symfony

Symfony Routing Tutorials

 

Symfony – Routing

 


 

 
 

Routing maps request URI to a specific controller’s method. In general, any URI has the following three parts 

  • Hostname segment
  • Path segment
  • Query segment

For example, in URI / URL, https://mytutorials.xyz/index?s=symfony, mytutorials.xyz is the hostname segment, index is the path segment and s=symfony is the query segment. Generally, routing checks the page segment against a set of constraints. If any constraint matches, then it returns a set of values. One of the main value is the controller.

Annotations

 

Annotation plays an important role in the configuration of the Symfony application. Annotation simplifies the configuration by declaring the configuration in the coding itself. Annotation is nothing but providing meta-information about class, methods, and properties. Routing uses annotation extensively. Even though routing can be done without annotation, annotation simplifies routing to a large extent.

The following is a sample annotation.

/** 
   * @Route('/student/home') 
*/ 
public function homeAction() { 
   // ... 
} 

Routing Concepts

 

Consider the StudentController class created in student project.

StudentController.php

 

// src/AppBundle/Controller/StudentController.php 
namespace AppBundle\Controller;  

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 

class StudentController extends Controller { 
   /** 
      * @Route('/student/home') 
   */ 
   public function homeAction() { 
      // ... 
   }  
    
   /** 
      * @Route('/student/about') 
   */ 
   public function aboutAction() { 
   } 
} 

Here, the routing performs two steps. If you go to /student/home, the first route is matched then homeAction() is executed. Otherwise, If you go to /student/about, the second route is matched, and then aboutAction() is executed.

Adding Wildcard Formats

 

Consider, you have a paginated list of student records with URLs like /student/2 and /student/3 for page 2 and 3 correspondingly. Then, if you want to change the route’s path, you can use wildcard formats.

Example

 

// src/AppBundle/Controller/BlogController.php 
namespace AppBundle\Controller;  

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;  

class StudentController extends Controller {
   /**      
      * @Route("/student/{page}", name = "student_about", requirements = {"page": "\d+"})
   */ 
   public function aboutAction($page) { 
      // ... 
   } 
} 

Here, the \d+ is a regular expression that matches a digit of any length.

Assign Placeholder

 

You can assign a placeholder value in routing. It is defined as follows.

// src/AppBundle/Controller/BlogController.php 
namespace AppBundle\Controller;  

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;  

class StudentController extends Controller { 
   /**      
      * @Route("/student/{page}", name = "student_about", requirements = {"page": "\d+"})
   */ 
    
   public function aboutAction($page = 1) { 
      // ... 
   } 
}

Here, if you go to /student, the student_about route will match and $page will default to a value of 1.

Redirecting to a Page

 

If you want to redirect the user to another page, use the redirectToRoute() and redirect() methods.

public function homeAction() { 
   // redirect to the "homepage" route 
   return $this->redirectToRoute('homepage');  
   
   // redirect externally 
   \return $this->redirect('http://example.com/doc'); 
}

Generating URLs

 

To generate a URL, consider a route name, student_name, and wildcard name, student-names used in the path for that route. The complete listing for generating a URL is defined as follows.

class StudentController extends Controller { 
   public function aboutAction($name) { 
      // ...  
      // /student/student-names 
      $url = $this->generateUrl( 
         ‘student_name’, 
         array(‘name’ =>
         ’student-names’) 
      ); 
   } 
}

StudentController

 

Consider a simple example for routing in StudentController class as follows.

StudentController.php

 

<?php  
namespace AppBundle\Controller;  

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller;  

class StudentController  { 
   /** 
      * @Route("/student/home") 
   */ 
   
   public function homeAction() { 
      $name = 'Student details application'; 
      return new Response( 
         '<html><body>Project: '.$name.'</body></html>' 
      ); 
   } 
}

Now, request the URL, http://localhost:8000/student/home and it produces the following result.

Student Controller

Similarly, you can create another route for aboutAction() as well.

 
 

Leave a Reply

Your email address will not be published. Required fields are marked *

Advertisement