2021年4月2日金曜日

PHP:Symfony-03

1.ルーティング

class RootController extends AbstractController

{

    /**

     * @Route("/root", name="root")

     */

    public function index()

    {

        return $this->render('root/index.html.twig', [

            'controller_name' => 'BlogController',

        ]);

    }

}

PHPDocに記載の有る @Route 定義がアノテーションによるルーティングです。”/root”にマッチするURLが来た場合にこの index 関数が実行されます。nameはユニークである必要が有る。

結果はResponseオブジェクト( Symfony\Bundle\FrameworkBundle\Controller\Response)をreturnで返します。$this->render() を呼び出すとTwigでレンダリングした結果をResponseオブジェクトとして返す。

    /**
     * ルーティングを増やす
     * http://127.0.0.1:8000/root/demo/ 
     * @Route("/root/demo", name="root_demo")
     */
    public function demoAction()
    {
        return $this->render('root/index.html.twig', [
            'controller_name' => 'RootController::demo',
        ]);
    }

    /**
     * 引数のあるルーティング
     * http://127.0.0.1:8000/books/detail/20/ 
     * @Route("/books/detail/{book_id}/", name="book_detail", 
     * requirements={"book_id"="\d+"})
     */
    public function bookDetailAction($book_id)
    {
        return $this->render('books/detail.html.twig', [
            'book_id' => $book_id,
            'book_detail' => 'dumy text'
        ]);
    }

    /**
     * リクエスト内容を受け取る
     * http://127.0.0.1:8000/books/detail/?book_id=33
     * @Route("/books/detail/", name="book_detail_for_query")
     */
    public function bookDetailActionForQuery(Request $req)
    {
        $book_id = $req->query->get('book_id');
    
        return $this->render('books/detail.html.twig', [
            'book_id' => $book_id,
            'book_detail' => 'dumy text'
          ]);
    }

    /**
     * HTTPメソッドに応じてルーティングする
     * http://127.0.0.1:8000/books/edit/
     * @Route("/books/edit/", name="book_edit_exec", methods={"POST"})
     */
    public function bookEditExecAction(Request $req)
    {
        return $this->render('books/detail.html.twig', [
            'book_id' => 0,
            'book_detail' => '編集に成功しました'
        ]);
    }

    /**
     * @Route("/demo404")
     */
    public function demo404Action()
    {
        throw $this->createNotFoundException('見つからないようです');
    }


    /**
     * JSONデータを返す
     * http://127.0.0.1:8000/demoJsonResponse
     * @Route("/demoJsonResponse")
     */
    public function demoJsonResponse()
    {
        return $this->json([
            'データ1' => 100,
            'データ2' => 200
        ]);
    }

※ルーテイングがわかりやすい