iT邦幫忙

2022 iThome 鐵人賽

DAY 15
0
Modern Web

跳脫MVC,Laravel + React 建立電商網站系列 第 15

Day 15 淺談 拉拉維爾(Laravel) - Blade

  • 分享至 

  • xImage
  •  

前面的篇幅都是著重在後端的處理,今天我想講一下 MVC的 V : view。
在使用單純的MVC來撰寫的時候,我們的前端就是view,在laravel之中稱為blade,既然都說blade這個是畫面了,那就是寫基本的html、css的地方。

使用blade 最直觀的好處就是:我們可以將後端的資料透過參數傳遞的方式,將資料傳遞給畫面。
這裡我舉個例子:我們要做一個電商的網站,然而這個網站一定會有關於商品的商品介紹頁面;每個商品介紹頁面一定會有不同的地方(商品名稱、圖片、敘述、價格....等),假設我們要上架十萬個商品,如果要讓工程師複製10萬個"類似"的畫面,而只有少數資料長的不一樣,那這樣會非常沒有效率且很慢。
因此解套的作法就是刻一個通用的畫面,並將不同的情況透過參數傳遞到畫面上。

Blade雖然是畫面模板,但它本質上還是php檔案,Laravel會將blade編譯成PHP,Blade通常會被放在resources/views 底下。


基礎寫法

blade通常會在route的相關檔案或Controller之中return
這裡舉官網的範例:

Route::get('/', function () { 
    return view('greeting', ['name' => 'Finn']); 
});

我們可以看到 在router註冊的地方直接return 一個view(blade),第一個參數是blade的檔案名稱,後面帶一個陣列,陣列的key 是傳遞出去的參數名稱,陣列的value是對應的值。

然後在blade之中要使用的時候,直接用兩個大括號包起來
{{ $name }} 這樣即可。

備註:Blade 的 {{ }} echo 語句通過 PHP 的htmlspecialchars函數自動發送,以防止 XSS 攻擊。

然而,有時候我們丟到畫面上的字串其實是個html字串,
例如:return view('greeting', ['name' => '<span style="color: red">Finn</span>']);

在這個情況下,我們在blade之中就不能被丟到htmlspecialchars進行轉譯
因此 blade要改用 {!! $name !!} 的方式來顯示。

過去我們進行jsx的時候知道,如果在檔案中使用{}代表我們要使用JavaScript,如果我們在blade之中使用JavaScript框架,這時候就會跟blade衝突,因此會用@{{ name }}的方式來解決這個問題。


接下來介紹更多基本的blade專用語法

因為語法其實很多,我這裡挑幾個常用的進行主要的介紹。

if...elseif...else

我們有時會會有一些狀況,不同的使用者要呈現不同的畫面,例如:我們的電商網站有針對不同會員顯示不同價格,然而我們希望丟到blade的資料就是所有價格資料,由blade來判斷哪個會員等級要顯示哪種價格。
當這種需求發生的時候就可以使用blade的if...else
用法也很簡單:

@if( $user === 'normal' ) //這裡括號內可以直接寫php,就不用再兩個大括號
    <p>普通會員</p>
@elseif( $user === 'vip')
    <p>VIP會員</p>
@else
    <p>啥都不是</p>
@endif

其他常用的相關還有:@empty、@isset
這兩個都有對應基本的PHP語法:empty() 、isset()
@unless個人比較少用,有興趣的同學可以到官方文件看看。

身分驗證

另外比較特別的是身分驗證的指令,對於身分比較敏感的地方,例如:管理後臺,通常會在後端 middleWare的地方就做好身分驗證,然而還是有些狀況要針對是否登陸來做出不同的顯示,例如:如果已登入 要顯示登出按鈕,如果沒登入要顯示登入按鈕。
在這種情況下我們就可以使用blade提供的指令來進行驗證:

@auth 
    // The user is authenticated... 
@endauth 
@guest 
    // The user is not authenticated... 
@endguest

foreach迴圈

我個人超愛foreach迴圈,因為它可以直接遍歷Array
我這裡再假設一個情境:今天我們需要在畫面上顯示「1000元以下商品」,在後端操作model撈出來資料,肯定是一大包,我們也肯定是直接把這一大包丟到前端。
這時候blade拿到了一大包資料,要怎麼有序地顯示在畫面上?
這時候我們就需要使用到foreach。

@foreach($products as $key => $value)
    <p>{{ $value }}</p>
@endforeach

在blade 之中的寫法跟在php裡面寫差不多,那為什麼要特別抓出來講?
因為有個很好用的東西叫做$loop$loop 是當我們用foreach的時候,laravel偷偷幫我們建立出來的,$loop 本身也有一些function來讓我們使用。

我們在開發的路上多少都會遇到類似這樣的需求:我的table 想要奇數row白色,偶數row灰色的。
如果我們今天用最原生地css要怎麼做到這個需求?我想多半如果要使用原生的開發者會使用
nth-child這個偽類別選擇器來達到需求。
但我們的資料是用foreach出來的話(通常都是XD)就可以使用 $loop 來達到需求。
這裡的假設是屬於寫純前端也可以輕鬆做到,但如果今天的需求是:第一個row要加冠軍符號、第二位要加亞軍符號、只顯示前八名,但最後要顯示還有多少人。
這時候沒有$loop就會寫得很痛苦了。
詳細關於$loop參考這裡

因為我們後面的專案會採用React來搭配,所以blade我們用到的機會就會比較少。
今天就到這邊吧!到現在對於基本的Laravel操作有最基礎的認識了。
我們明天開始正式進入到時做環節。
其他更多相關使用參考官網


鐵人賽不知不覺已經過一半了,我們明天見啦!


上一篇
Day 14 淺談 拉拉維爾(Laravel) - Eloquent ORM
下一篇
Day 16 Laravel + React 實作之路 -1(環境架設)
系列文
跳脫MVC,Laravel + React 建立電商網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言