這個教程是基於symfony5進行編寫,以後再出高版本的symfony,那麼就可以只出一套針對這個高版本的特性進行編寫,該系列教程會一直延續更新。
點贊再看,養成習慣,微信搜索公衆號【程序員老班長】關注這個互聯網老班長,查看更多系列文章
目錄
控制器是web請求過程中的核心,複雜響應前端請求和調度後端業務邏輯。
控制器起到一個承前控後的中樞能力,類似足球賽場的核心中場,前端頁面模板就是前鋒,用展示頁面帶給客戶驚喜,後端的業務邏輯包括數據處理就是足球場上的後衛,負責向前運球和安全防衛數據層。
這裏主要是列出在實際項目中關於控制器常用到的相關知識。
1,使用命令創建控制器:
前面文章中提到了手動創建控制器文件,在這裏介紹一下使用命令的方式創建控制器。
php bin/console make:controller BrandNewController
created: src/Controller/BrandNewController.php
created: templates/brandnew/index.html.twig
這個命令會生成控制器文件以及默認的模板文件,
同時會生成模板文件: /templates/brand_new/index.html.twig
也可以根據實體類進行生成增刪改查,這個後面會介紹。
代碼生成只是一個輔助工具,在初學的時候建議以自己手敲代碼爲主。
2, 獲取當前登錄用戶:app.user
輸出當前登錄用戶的用戶名:
<p>Username: {{ app.user.username ?? 'Anonymous user' }}</p>
3,生成URL
generateUrl,根據路由生成URL,可以傳入參數
$url = $this->generateUrl('app_lucky_number', ['max' => 10]);
這個URL是根據路由名字和參數進行生成的
4,重定向
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'); } |
5,渲染模板
// 渲染模板文件 : /lucky/number.html.twig return $this->render('lucky/number.html.twig', ['number' => $number]);
6,使用服務
在控制器中可以使用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!'); // ... } |
7,返回異常和404錯誤
在業務處理代碼中,在某特定的業務場景下需要返回異常或404錯誤,
特定的異常可以根據業務定製,定義的異常類代碼例子如下:
throw new \Exception('Something went wrong!');
同理,關於404錯誤,可以返回: NotFoundHttpException。
8,在控制器中獲取請求對象。
在控制器的方法中,定義方法變量就行,這個變量會自動被控制器依賴注入。
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這個變量,這個變量的賦值,是被容器控制的,無需關心,只需在這個方法中使用它就行。
9,管理session
同上面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', []); } |
10,提示信息
有的業務在用戶操作完成後,需要提示給用戶一個信息,這個時候就是用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(...); } |
11 獲取配置文件中的值
在項目的congfig目錄下是存放了配置文件的,在控制器中有時候會需要獲取這個配置文件的某個變量值的,這個時候就需要用getParameter方法。
1 2 3 4 5 6 |
// ... public function index() { $contentsDir = $this->getParameter('kernel.project_dir'); // ... } |
這個代碼就是獲取配置文件中的kernel.project_dir值。
至於是哪個配置文件,後面會在配置小節裏面介紹。
12,返回json對象
在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實現這個功能。
13,file方法
根據官方介紹,這個方法是返回文件流,但是這個地方需要注意,它返回的文件流是對文件內容全部獲取,如果這個文件太大的話,會導致內存崩潰。
解決方案是寫一個循環,循環讀取和返回,以大化小。
$file = new File('/path/to/some_file.pdf'); return $this->file($file);
上面就是在控制器中常用到的技術點。
文章持續更新,可以微信搜索公衆號「 程序員老班長 」查看更多文章。