سلام دوستان

در بخش های قبلی گفته شد که چارچوب سیمفونی از بخش های model ، controller و View استفاده می کند که بخش کنترولر اصلی ترین بخش برنامه و حاوی منطق و دستورات اصلی برنامه نویسی است. در این قسمت روش پیاده سازی کنترولر را آمورش می دهیم.


هر کنترولر یک تابع ساده پی اچ پی است که ایجاد می شود تا اطلاعات را از شی Request گفته و یک شی Response را ایجاد کرده و باز گرداند. پاسخ نیز می تواند یک صفحه HTML، JSON، XML، دانلود فایل، تغییر مسیر، خطای ۴۰۴ یا هر چیز دیگری باشد که می توانید تصور کنید. کنترل کننده شامل مجموعه دستوراتی خواهد بود که می خواهید برای هر درخواست اجرا شود.

برنامه نویسی یک کنترولر ساده

یک کنترل کننده ساده بصورت یک متد (تابع)در داخل یک کلاس کنترل کننده تعریف می شود:

// src/Controller/LuckyController.php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class LuckyController
{
/**
* @Route("/lucky/number/{max}", name="app_lucky_number")
*/
public function number($max)
{
$number = random_int(0, $max);
return new Response(
'<html><body>Lucky number: '.$number.'</body></html>'
);
}

}

در مثال فوق، تابع کنترل کننده number را می بینید که داخل کلاس کنترل LuckyController قرار دارد.

این تابع کنترولر می تواند یک پارامتر بنام max دریافت کند. یک عدد تصادفی بین صفر تا max تولید کرده و بعنوان پاسخ برگرداند. و برای نگاشت یک مسیر به این تابع کنترولر توضیحاتی قبل از تابع قرار داده شده است:

/**
* @Route("/lucky/number/{max}", name="app_lucky_number")
*/

برای اجرای این کنترولر در نوار آدرس مرورگر، درخواست زیر را انجام دهید:

http://localhost:8000/lucky/number/100

کلاس کنترل کننده پایه و سرویس های آن

Symfony با یک کلاس کنترل کننده پایه اختیاری به نام AbstractController کمک میکند تا برنامه نویسی راحت تر شود! شما می توانید آن را گسترش دهید تا به برخی از متد های کمکی آن دسترسی پیدا کنید.

برای گسترش آن کافی است در شروع برنامه اعلان use را برای کلاس کنترل کننده خود اضافه کرده و سپس LuckyController را تغییر دهید تا از کلاس AbstractController ارث بری داشته باشد:

// src/Controller/LuckyController.php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class LuckyController extends AbstractController
{
// ...
}

حالا به متدهای جالبی از این کلاس دسترسی خواهید داشت که در ادامه مهمترین آنها را بررسی می کنیم.

ساخت URL ها

متد generateUrl  تنها یک متد کمکی است که URL را برای یک مسیر داده شده تولید می کند:

$url = $this->generateUrl('app_lucky_number', array('max' => 10));

تغییر دادن مسیر(redirection)

اگر می خواهید کاربر را به صفحه دیگری هدایت کنید، از متد های redirectToRoute  و redirect استفاده کنید:

use Symfony\Component\HttpFoundation\RedirectResponse;
// ...
public function index()
{
// redirects to the "homepage" route
return $this->redirectToRoute('homepage');
// redirectToRoute is a shortcut for:
// return new RedirectResponse($this->generateUrl('homepage'));
// does a permanent - 301 redirect
return $this->redirectToRoute('homepage', array(), 301);
// redirect to a route with parameters
return $this->redirectToRoute('app_lucky_number', array('max' => 10));
// redirects to a route and mantains the original query string parameters
return $this->redirectToRoute('blog_show', $request->query->all());
// redirects externally
return $this->redirect('http://symfony.com/doc');
}

رندر کردن فایل های الگو

اگر فایل الگویی دارید و می خواهید با تزریق محتوا به آن، آنرا رندر کرده و نتیجه را در شی پاسخ قرار دهید می توانید متد render را بصورت زیر استفاده کنید:

// renders templates/lucky/number.html.twig
return $this->render('lucky/number.html.twig', array('number' => $number));

ساخت کنترولرها در سیمفونی

برای ساخت خودکار کنترولر با استفاده از خط فرمان، دستور زیر را اجرا کنید:

php bin/console make:controller BrandNewController

و اگر می خواهید CRUD کامل با استفاده از داکترینه ایجاد کنید، دستور زیر را در خط فرمان اجرا کنید:

php bin/console make:crud Product

با اجرای این فرمان، علاوه بر اینکه کلاس کنترولر ساخته می شود، توابع کنترولر برای نمایش رکوردها، افزودن سطر، ویرایش و حذف سطر به آن اضافه می شود.