這個教程是基於symfony5進行編寫,以後再出高版本的symfony,那麼就可以只出一套針對這個高版本的特性進行編寫,該系列教程會一直延續更新。
點贊再看,養成習慣,微信搜索公衆號【程序員老班長】關注這個互聯網老班長,查看更多系列文章
本節主要講解,路由,尤其是註解這種路由方式的使用。
目錄
添加註解路由
1,打開config/routes.yaml,把裏面的內容都刪掉
2,打開上一節中新建的 HelloController,修改後的代碼如下:
<?php
namespace 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使用相同的處理方法
文章持續更新,可以微信搜索公衆號「 程序員老班長 」查看更多文章。