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使用相同的处理方法

文章持续更新,可以微信搜索公众号「 程序员老班长 」查看更多文章。

猜你喜欢

转载自blog.csdn.net/liliangzhao/article/details/106169275