ایجاد controller در symfony

ایجاد controller در symfony

میخواهیم یک کنترلر در 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'))]
        );
    }

}

 

افزودن دیدگاه جدید

متن ساده

  • تگ‌های HTML مجاز نیستند.
  • خطوط و پاراگراف‌ها بطور خودکار اعمال می‌شوند.
  • Web page addresses and email addresses turn into links automatically.