这个教程是基于symfony5进行编写,以后再出高版本的symfony,那么就可以只出一套针对这个高版本的特性进行编写,该系列教程会一直延续更新。
点赞再看,养成习惯,微信搜索公众号【程序员老班长】关注这个互联网老班长,查看更多系列文章
目录
1,使用命令创建控制器:
2, 获取当前登录用户:app.user
3,生成URL
4,重定向
5,渲染模板
6,使用服务
7,返回异常和404错误
8,在控制器中获取请求对象。
9,管理session
10,提示信息
11 获取配置文件中的值
12,返回json对象
13,file方法
控制器是web请求过程中的核心,复杂响应前端请求和调度后端业务逻辑。
控制器起到一个承前控后的中枢能力,类似足球赛场的核心中场,前端页面模板就是前锋,用展示页面带给客户惊喜,后端的业务逻辑包括数据处理就是足球场上的后卫,负责向前运球和安全防卫数据层。
这里主要是列出在实际项目中关于控制器常用到的相关知识。
前面文章中提到了手动创建控制器文件,在这里介绍一下使用命令的方式创建控制器。
php bin/console make:controller BrandNewController
created: src/Controller/BrandNewController.php
created: templates/brandnew/index.html.twig
这个命令会生成控制器文件以及默认的模板文件,
同时会生成模板文件: /templates/brand_new/index.html.twig
也可以根据实体类进行生成增删改查,这个后面会介绍。
代码生成只是一个辅助工具,在初学的时候建议以自己手敲代码为主。
输出当前登录用户的用户名:
Username: {{ app.user.username ?? 'Anonymous user' }}
generateUrl,根据路由生成URL,可以传入参数
$url = $this->generateUrl('app_lucky_number', ['max' => 10]);
这个URL是根据路由名字和参数进行生成的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
use Symfony\Component\HttpFoundation\RedirectResponse; // ... public function index() { //重定向名字为homepage的路由 return $this->redirectToRoute('homepage'); // 实现永久重定向 return $this->redirectToRoute('homepage', [], 301); // 重定向路由,附加上这个路由需要的参数 return $this->redirectToRoute('app_lucky_number', ['max' => 10]); // 重定向路由,附加收到的请求的参数值 return $this->redirectToRoute('blog_show', $request->query->all()); // 重定向外部的URL return $this->redirect('http://symfony.com/doc'); } |
// 渲染模板文件 : /lucky/number.html.twig return $this->render('lucky/number.html.twig', ['number' => $number]);
在控制器中可以使用symfony的服务容器,进行依赖注入实例。
关于服务容器后续文章会介绍。
一般是使用构造函数进行注入,和在方法名称中定义变量
比如下面代码:
1 2 3 4 5 6 7 8 9 10 11 |
use Psr\Log\LoggerInterface; // ... /** * @Route("/lucky/number/{max}") */ public function number($max, LoggerInterface $logger) { $logger->info('We are logging!'); // ... } |
在业务处理代码中,在某特定的业务场景下需要返回异常或404错误,
特定的异常可以根据业务定制,定义的异常类代码例子如下:
throw new \Exception('Something went wrong!');
同理,关于404错误,可以返回: NotFoundHttpException。
在控制器的方法中,定义方法变量就行,这个变量会自动被控制器依赖注入。
1 2 3 4 5 6 7 8 |
use Symfony\Component\HttpFoundation\Request; public function index(Request $request, $firstName, $lastName) { $page = $request->query->get('page', 1); // ... } |
上面这个代码定义了$request这个变量,这个变量的赋值,是被容器控制的,无需关心,只需在这个方法中使用它就行。
同上面request对象,控制器用同样的方法管理session
1 2 3 4 5 6 7 8 9 10 11 12 13 |
use Symfony\Component\HttpFoundation\Session\SessionInterface; public function index(SessionInterface $session) { //session中 设置属性值 $session->set('foo', 'bar'); // session中 获取属性值 $foobar = $session->get('foobar'); // session中获取属性值,如果没有的话,后面的参数就是默认值 $filters = $session->get('filters', []); } |
有的业务在用户操作完成后,需要提示给用户一个信息,这个时候就是用addFlash方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
use Symfony\Component\HttpFoundation\Request; public function update(Request $request) { // ... if ($form->isSubmitted() && $form->isValid()) { // do some sort of processing $this->addFlash( 'notice', 'Your changes were saved!' ); // $this->addFlash() is equivalent to $request->getSession()->getFlashBag()->add() return $this->redirectToRoute(...); } return $this->render(...); } |
在项目的congfig目录下是存放了配置文件的,在控制器中有时候会需要获取这个配置文件的某个变量值的,这个时候就需要用getParameter方法。
1 2 3 4 5 6 |
// ... public function index() { $contentsDir = $this->getParameter('kernel.project_dir'); // ... } |
这个代码就是获取配置文件中的kernel.project_dir值。
至于是哪个配置文件,后面会在配置小节里面介绍。
在api中我们就需要返回一个json对象,这个时候就需要用到json方法。
1 2 3 4 5 6 7 8 9 |
// ... public function index() { // 返回 '{"username":"jane.doe"}' return $this->json(['username' => 'jane.doe']); } |
json方法会设置 Content-Type header的。
在实际项目中,这个json方法对于复杂的实体操作显得会力不从心,我们一般会选择用第三方的bundle实现这个功能。
根据官方介绍,这个方法是返回文件流,但是这个地方需要注意,它返回的文件流是对文件内容全部获取,如果这个文件太大的话,会导致内存崩溃。
解决方案是写一个循环,循环读取和返回,以大化小。
$file = new File('/path/to/some_file.pdf'); return $this->file($file);
上面就是在控制器中常用到的技术点。
文章持续更新,可以微信搜索公众号「 程序员老班长 」查看更多文章。