مسیریابی به معنای نگاشت و اتصال مسیرهایی که کاربران ما در درخواست های خود استفاده خواهند کرد به توابع تعریف شده در کلاس کنترولر است. اینکه برای هر درخواست کاربر، کدام تابع کنترولر اجرا شود و این درخواست چه پارامترهایی داشته باشد و هر پارامتر ورودی به کدام پارامتر تابع کنترولر نگاشت شود.

سیمفونی روش های مختلفی برای پیکربندی این نگاشت ها فراهم می کند.

استفاده از URL های زیبا برای هر برنامه ی کاربردی لازم است. این به معنی کنار گذاشتن URL های زشتی مثل:

http://www.codenevisan.com/index.php?article_id=124

و استفاده از URL زیبایی مثل:

http://www.codenevisan.com/read/about-symfony-routing

است.

مهمتر از زشتی و زیبایی، انعطاف پذیری است .اینکه اگر بخواهید یک صفحه را از پوشه ای به پوشه دیگری از سایت منتقل کنید، چه تغییراتی در آدرس ها باید انجام دهید. در چارچوب سیمفونی مسیریابی و تعیین URL ها به راحتی انجام شده و انعطاف پذیری بالایی فراهم می کند.

ایجاد مسیرها

مسیر یک نگاشت از یک مسیر URL به یک کنترل کننده است. فرض کنید می خواهید یک مسیر دقیقا مشابه /blog باشد و مسیر دیگری بصورت پویا، با  URL هایی مانند / blog/my-post یا /blog/all-about-symfony تطبیق داده شود.

مسیرها را می توان در فایل هایی با فرمت  YAML، XML و PHP و یا با روش حاشیه نویسی تعریف کرد. تمام فرمت ها ویژگی ها و عملکرد یکسانی را ارائه می دهند، بنابراین می توانید هر فرمت را که خواستید انتخاب کنید. اگر حاشیه نویسی (annotation) را انتخاب می کنید، باید یکبار دستور زیر را در خط فرمان اجرا کنید تا سیمفونی از آن پشتیبانی کند :


composer require annotations

حالا می توانید به شکل های مختلف مسیرها را تعریف کنید. در روش حاشیه نویسی تعریف مسیرها در داخل کلاس کنترولر و قبل از هر کدام از توابع کنترولر قرار داده می شود. و در روش های دیگر باید فایلی با پسوند مربوطه در زیر پوشه config از ماژول، کاربرد یا پروژه قرار داده شود.

مسیریابی با روش حاشیه نویسی

// src/Controller/BlogController.php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
class BlogController extends AbstractController
{
/**
* Matches /blog exactly
*
* @Route("/blog", name="blog_list")
*/
public function list()
{
// ...
}
/**
* Matches /blog/*
*
* @Route("/blog/{slug}", name="blog_show")
*/
public function show($slug)
{
// $slug will equal the dynamic part of the URL
// e.g. at /blog/yay-routing, then $slug='yay-routing'
// ...
}
}

مسیریابی با روش YAML

# config/routes.yaml
blog_list:
path: /blog
controller: App\Controller\BlogController::list
blog_show:
path: /blog/{slug}
controller: App\Controller\BlogController::show

مسیریابی با روش XML

<!-- config/routes.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<routes xmlns="http://symfony.com/schema/routing"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/routing
http://symfony.com/schema/routing/routing-1.0.xsd">
<route id="blog_list" controller="App\Controller\BlogController::list" path="/blog" >
<!-- settings -->
</route>
<route id="blog_show" controller="App\Controller\BlogController::show" path="/blog/{slug}">
<!-- settings -->
</route>
</routes>

مسیریابی با روش PHP

// config/routes.php
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
use App\Controller\BlogController;
$routes = new RouteCollection();
$routes->add('blog_list', new Route('/blog', array(
'_controller' => [BlogController::class, 'list']
)));
$routes->add('blog_show', new Route('/blog/{slug}', array(
'_controller' => [BlogController::class, 'show']
)));
return $routes;

با تعریف هر کدام از مسیریابی های فوق:

اگر کاربر blog/ را درخواست کند ، تابع ()list از کلاس BlogController اجرا خواهد شد.

اگر کاربر */blog/  را درخواست کند، با مسیر دومی تطبیق داده شده و تابع ()show از کلاس کنترولر BlogController اجرا خواهد شد. بعنوان مثال اگر درخواست بصورت 

blog/yay-routing/  باشد ، پارامتر ورودی slug$ از تابع ()show یا عبارت yay-routing پر شده و این تابع فراخوانی می شود.

هر وقت که در مسیر خود {placeholder} داشته باشید،  هر مقداری می تواند به جای آن قرار گیرد و تابع کنترل کننده هم می تواند یک پارامتر به نام $placeholder داشته باشد.

هر مسیر نیز یک نام داخلی مثل  blog_list و blog_show دارد که می توانند هر چیزی باشند (ولی در کل برنامه باید منحصر به فرد باشند). نام ها دارای هیچ معنا و مفهومی نیستند و تنها بعدا می توانید از آنها برای تولید URL ها استفاده کنید.

ما در این جلسه سعی کردیم، مسیریابی در سیمفونی را بصورت ساده و قابل فهم توضیح دهیم، برای یادگیری کامل می توانید به مبحث مسیریابی در سایت مرجع سیمفونی مراجعه کنید.