这个教程是基于symfony5进行编写,以后再出高版本的symfony,那么就可以只出一套针对这个高版本的特性进行编写,该系列教程会一直延续更新。
点赞再看,养成习惯,微信搜索公众号【程序员老班长】关注这个互联网老班长,查看更多系列文章
本节主要讲解,路由,尤其是注解这种路由方式的使用。
目录
添加注解路由
匹配HTTP方法
定义路由参数
定义可选参数
定义前缀注解
关于路由的相关命令
总结
1,打开config/routes.yaml,把里面的内容都删掉
2,打开上一节中新建的 HelloController,修改后的代码如下:
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(
'Hello number: '.$number.''
);
}
/**
* @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方法的,比如: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(
'Hello number: '.$number.''
);
}
/**
* @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使用相同的处理方法
文章持续更新,可以微信搜索公众号「 程序员老班长 」查看更多文章。