Symfony5系列教程3-創建路由

這個教程是基於symfony5進行編寫,以後再出高版本的symfony,那麼就可以只出一套針對這個高版本的特性進行編寫,該系列教程會一直延續更新。

點贊再看,養成習慣,微信搜索公衆號【程序員老班長】關注這個互聯網老班長,查看更多系列文章

本節主要講解,路由,尤其是註解這種路由方式的使用。

目錄

添加註解路由

匹配HTTP方法

定義路由參數

定義可選參數

定義前綴註解

關於路由的相關命令

總結


添加註解路由

1,打開config/routes.yaml,把裏面的內容都刪掉

2,打開上一節中新建的 HelloController,修改後的代碼如下:

<?phpnamespace App\Controller;use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\Routing\Annotation\Route;class HelloController  extends AbstractController{    /**     * @Route("/hello/index", name="app_hello")     */    public function index(){        $number = random_int(0, 100);        return new Response(            '<html><body>Hello number: '.$number.'</body></html>'        );    }    /**     * @Route("/hello/index1", name="app_hello1")     */    public function index1(){        $number = random_int(0, 100);        return $this->render('hello/number.html.twig', [            'number' => $number,        ]);    }}

 

訪問:

http://127.0.0.1:8000/hello/index
http://127.0.0.1:8000/hello/index1

 

一切都能正常訪問,說明都OK。

 

匹配HTTP方法

這種路由是可以匹配http方法的,比如:GET,HEAD,POST,PUT等

下面這種路由只匹配GET和HEAD方法

@Route("/hello/index", name="app_hello",methods={"GET","HEAD"})

下面這種路由只匹配PUT方法

@Route("/hello/index1", name="app_hello1",methods={"PUT"})

按照這種方式改下代碼:

 

    /**     * @Route("/hello/index", name="app_hello",methods={"GET","HEAD"})     */    public function index(){        $number = random_int(0, 100);        return new Response(            '<html><body>Hello number: '.$number.'</body></html>'        );    }    /**     * @Route("/hello/index1", name="app_hello1",methods={"PUT"})     */    public function index1(){        $number = random_int(0, 100);        return $this->render('hello/number.html.twig', [            'number' => $number,        ]);    }

 

這個時候再打開瀏覽器,/hello/index是可以訪問,hello/index1是訪問報錯,下圖錯誤:

 

定義路由參數

 路由添加請求訪問的參數,如:/blog/{page},代表可以請求URL:/blog/1,1自動會解析成page值,

 /blog/jinan,jinan就會自動會解析成page值,這裏沒有限定類型,所以page可以爲任意類型。

   /**     * @Route("/blog/{page}", name="blog_list")     */    public function list(int $page){        return $this->render('hello/number.html.twig', [            'number' => $page,        ]);    }

 

這個時候訪問/blog/1 ,/blog/jinan, 都是沒問題的。

如果想限定只能對page值設置爲整型整數,那麼可以對其加限制,

 requirements={"page"="\d+"}

這種就是用了正則表達式來進行限制,page變量值只能爲整數。

 

    /**     * @Route("/blog/{page}", name="blog_list", requirements={"page"="\d+"})     */    public function list(int $page){        return $this->render('hello/number.html.twig', [            'number' => $page,        ]);    }

 

這個時候訪問,訪問/blog/1是沒問題的,/blog/jinan ,就會報錯。

也可以對這種限定整型的寫法進一步簡化:

   /**     * @Route("/blog/{page<\d+>}", name="blog_list")     */

定義可選參數

  如果是實現客戶可以不輸入page參數,不輸入的話page參數值就爲1,輸入的話就必須爲整型:

 /**   *  @Route("/blog/{page<\d+>?1}", name="blog_list") */

修改後的代碼如下:

    /**     * @Route("/blog/{page<\d+>?1}" ,name="blog_list")     */    public function list(int $page=1){        return $this->render('hello/number.html.twig', [            'number' => $page,        ]);    }

這個時候再訪問,/blog , 和 /blog/33 ,都能正常訪問。

 

定義前綴註解

設置一個全局的前綴註解URL,在這個Controller上,設置註解:

 

/** * @Route("/laobanzhang",name="laobanzhang_") */class HelloController  extends AbstractController

 

這樣導致之前設置的所有路由URl,都加了前綴/laobanzhang,路由的名字也加了前綴 laobanzhang_

 

現在訪問路徑:

http://127.0.0.1:8000/laobanzhang/hello/index

可以看到這個是加完前綴之後的訪問URL。

 

關於路由的相關命令

 

php bin/console debug:router  

這個命令如果後面不跟任何東西,就會列出所有的路由;如果後跟一個路由的名字,那麼就只會列出這個路由的所有信息。

 

可以看到後面三行是我們自定義的路由名字,其它都是系統自帶。

 

 php bin/console debug:router laobanzhang_app_hello

這個命令就只會列出laobanzhang_app_hello的路由信息:

 

 

php bin/console router:match

這個命令是列出匹配給定的URL的路由信息,

比如:php bin/console router:match /laobanzhang/hello/index

 

 

以上主要是講述的關於註解的路由用法,yml文件用法類似。

其它的特性,比如國際化等等,可以參考官方文檔,這裏不再贅述。

總結

學習並理解路由的使用方法,理解註解和yaml的方法。

使用註解,可以在編寫php代碼的時候就可以順手編寫,不用再打開新文件

使用yaml,可以使用特性定義不同子類對某url使用相同的處理方法

 

 

文章持續更新,可以微信搜索公衆號「 程序員老班長 」查看更多文章。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章