Symfony5系列教程4-創建控制器

這個教程是基於symfony5進行編寫,以後再出高版本的symfony,那麼就可以只出一套針對這個高版本的特性進行編寫,該系列教程會一直延續更新。

點贊再看,養成習慣,微信搜索公衆號【程序員老班長】關注這個互聯網老班長,查看更多系列文章

目錄

1,使用命令創建控制器:

2,  獲取當前登錄用戶:app.user

3,生成URL

4,重定向

5,渲染模板

6,使用服務

7,返回異常和404錯誤

8,在控制器中獲取請求對象。

9,管理session

10,提示信息

11 獲取配置文件中的值

12,返回json對象

13,file方法


控制器是web請求過程中的核心,複雜響應前端請求和調度後端業務邏輯。

控制器起到一個承前控後的中樞能力,類似足球賽場的核心中場,前端頁面模板就是前鋒,用展示頁面帶給客戶驚喜,後端的業務邏輯包括數據處理就是足球場上的後衛,負責向前運球和安全防衛數據層。

這裏主要是列出在實際項目中關於控制器常用到的相關知識。

1,使用命令創建控制器:

前面文章中提到了手動創建控制器文件,在這裏介紹一下使用命令的方式創建控制器。

 php bin/console make:controller BrandNewControllercreated: src/Controller/BrandNewController.phpcreated: 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);

上面就是在控制器中常用到的技術點。

文章持續更新,可以微信搜索公衆號「 程序員老班長 」查看更多文章。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章