میخواهیم یک کنترلر در symfony ایجاد کنیم و در نهایت خروجی json داشته باشیم :
بعد از نصب symfony و استارت سرور در پوشه src در پوشه Controller یک فایل به اسم BlogController ایجلد میکنیم
class BlogController extends AbstractController {}
در قسمت بعد میخواهیم 3 صفحه داشته باشیم که تمامی پست ها و یک پست سرچ یک پست را ببینیم
به همین ترتیب 3 تابع به همین نام ها ایجاد ایجاد میکنیم
public function list() {} public function post() {} public function postBYSlug() {}
برای roure در symfony ما به صورت حاشیه نویسی و از Annotation استفاده میکنیم که میتوانید با استفاده از دستور زیر آن را نصب کیند
composer require annotations
ما در اینجا میخواهیم پست های وبلاگ خودمون را از یک تابع که به صورت private تعیرف کرده ایم بگیریم که به صورت زیر است
private const POST = [ [ 'id' => 1, 'slug' => 'hello world', 'title' => 'hello world' ], [ 'id' => 2, 'slug' => 'one hello world', 'title' => 'one hello world' ], [ 'id' => 3, 'slug' => 'two hello world', 'title' => 'two hello world' ], ];
که در تابع اول میخواهیم تمامی پست ها رو ببینیم
/** * @Route("/{page}", name="blog_list ", defaults={"page": 5 }) */ public function list($page = 1) { return new JsonResponse( [ 'page' => $page, 'data' => array_map(function ($item){ return $this->generateUrl('blog_by_id', ['id' => $item['id']]); } ,self::POST) ] ); }
در تابع دوم یک پست را با استفاده از id
/** * @Route("/post/{id}", name="blog_id ") */ public function post($id) { return new JsonResponse( self::POST[ array_search($id, array_column(self::POST, 'id'))] ); }
و در تابع بعدی سرچ یک پست با استفاده از یک مقدار متغییر
/** * @Route("/post/{slug}", name="blog_by_slug ") */ public function postBYSlug($slug) { return new JsonResponse( self::POST[array_search($slug, array_column(self::POST, 'slug'))] ); }
که در نهاییت کد ما به شکل زیر می باشد
<?php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\Routing\Annotation\Route; /** * Class BlogController * @Route("/blog") */ class BlogController extends AbstractController { private const POST = [ [ 'id' => 1, 'slug' => 'hello world', 'title' => 'hello world' ], [ 'id' => 2, 'slug' => 'one hello world', 'title' => 'one hello world' ], [ 'id' => 3, 'slug' => 'two hello world', 'title' => 'two hello world' ], ]; /** * @Route("/{page}", name="blog_list ", defaults={"page": 5 }) */ public function list($page = 1) { return new JsonResponse( [ 'page' => $page, 'data' => array_map(function ($item){ return $this->generateUrl('blog_by_id', ['id' => $item['id']]); } ,self::POST) ] ); } /** * @Route("/post/{id}", name="blog_by_id", requirements={"id"="\d+"}) */ public function post($id) { return new JsonResponse( self::POST[ array_search($id, array_column(self::POST, 'id'))] ); } /** * @Route("/post/{slug}", name="blog_by_slug ") */ public function postBYSlug($slug) { return new JsonResponse( self::POST[array_search($slug, array_column(self::POST, 'slug'))] ); } }