laravel5.5學(xué)習(xí)筆記

前言

Composer安裝

這里不做贅述

laravel LTS ( LTS 表示長期支持維護(hù))速查表

laravel 基于composer 的搭建

服務(wù)器要求

PHP >= 7.0.0
PHP OpenSSL 擴(kuò)展
PHP PDO 擴(kuò)展
PHP Mbstring 擴(kuò)展
PHP Tokenizer 擴(kuò)展
PHP XML 擴(kuò)展

安裝 Laravel

  • 通過 Laravel 安裝器 安裝

      參考: https://laravelacademy.org/post/7620.html
    
  • 通過 Composer Create-Project 安裝

      執(zhí)行: composer create-project --prefer-dist laravel/laravel blog [5.5.*] 
      【5.5.* 表示的是安裝的laravel的版本,不寫表示安裝最新版本的laravel】
      注意: 通過 composer 安裝的 laravel項(xiàng)目,在刪除文件后,建議使用composer dump-autoload 或者composer dumpautoload 或者 composer dump 進(jìn)行更新下  
    

配置 Laravel

待更新。。。


學(xué)習(xí)并熟練運(yùn)用laravel5.5的必備能力

必須 熟記 Laravel 5.5 官方文檔,查閱時(shí)能快速定位,5 遍以上;
必須 熟記 Laravel 5.5 API 文檔 的類結(jié)構(gòu),查閱時(shí)能快速定位;
必須 熟記所有 PSR 通過的標(biāo)準(zhǔn);
PSR 目前還未通過的標(biāo)準(zhǔn),也要 應(yīng)該 知曉 http://www.php-fig.org/psr/#draft
應(yīng)該 熟悉 PHP 最佳實(shí)踐
應(yīng)該 了解 『Rails 信條』

一、laravel主要特色:

1、簡潔而清晰地路由定義方式
2、強(qiáng)大的IoC容器
3、合理的框架結(jié)構(gòu)
4、豐富的第三方庫


二、學(xué)習(xí)laravel前的準(zhǔn)備

1、仔細(xì)閱讀laravel開發(fā)文檔,地址:https://laravelacademy.org/laravel-docs-5_5
2、需要扎實(shí)的PHP基礎(chǔ)
3、具備oop面向?qū)ο蟮乃枷?4、熟練使用composer依賴管理
5、熟悉PHP版本新特性【PHP版本7.0以上】
6、熟悉PSR規(guī)范


三、laravel的文件目錄結(jié)構(gòu)及描述

為了快速上手laravel框架,首要先了解它的目錄結(jié)構(gòu)。

應(yīng)用根目錄
    App目錄: 包含了應(yīng)用的核心代碼,你為應(yīng)用編寫的代碼絕大多數(shù)也會(huì)放到這里,后面詳細(xì)介紹子目錄;
    
    Bootstrap目錄:用于框架的啟動(dòng)和自動(dòng)載入配置,初學(xué)者暫不需了解;
    
    Config目錄:包含了應(yīng)用所有的配置文件,建議通讀一遍這些配置文件以便熟悉 Laravel 所有默認(rèn)配置項(xiàng);
    
    Database目錄:數(shù)據(jù)庫遷移 與數(shù)據(jù)填充文件;
    
    Public目錄:WEB 部署目錄(對(duì)外訪問目錄,也稱項(xiàng)目入口目錄),里面還包含靜態(tài)資源文件;
    
    Resources目錄:包含了視圖的原始資源文件視圖;
    
    Routes目錄:路由文件,包含應(yīng)用定義的所有路由文件;默認(rèn)提供了四個(gè)路由文件用于給不同的入口使用:web.php、api.php、 console.php 和 channels.php。
        
    Storage目錄:編譯后的模板文件 和其他緩存文件;
    
    Tests目錄:自動(dòng)化測試目錄;
    
    Vendor目錄:包含了應(yīng)用所有通過 Composer 加載的依賴。

App目錄:
    Console目錄:包含應(yīng)用所有自定義的 Artisan 命令;

    Events目錄:該目錄默認(rèn)不存在,該目錄用于存放事件類;

    Exceptions目錄:目錄包含應(yīng)用的異常處理器,同時(shí)還是處理應(yīng)用拋出的任何異常的好地方;
    
    Http目錄:目錄包含了控制器、中間件以及表單請(qǐng)求等,幾乎所有通過 Web 進(jìn)入應(yīng)用的請(qǐng)求處理都在這里進(jìn)行;
    
    Jobs目錄:該目錄默認(rèn)不存在,目錄用于存放隊(duì)列任務(wù);
    
    Listeners目錄:這個(gè)目錄默認(rèn)不存在,目錄包含處理事件的類(事件監(jiān)聽器);
    
    Mail目錄:這個(gè)目錄默認(rèn)不存在, 目錄包含應(yīng)用所有郵件相關(guān)類;

    Notifications目錄:這個(gè)目錄默認(rèn)不存在,目錄包含應(yīng)用發(fā)送的所有通知;

    Policies目錄:這個(gè)目錄默認(rèn)不存在,目錄包含了應(yīng)用所有的授權(quán)策略類;
    
    Providers目錄:目錄包含應(yīng)用的所有服務(wù)提供者;
    
    Rules目錄:該目錄默認(rèn)不存在,目錄包含應(yīng)用的自定義驗(yàn)證規(guī)則對(duì)象;


四、路由

※ 重要知識(shí)點(diǎn)

路由的作用: 把各種請(qǐng)求分流到各個(gè)控制器,換句話說,我們需要注冊(cè)路由來響應(yīng)任何http請(qǐng)求動(dòng)作。
對(duì)于分析一個(gè)Web框架,其中最重要的一環(huán)就是對(duì)這個(gè)Web框架的路由進(jìn)行分析。如果你玩不懂它的路由機(jī)制,那你也就不可能玩通整個(gè)Web框架。可見路由機(jī)制在整個(gè)Web框架中的地位和重要性。

建議性規(guī)范

1. 絕不 在路由配置文件里書寫『閉包路由』或者其他業(yè)務(wù)邏輯代碼,因?yàn)橐坏┦褂脤o法使用 路由緩存 。
 

2. 路由器要保持干凈整潔,絕不 放置除路由配置以外的其他程序邏輯。

3. 必須 優(yōu)先使用 Restful 路由,配合資源控制器使用。
    超出 Restful 路由的,應(yīng)該 模仿上圖的方式來定義路由。

4. 使用 resource 方法時(shí),如果僅使用到部分路由,必須 使用 only 列出所有可用路由。
    絕不 使用 except,因?yàn)?only 相當(dāng)于白名單,相對(duì)于 except 更加直觀。路由使用白名單有利于養(yǎng)成『安全習(xí)慣』。

5. 除了 resource 資源路由以外,其他所有路由都 必須 使用 name 方法進(jìn)行命名。
    必須 使用『資源前綴』作為命名規(guī)范,如下的 users.follow,資源前綴的值是 users.

4.1 路由的基本使用

在laravel5.5中,路由文件的路徑是:/app/routes,其中包含四種route文件,分別對(duì)應(yīng)不同的情況

api.php 【一般接口開發(fā)會(huì)用到該路由,在 api.php 定義的路由被分配到了 api 中間件組,該中間件組下的路由主要用于第三方 API 請(qǐng)求,無需進(jìn)行 CSRF 檢查】

web.php 【一般web開發(fā)會(huì)用到該路由,在web.php定義的路由被分配到了 web 中間件組,從而可以使用 session 和 csrf 保護(hù)等功能】

console.php

channels.php



下面將講述到在實(shí)際項(xiàng)目開發(fā)中,常用的路由及寫法

get:

// 閉包路由
Route::get('/', function(){
    return 'Hello World';
});

// 路由帶參數(shù) 【{id}:必填參數(shù), {name?}: 非必填參數(shù)】
Route::get('user/{id}/{name?}', function($id,$name='lucy'){
    return 'User '.$id;
});

// 正則約束
Route::get('user/{name}', function ($name) {
    // name 必須是字母且不能為空
})->where('name', '[A-Za-z]+');

Route::get('user/{id}/{name}', function ($id, $name) {
    // 同時(shí)指定 id 和 name 的數(shù)據(jù)格式
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

post:

// 閉包路由
Route::post('posts', function(){
    return 'Hello World';
});

match:

// 
Route::match(['get', 'post'], 'foo', function () {
    return 'This is a request from get or post';
});

any:

Route::any('bar', function () {
    return 'This is a request from any HTTP verb';
});

路由重定向:

Route::redirect('/here', '/there', 301);

路由視圖:

Route::view('/welcome', 'welcome');
Route::view('/welcome', 'welcome', ['name' => '學(xué)院君']);

<p style="text-indent:2em">這里不過多闡述,而且上述講述的都可在laravel中文文檔上搜索的到,且文檔中提及了很多的其他路由系列(如命名路由,路由分組,路由前綴,路由模型綁定等),且路由的參數(shù)這塊還有一些約束,不僅限制于當(dāng)前路由,還可以全局約束。路由的注冊(cè),一般情況下,跟中間件綁定使用的情景很多,關(guān)于中間件,參考第5節(jié)。</p>

※ 關(guān)于路由這塊,建議掌握命名路由、路由分組、資源路由。

4.2 項(xiàng)目開發(fā)中的實(shí)用路由

  • 路由閉包:

      絕不在路由配置文件里書寫『閉包路由』或者其他業(yè)務(wù)邏輯代碼,因?yàn)橐坏┦褂脤o法使用 路由緩存 。
      路由器要保持干凈整潔,絕不 放置除路由配置以外的其他程序邏輯。
    
  • Restful 路由:

      必須 優(yōu)先使用 Restful 路由,配合資源控制器使用
    

    [圖片上傳失敗...(image-f519cb-1652941229691)]

    資源路由(resource)

    1. 一般資源路由定義:

       // 資源路由路由 URI 必須 使用復(fù)數(shù)形式
       Route::resource('photos', 'PhotosController');
      

      等于以下路由定義:

       Route::get('/photos', 'PhotosController@index')->name('photos.index');
       Route::get('/photos/create', 'PhotosController@create')->name('photos.create');
       Route::post('/photos', 'PhotosController@store')->name('photos.store');
       Route::get('/photos/{photo}', 'PhotosController@show')->name('photos.show');
       Route::get('/photos/{photo}/edit', 'PhotosController@edit')->name('photos.edit');
       Route::put('/photos/{photo}', 'PhotosController@update')->name('photos.update');
       Route::delete('/photos/{photo}', 'PhotosController@destroy')->name('photos.destroy');
      
    2. 使用 resource 方法時(shí),如果僅使用到部分路由,必須 使用 only 列出所有可用路由:

       Route::resource('photos', 'PhotosController', ['only' => ['index', 'show']]);
       【絕不 使用 except,因?yàn)?only 相當(dāng)于白名單,相對(duì)于 except 更加直觀。路由使用白名單有利于養(yǎng)成『安全習(xí)慣』?!?


五、中間件

※ 重要知識(shí)點(diǎn)

<p style="text-indent:2em">對(duì)于一個(gè)Web應(yīng)用來說,在一個(gè)請(qǐng)求真正處理前,我們可能會(huì)對(duì)請(qǐng)求做各種各樣的判斷,然后才可以讓它繼續(xù)傳遞到更深層次中。而如果我們用if else這樣子來,一旦需要判斷的條件越來越來,會(huì)使得代碼更加難以維護(hù),系統(tǒng)間的耦合會(huì)增加,而中間件就可以解決這個(gè)問題。我們可以把這些判斷獨(dú)立出來做成中間件,可以很方便的過濾http請(qǐng)求。</p>

5.1 定義中間件

php artisan make:middleware 中間件名稱
【定義(創(chuàng)建中間件,并不會(huì)被使用,需要在 app/Http/Kernel.php 中注冊(cè)中間件,才能被使用)】

5.2 三種中間件

注冊(cè)中間件有三種:

  • $middleware屬性:

      全局中間件,要對(duì)所有的請(qǐng)求要做一些處理的時(shí)候,就適合定義在該屬性內(nèi)。(比如統(tǒng)計(jì)請(qǐng)求次數(shù)這些)
    
  • $routeMiddleware屬性:

      路由中間件,有些個(gè)別的請(qǐng)求,我們需要執(zhí)行特別的中間件時(shí),就適合定義在這屬性里面。
    
  • $middlewareGroups屬性:

      中間件組,比如我們項(xiàng)目有api請(qǐng)求和web的請(qǐng)求的時(shí)候,就要把兩種類型的請(qǐng)求中間件分離開來,這時(shí)候就需要我們中間件組啦。
    

5.3 中間件的使用場景

1. laravel 自身的中間件(例如身份驗(yàn)證、csrf保護(hù)等)
2. 操作權(quán)限驗(yàn)證


六、CSRF保護(hù)

6.1 定義:

<p style="text-indent:2em">Laravel 可以輕松地保護(hù)應(yīng)用程序免受 跨站請(qǐng)求偽造 (CSRF) 的攻擊??缯菊?qǐng)求偽造是一種惡意的攻擊,它憑借已通過身份驗(yàn)證的用戶身份來運(yùn)行未經(jīng)過授權(quán)的命令。</p>
<p style="text-indent:2em">Laravel 會(huì)自動(dòng)為每個(gè)活躍用戶的會(huì)話生成一個(gè) CSRF「令牌」。該令牌用于驗(yàn)證經(jīng)過身份驗(yàn)證的用戶是否是向應(yīng)用程序發(fā)出請(qǐng)求的用戶。</p>

<p style="text-indent:2em">任何情況下當(dāng)你在應(yīng)用程序中定義 HTML 表單時(shí),都應(yīng)該在表單中包含一個(gè)隱藏的 CSRF 令牌字段,以便 CSRF 保護(hù)中間件可以驗(yàn)證該請(qǐng)求</p>

※ 關(guān)于CSRF保護(hù),詳情參考laravel中文文檔


七、控制器

建議性規(guī)范

1. 必須 保持控制器文件代碼行數(shù)最小化,還有可讀性。

2. 不應(yīng)該 為「方法」書寫注釋,這要求方法取名要足夠合理,不需要過多注釋。  

3. 應(yīng)該 為一些復(fù)雜的邏輯代碼塊書寫注釋,主要介紹產(chǎn)品邏輯 - 為什么要這么做。

4. 不應(yīng)該 在控制器中書寫「私有方法」,控制器里 應(yīng)該 只存放「路由動(dòng)作方法」。

5. 絕不 遺留「死方法」,就是沒有用到的方法,控制器里的所有方法,都應(yīng)該被使用到,否則應(yīng)該刪除。

6. 絕不 在控制器里批量注釋掉代碼,無用的邏輯代碼就必須清除掉。

7.1 創(chuàng)建控制器

目錄路徑: 在 app/Http/Controllers/ 路徑下

創(chuàng)建命令: php artisan make:controller [模塊名/]控制器名 [--resource]

7.2 控制器與路由

在實(shí)際的項(xiàng)目開發(fā)中,一般不會(huì)有路由閉包的,基本上都是控制器與路由相互綁定的。
通俗的說,路由是請(qǐng)求的鏈接地址指向的就是控制器里面的方法。


八、請(qǐng)求

8.1

8.2 常用請(qǐng)求的方法

獲取請(qǐng)求路徑

$request->path(): 返回請(qǐng)求的路徑信息

獲取請(qǐng)求的 URL

$request->url(): 返回不帶有查詢字符串的 URL (string)
$request->fullUrl(): 返回值帶有查詢字符串的 URL

獲取請(qǐng)求方法

$request->method(): 返回請(qǐng)求的方法,eg. GET,POST  (string)

驗(yàn)證 HTTP 的請(qǐng)求方式

$request->isMethod('post'): 返回 true , false (boolean)

獲取所有輸入數(shù)據(jù)

$request->all(): 返回所有的輸入數(shù)據(jù) (array)
$request->input(): 返回所有的輸入數(shù)據(jù) (array)

獲取指定輸入值

$request->input(參數(shù)1【 ,參數(shù)2】) : 返回值,如果參數(shù)1 的值存在,則返回參數(shù)1的值,如果參數(shù)1 的值不存在,將參數(shù)2 作為參數(shù)1 的返回值返回。

獲取 GET 請(qǐng)求的輸入值

$request->query(): 返回 GET 請(qǐng)求查詢字符串的輸入數(shù)據(jù) (array)

獲取 POST 請(qǐng)求的輸入值

$request->post(): 返回 POST 請(qǐng)求的輸入數(shù)據(jù) (array)

獲取部分輸入數(shù)據(jù)

$request->only(參數(shù));參數(shù)為一維數(shù)組,返回值為所有你指定的鍵值對(duì)(array)
$request->except(參數(shù));參數(shù)為一維數(shù)組,返回值為所有非你指定的鍵值對(duì)(array)

判斷是否存在輸入值

$request->has(參數(shù)): 返回 true , false (boolean)

判斷是否存在值并且不為空

$request->filled(參數(shù)): 返回 true , false (boolean)

<p style="color:red">疑問點(diǎn):input() 方法跟all() 方法,暫時(shí)不清楚,如何獲取所有輸入?yún)?shù)的范圍(官網(wǎng)文檔說的是 query + request)</p>


九、HTTP 會(huì)話機(jī)制

9.1 cookie會(huì)話機(jī)制

9.2 session會(huì)話機(jī)制

  • 應(yīng)用:

      由于 HTTP 協(xié)議本身是無狀態(tài)的,上一個(gè)請(qǐng)求與下一個(gè)請(qǐng)求無任何關(guān)聯(lián),為此我們引入 Session 來存儲(chǔ)用戶請(qǐng)求信息以解決特定場景下無狀態(tài)導(dǎo)致的問題(比如登錄、購物)。
    
  • 配置:

      文件路徑位置: config/session.php
    

    <p style="text-indent:2em">默認(rèn)情況下,Laravel 使用的 Session 驅(qū)動(dòng)為 file 驅(qū)動(dòng),這對(duì)許多應(yīng)用而言是沒有什么問題的。在生產(chǎn)環(huán)境中,你可能考慮使用 memcached 或者 redis 驅(qū)動(dòng)以便獲取更佳的 Session 性能,尤其是線上同一個(gè)應(yīng)用部署到多臺(tái)機(jī)器的時(shí)候,這是最佳實(shí)踐。</p>

  • 使用:

    session的數(shù)據(jù)處理方式:

      ①、全局的輔助函數(shù) session
      ②、Request 實(shí)例(啟動(dòng)過程中會(huì)將 Session 數(shù)據(jù)設(shè)置到請(qǐng)求實(shí)例的 session 屬性中)
    

    設(shè)置 session 值:

      // 全局輔助函數(shù)
          # 新存/修改
          session(['key' => 'value']);
          # 指定一個(gè)默認(rèn)值...
          session('key', 'default');
      // Request 實(shí)例
          #新存數(shù)據(jù)
          $request->session()->put('key', 'value')
          # 在原有的session數(shù)組中,新加(追加)數(shù)據(jù)
          $request->session()->push('key.arguments', 'developers');
      // 閃存數(shù)據(jù)
          #有時(shí)候你僅想在下一個(gè)請(qǐng)求之前在 Session 中存入數(shù)據(jù),你可以使用 flash 方法。使用這個(gè)方法保存在 session 中的數(shù)據(jù),只會(huì)保留到下個(gè) HTTP 請(qǐng)求到來之前,然后就會(huì)被刪除。
          $request->session()->flash('key', 'value');
    

    獲取 session 值:

      // 全局輔助函數(shù)
          session('key');
      // Request 實(shí)例
          # 獲取所有
          $request->session()->all();
          # 獲取指定 key 值的數(shù)據(jù),【參數(shù)二: 如果不存在,默認(rèn)值】
          $request->session()->get('key'[,'value']);
          # 獲取并刪除(session)數(shù)據(jù),【參數(shù)二: 如果不存在,默認(rèn)值】
          $value = $request->session()->pull('key'[, 'default']);
    

    判斷 session 中是否存在某個(gè)值

      $request->session()->has('key'): 返回 true(值存在且不為 null), false (boolean)
      $request->session()->exists('key'): 返回 true(值存在), false (boolean)
    

    刪除 session 值

      // 刪除指定的 session 數(shù)據(jù)
      $request->session()->forget('key');
      // 刪除所有 session 數(shù)據(jù)
      $request->session()->flush();       
    
  • 注釋:

    $_SESSION 無法獲取 session 值:

    <p style="text-indent:2em">Laravel 并沒有使用 PHP 內(nèi)置的 Session 功能,而且自己實(shí)現(xiàn)了一套更加靈活更加強(qiáng)大的 Session 機(jī)制,核心邏輯請(qǐng)參考 Illuminate\Session\Middleware\StartSession 這個(gè)中間件。</p>

    Laravel 的控制器構(gòu)造函數(shù)中無法獲取應(yīng)用 Session 數(shù)據(jù):

    <p style="text-indent:2em">因?yàn)?Laravel 的 Session 通過 StartSession 中間件啟動(dòng),既然是中間件就會(huì)在服務(wù)容器注冊(cè)所有服務(wù)之后執(zhí)行,而控制器們的構(gòu)造函數(shù)都是在容器注冊(cè)服務(wù)的時(shí)候執(zhí)行的,所以這個(gè)時(shí)候 Session 尚未啟動(dòng),所有無法獲取數(shù)據(jù)。</p>
    <p style="text-indent:2em;color:blue">解決辦法是將獲取 Session 數(shù)據(jù)邏輯后置或者在構(gòu)造函數(shù)中引入在 StartSession 之后執(zhí)行的中間件。</p>


十、表單驗(yàn)證機(jī)制

※ 建議性規(guī)范

1.  必須 使用 表單請(qǐng)求 - FormRequest 類 來處理控制器里的表單驗(yàn)證。

2.  絕不 使用 authorize() 方法來做用戶授權(quán),用戶授權(quán)我們會(huì)單獨(dú)使用 Policy 授權(quán)策略 來實(shí)現(xiàn)。

3.  所有 FormRequest 表驗(yàn)證類 必須 繼承 app/Http/Requests/Request.php 基類

4.  FormRequest 表驗(yàn)證類 必須 遵循 資源路由 方式進(jìn)行命名
        eg. photos 對(duì)應(yīng) app/Http/Requests/PhotoRequest.php 。


十一、視圖

建議性規(guī)范

1. 視圖文件 必須 優(yōu)先考慮使用 .blade.php 后綴來指定使用 Blade 模板引擎。

2. 保持目錄清晰
    layouts - 頁面布局文件 必須 放置于此目錄下;
    common - 存放頁面通用元素;
    pages - 簡單的頁面存放文件夾,如:about、contact 等;
    resources - 對(duì)應(yīng) Restful 路由的資源路徑名稱,以 URI photos/create 為例,對(duì)應(yīng) create.blade.php 文件,存放在文件夾 photos 下。

3. 必須 避免在 resources/views 目錄下直接放置視圖文件。

4. 局部視圖
    局部視圖文件 必須 使用 _ 前綴來命名,如:photos/_upload_form.blade.php

5. 視圖命名要釋義
    為了和 Restful 路由器和資源控制器保持一致,視圖命名也 必須 使用資源視圖的命名方式

6. create_and_edit 視圖
    很多情況下,創(chuàng)建和編輯視圖里的頁面結(jié)構(gòu)接近相似,在這種情況下,應(yīng)該 使用 create_and_edit 視圖

<p style="text-indent:2em">Blade 是 Laravel 提供的一個(gè)簡單而又強(qiáng)大的模板引擎。和其他流行的 PHP 模板引擎不同,Blade 并不限制你在視圖中使用原生 PHP 代碼。所有 Blade 視圖文件都將被編譯成原生的 PHP 代碼并緩存起來,除非它被修改,否則不會(huì)重新編譯,這就意味著 Blade 基本上不會(huì)給你的應(yīng)用增加任何負(fù)擔(dān)。Blade 視圖文件使用 .blade.php 作為文件擴(kuò)展名,被存放在 resources/views 目錄。</p>

11.1 Blade模板

主要優(yōu)點(diǎn)

模板繼承 和 區(qū)塊 。

主布局

定義一個(gè)主體的主布局,文件路徑: resources/views/layouts/main.blade.php 【文件只是舉例】

<html>
    <head>
        <title>應(yīng)用程序名稱 - @yield('title')</title>
    </head>
    <body>
        @section('sidebar')
            這是主布局的側(cè)邊欄。
        @show

        <div class="container">
            @yield('content')
        </div>
    </body>
</html>

# 在主視圖中的需要知道的命令
@section: 定義了視圖的一部分內(nèi)容。
@yield: 用來顯示指定部分的內(nèi)容。
@show: 定義并立即生成該區(qū)塊。

繼承布局

當(dāng)定義子視圖時(shí),你可以使用 Blade 提供的 @extends 命令來為子視圖指定應(yīng)該 「繼承」 的布局。文件路徑: resources/views/layouts/child.blade.php 【文件只是舉例】

@extends('layouts.app')

@section('title', 'Page Title')

@section('sidebar')
    @parent

    <p>這將追加到主布局的側(cè)邊欄。</p>
@endsection

@section('content')
    <p>這是主體內(nèi)容。</p>
@endsection

# 在子視圖中的需要知道的命令
@extends: 為子視圖指定想要 「繼承」 的布局。
@section的兩種命令解析:
    ①、將內(nèi)容注入于主布局的 @section 中。
    ②、「主」布局中使用 @yield 的地方會(huì)顯示這些子視圖中的 @section 間的內(nèi)容,展示方式有兩種:
        【1. @section('title', 'Page Title')】
        【2. @section('content')
                <p>這是主體內(nèi)容。</p>
            @endsection
        】
@parent: 追加內(nèi)容【在原來的主布局中,追加內(nèi)容】

11.2 Components & Slots (組件&插槽)

<p style="text-indent:2em">組件和插槽給內(nèi)容片段(section)和布局(layout)帶來了方便,不過,有些人可能會(huì)發(fā)現(xiàn)組件和插槽的模型更容易理解。</p>

我們假設(shè)有一個(gè)可復(fù)用的“alert”組件,我們想要在整個(gè)應(yīng)用中都可以復(fù)用它。

# 簡單的組件
    // 定義組件 【文件路徑:/resources/views/alert.blade.php】
        <div class="alert alert-danger">
            {{ $slot }}
        </div>
    
    // 使用組件
        @component('alert')
            這是想要注入組件的內(nèi)容    // {{ $slot }} 變量包含了我們想要注入組件的內(nèi)容 
        @endcomponent

# 多個(gè)插槽的組件
    // 定義組件 【文件路徑:/resources/views/alert.blade.php】
        <div class="alert alert-danger">
            <div class="alert-title">{{ $title }}</div>
            {{ $slot }}
        </div>
    
    // 使用組件
        @component('alert')
            @slot('title')
                插槽的值
            @endslot
            這是想要注入組件的內(nèi)容
        @endcomponent

11.3 數(shù)據(jù)顯示

<p style="text-indent:2em">數(shù)據(jù)在視圖中的展示,一般是通過兩個(gè)花括號(hào)包裹變量來顯示傳遞到視圖的。</p>

eg. 【Blade 的 {{}} 語句已經(jīng)經(jīng)過 PHP 的 htmlentities 函數(shù)處理以避免 XSS 攻擊】

    # 在視圖中輸出 name 變量的內(nèi)容
        {{ $name }}

    # 三元運(yùn)算符 【如果 $name 變量存在,其值將會(huì)顯示,否則將會(huì)顯示 Default?!?        {{ isset($name) ? $name : 'Default' }}
        【針對(duì)三元操作符,Blade 還提供了更簡單的方式: {{ $name or 'Default' }} 】
    
    # 原樣輸出 【 Blade 的 {{ }} 語句已經(jīng)通過 PHP 的 htmlentities 函數(shù)處理以避免 XSS 攻擊,如果你不想要數(shù)據(jù)被處理,比如要輸出帶 HTML 元素的富文本 】
        {!! $name !!}
        【輸出用戶提供的內(nèi)容時(shí)要當(dāng)心,對(duì)用戶提供的內(nèi)容總是要使用雙花括號(hào)包{{}}裹以避免直接輸出 HTML 代碼。】

    # 數(shù)據(jù)在js文件中的展示
        var app = <?php echo json_encode($array); ?>;  // 這就是在js文件使用原生的PHP語法。
        【顯然,我們有更簡潔的方式,使用Blade 的 @json 指令:var app = @json($array);】

11.4 Blade & JavaScript 框架

<p style="text-indent:2em">由于很多 JavaScript 框架也是用花括號(hào)來表示要顯示在瀏覽器中的表達(dá)式,如 Vue,我們可以使用 @ 符號(hào)來告訴 Blade 渲染引擎該表達(dá)式應(yīng)該保持原生格式不作改動(dòng)。</p>

@{{ name }}

【在本例中,@ 符在編譯階段會(huì)被 Blade 移除,但是,{{ name }} 表達(dá)式將會(huì)保持不變,從而可以被 JavaScript 框架正常渲染?!?

@verbatim指令

【如果你在模板中有很大一部分篇幅顯示 JavaScript 變量,那么可以將這部分 HTML 封裝在 @verbatim 指令中,這樣就不需要在每個(gè) Blade 輸出表達(dá)式前加上 @ 前綴:】
    @verbatim
        <div class="container">
            Hello, {{ name }}.
        </div>
    @endverbatim

11.5 流程控制在模板中的使用

<p style="text-indent:2em">除了模板繼承與數(shù)據(jù)顯示的功能以外,Blade 還提供了常見的 PHP 流程控制語句,比如條件表達(dá)式和循環(huán)語句。這些語句與 PHP 語句的相似,與其一樣清晰簡明。</p>

If 語句

@if (count($records) === 1)
    我有一條記錄!
@elseif (count($records) > 1)
    我有多條記錄!
@else
    我沒有任何記錄!
@endif

# 為了方便,Blade 還提供了一個(gè) @unless 命令
@unless (Auth::check())
    你尚未登錄。
@endunless

# @isset 和 @empty 指令也可以視為與 PHP 函數(shù)有相同的功能:
@isset($records)
    // $records 被定義并且不為空...
@endisset

@empty($records)
    // $records 是「空」的...
@endempty

身份驗(yàn)證快捷方式

@auth 和 @guest 指令可用于快速判斷當(dāng)前用戶是否登錄。

@auth
    // 用戶已登錄...
@endauth

@guest
    // 用戶未登錄...
@endguest

Switch 語句

@switch($i)
    @case(1)
        First case...
        @break

    @case(2)
        Second case...
        @break

    @default
        Default case...
@endswitch

for 循環(huán)語句

@for ($i = 0; $i < 10; $i++)
    當(dāng)前的值為 {{ $i }}
@endfor

foreach 循環(huán)語句

@foreach ($users as $user)
    <p>用戶編號(hào)為 {{ $user->id }}</p>
@endforeach

forelse 循環(huán)語句

@forelse ($users as $user)
    <li>用戶名{{ $user->name }}</li>
@empty
    <p>暫無用戶</p>
@endforelse

while 循環(huán)語句

@while (true)
    <p>無限循環(huán)</p>
@endwhile

continue & break 語句

# 用法1 【結(jié)束循環(huán)或跳出當(dāng)前迭代】
@foreach ($users as $user)
    @if ($user->type == 1)
        @continue
    @endif

    <li>{{ $user->name }}</li>

    @if ($user->number == 5)
        @break
    @endif
@endforeach

# 用法2 【引入條件】
@foreach ($users as $user)
    @continue($user->type == 1)
        <li>{{ $user->name }}</li>
    @break($user->number == 5)
@endforeach

$loop 變量

在循環(huán)的時(shí)候,可以在循環(huán)體中使用 $loop 變量,該變量提供了一些有用的信息,比如當(dāng)前循環(huán)索引,以及當(dāng)前循環(huán)是不是第一個(gè)或最后一個(gè)迭代。
$loop 變量還提供了其他一些有用的屬性:

屬性                  描述
$loop->index        當(dāng)前循環(huán)迭代索引 (從0開始)
$loop->iteration    當(dāng)前循環(huán)迭代 (從1開始)
$loop->remaining    當(dāng)前循環(huán)剩余的迭代
$loop->count        迭代數(shù)組元素的總數(shù)量
$loop->first        是否是當(dāng)前循環(huán)的第一個(gè)迭代
$loop->last         是否是當(dāng)前循環(huán)的最后一個(gè)迭代
$loop->depth        當(dāng)前循環(huán)的嵌套層級(jí)
$loop->parent       嵌套循環(huán)中的父級(jí)循環(huán)變量

注釋

Blade 還允許你在視圖中定義注釋,然而,不同于 HTML 注釋,Blade 注釋并不會(huì)包含到 HTML 中被返回:
    {{-- This comment will not be present in the rendered HTML --}}

PHP

在一些場景中,嵌入 PHP 代碼到視圖中很有用,你可以使用 @php 指令在模板中執(zhí)行一段原生 PHP 代碼:
@php
    # code 
@endphp
【盡管 Blade 提供了這個(gè)特性,如果過于頻繁地使用它意味著你在視圖模板中嵌入了過多的業(yè)務(wù)邏輯,需要注意?!?

引入子視圖

你可以使用 Blade 的 @include 命令來引入一個(gè)已存在的視圖,所有在父視圖的可用變量在被引入的視圖中都是可用的。

<div>
    @include('shared.errors')

    <form>
        <!-- Form Contents -->
    </form>
</div>


十二、數(shù)據(jù)庫操作

建議性規(guī)范

1. 所有的數(shù)據(jù)模型文件,都 必須 存放在:app/Models/ 文件夾中。
    命名空間: namespace App\Models;

2. 所有的 Eloquent 數(shù)據(jù)模型 都 必須 繼承統(tǒng)一的基類 App/Models/Model
    此基類存放位置為 /app/Models/Model.php

3. 數(shù)據(jù)模型相關(guān)的命名規(guī)范:
    數(shù)據(jù)模型類名 必須 為「單數(shù)」, 如:App\Models\Photo
    類文件名 必須 為「單數(shù)」,如:app/Models/Photo.php
    數(shù)據(jù)庫表名字 必須 為「復(fù)數(shù)」,多個(gè)單詞情況下使用「Snake Case」 如:photos, my_photos
    數(shù)據(jù)庫表遷移名字 必須 為「復(fù)數(shù)」,如:2014_08_08_234417_create_photos_table.php
    數(shù)據(jù)填充文件名 必須 為「復(fù)數(shù)」,如:PhotosTableSeeder.php
    數(shù)據(jù)庫字段名 必須 為「Snake Case」,如:view_count, is_vip
    數(shù)據(jù)庫表主鍵 必須 為「id」
    數(shù)據(jù)庫表外鍵 必須 為「resource_id」,如:user_id, post_id
    數(shù)據(jù)模型變量 必須 為「resource_id」,如:$user_id, $post_id

4. 絕不 使用 Repository,因?yàn)槲覀儾皇窃趯?JAVA 代碼,太多封裝就成了「過度設(shè)計(jì)(Over Designed)」,極大降低了編碼愉悅感,使用 MVC 夠傻夠簡單。

5. 關(guān)于 SQL 文件
    絕不 使用命令行或者 PHPMyAdmin 直接創(chuàng)建索引或表。必須 使用 數(shù)據(jù)庫遷移 去創(chuàng)建表結(jié)構(gòu),并提交版本控制器中;
    絕不 為了共享對(duì)數(shù)據(jù)庫更改就直接導(dǎo)出 SQL,所有修改都 必須 使用 數(shù)據(jù)庫遷移 ,并提交版本控制器中;
    絕不 直接向數(shù)據(jù)庫手動(dòng)寫入偽造的測試數(shù)據(jù)。必須 使用 數(shù)據(jù)填充 來插入假數(shù)據(jù),并提交版本控制器中。

6. 全局作用域
    Laravel 的 Model 全局作用域 允許我們?yōu)榻o定模型的所有查詢添加默認(rèn)的條件約束。
    所有的全局作用域都 必須 統(tǒng)一使用 閉包定義全局作用域

傳統(tǒng)

12.1.1 簡介

Eloquent ORM

12.2.1 簡介

Laravel 內(nèi)置的 Eloquent ORM 提供了一個(gè)美觀、簡單的與數(shù)據(jù)庫打交道的 ActiveRecord 實(shí)現(xiàn),每張數(shù)據(jù)表都對(duì)應(yīng)一個(gè)與該表進(jìn)行交互的模型(Model),通過模型類,你可以對(duì)數(shù)據(jù)表進(jìn)行查詢、插入、更新、刪除等操作。

12.2.2 創(chuàng)建模型

創(chuàng)建:artisan命令

php artisan make:model [Models/]User [-m|--migration]
【laravel 沒有提供Models目錄,所以在創(chuàng)建模型的時(shí)候,順帶著把Models目錄也創(chuàng)建了】
【如果想要在生成模型時(shí)生成數(shù)據(jù)庫遷移,可在命令后臺(tái)帶上 --migration 或 -m】

Eloquent 模型約定

1. 表名: 
    Eloquent 默認(rèn)規(guī)則是小寫的模型類名復(fù)數(shù)格式作為與其對(duì)應(yīng)的表名
    【除非在模型類中明確指定了其它名稱:protected $table = '自定義數(shù)據(jù)表名';】

2. 主鍵:
    Eloquent 默認(rèn)每張表的主鍵名為 id
    【如果不是,你可以在模型類中定義一個(gè) $primaryKey 屬性來覆蓋該約定:protected $primaryKey = '主鍵名';】

3. 時(shí)間戳:
    Eloquent 默認(rèn) '字段' created_at 和 updated_at 已經(jīng)存在于數(shù)據(jù)表中。
    【如果你不想要這些 Laravel 自動(dòng)管理的數(shù)據(jù)列,在模型類中設(shè)置 $timestamps 屬性為 false:public $timestamps = false;】

4. 數(shù)據(jù)庫連接:
    默認(rèn)情況下,所有的 Eloquent 模型使用應(yīng)用配置中的默認(rèn)數(shù)據(jù)庫連接
    【如果你想要為模型指定不同的連接,可以通過 $connection 屬性來設(shè)置:protected $connection = 'connection-name';】

12.2.3


十四、單元測試

(待更新...)


十五、異常處理 & 錯(cuò)誤日志

(待更新...)


十六、引入自定義類或擴(kuò)展

<p style="text-indent:2em">我們?cè)陂_發(fā)項(xiàng)目中,常常會(huì)用到自定義的類文件或擴(kuò)展文件,例如阿里云短信服務(wù)、語音服務(wù),websocket消息推送,信鴿推送restfulAPI接口類文件,自定義的支付接口類文件等等。這些自定義類或擴(kuò)展,在項(xiàng)目中需要有一個(gè)固定的地方來存放他們,下面我們就來設(shè)置文件的存放位置。</p>

第一步:創(chuàng)建文件夾

創(chuàng)建自定義或第三方相關(guān)擴(kuò)展的文件夾:
    在 app 目錄下自定義一個(gè)名為 Extend 的文件夾【文件夾命名隨自己喜好,非特定命名約束】
    
創(chuàng)建愛你自定義類的文件夾:
    在 app 目錄下自定義一個(gè)名為 Service  的文件夾【文件夾命名隨自己喜好,非特定命名約束】

第二步:在 composer.json 文件中追加自動(dòng)加載文件

一般在 composer.json 文件下的第 40 行上下 ,會(huì)存在:

    "autoload": {
        "psr-4": {
            "App\\": "app/"
        },
        "files": [
            "app/Common/common.php"
        ],
        "classmap": [
            "database/seeds",
            "database/factories",
            "app/Extend",       // 這里表示要自動(dòng)加載自定義或第三方相關(guān)擴(kuò)展文件夾
            "app/Service"       // 這里表示要自動(dòng)加載自定義類的文件夾
        ]
    },

第三步:執(zhí)行 composer dump 命令,重新加載整個(gè)項(xiàng)目

在項(xiàng)目根目錄下,執(zhí)行 composer dump 即可。

第四步:在相關(guān)控制器或模型下,引入即可使用

延伸:卸載同樣也很簡單,將創(chuàng)建的時(shí)候步驟重推一下即可

1. 刪除相關(guān)文件夾
2. 刪除 composer.json 文件下的相關(guān)自動(dòng)加載
3. 執(zhí)行 composer dump 命令用來生成自動(dòng)加載文件
4. 結(jié)束


附錄1:Artisan工具

<p style="text-indent:2em">Artisan 是 Laravel 中自帶的命令行工具的名稱。它提供了一些對(duì)您的應(yīng)用開發(fā)有幫助的命令。它是由強(qiáng)大的 Symfony Console 組件驅(qū)動(dòng)的。為了查看所有可用的 Artisan 的命令,您可以使用 list 命令來列出它們:</p>

php artisan list

在項(xiàng)目開發(fā)中,常見的命令:

利用artisan工具創(chuàng)建控制器:php artisan make:controller [模塊名/]控制器名
    eg. php artisan make:controller IndexController
    eg. php artisan make:controller Home/IndexController
    
利用artisan工具創(chuàng)建模塊:php artisan make:model [模塊定義的目錄/]模塊名
    eg. php artisan make:model Test
    eg. php artisan make:model Models/Test
    // laravel默認(rèn)是沒有models目錄的,所以官方推薦,將Models目錄存放在app目錄下

利用artisan工具創(chuàng)建中間件:php artisan make:middleware TestMiddleware

利用artisan工具查看路由:php artisan route:list

其他常用命令:
    php artisan:                   // 顯示詳細(xì)的命令行幫助信息,同 php artisan list
    php artisan –help:             // 顯示幫助命令的使用格式,同 php artisan help
    php artisan –version:          // 顯示當(dāng)前使用的 Laravel 版本
    php artisan changes:           // 列出當(dāng)前版本相對(duì)于上一版本的主要變化
    php artisan down:              // 將站點(diǎn)設(shè)為維護(hù)狀態(tài)
    php artisan up:                // 將站點(diǎn)設(shè)回可訪問狀態(tài)
    php artisan optimize:          // 優(yōu)化應(yīng)用程序性能,生成自動(dòng)加載文件,且產(chǎn)生聚合編譯文件 bootstrap/compiled.php
    php artisan dump-autoload:     // 重新生成框架的自動(dòng)加載文件,相當(dāng)于 optimize 的再操作
    php artisan clear-compiled:    // 清除編譯生成的文件,相當(dāng)于 optimize 的反操作
    php artisan migrate:           // 執(zhí)行數(shù)據(jù)遷移
    php artisan routes:            // 列出當(dāng)前應(yīng)用全部的路由規(guī)則,同 php artisan routes list
    php artisan serve:             // 使用 PHP 內(nèi)置的開發(fā)服務(wù)器啟動(dòng)應(yīng)用 【要求 PHP 版本在 5.4 或以上】
    php artisan tinker:            // 進(jìn)入與當(dāng)前應(yīng)用環(huán)境綁定的 REPL 環(huán)境,相當(dāng)于 Rails 框架的 rails console 命令
    php artisan cache:clear:       // 清除應(yīng)用程序緩存
    php artisan command:make 命令名://在 app/commands 目錄下生成一個(gè)名為 命令名.php 的自定義命令文件
    php artisan db:seed:           // 對(duì)數(shù)據(jù)庫填充種子數(shù)據(jù),以用于測試
    php artisan key:generate:      // 生成一個(gè)隨機(jī)的 key,并自動(dòng)更新到 app/config/app.ph 的 key 鍵值對(duì)
    php artisan migrate:install:   // 初始化遷移數(shù)據(jù)表
    php artisan migrate:make 遷移名://這將在 app/database/migrations 目錄下生成一個(gè)名為 時(shí)間+遷移名.php 的數(shù)據(jù)遷移文件,并自動(dòng)執(zhí)行一次 php artisan dump-autoload 命令
    php artisan migrate:refresh:   // 重置并重新執(zhí)行所有的數(shù)據(jù)遷移
    php artisan migrate:reset:     // 回滾所有的數(shù)據(jù)遷移
    php artisan migrate:rollback:  // 回滾最近一次數(shù)據(jù)遷移
    php artisan session:table:     // 生成一個(gè)用于 session 的數(shù)據(jù)遷移文件

附錄2:Laravel 安全實(shí)踐

<p style="text-indent:2em">沒有絕對(duì)安全,只有相對(duì)安全。Laravel 相較于其他框架在安全方面已經(jīng)做得很優(yōu)秀,不過作為開發(fā)者,我們要在日常開發(fā)中對(duì)『安全』需懷著敬畏之心,積極培養(yǎng)自己的安全意識(shí)。以下是一些 Laravel 安全相關(guān)的規(guī)范。</p>

關(guān)閉 DEBUG

Laravel Debug 開啟時(shí),會(huì)暴露很多能被黑客利用的服務(wù)器信息,所以,生產(chǎn)環(huán)境下請(qǐng) 必須 確保 APP_DEBUG=false

跨站腳本攻擊(XSS)

1. 跨站腳本攻擊(cross-site scripting,簡稱 XSS),具體危害體現(xiàn)在黑客能控制你網(wǎng)站頁面,包括使用 JS 盜取 Cookie 等,關(guān)于 XSS 的介紹請(qǐng)前往 IBM 文檔庫:跨站點(diǎn)腳本攻擊深入解析 。

2. 默認(rèn)情況下,在無法保證用戶提交內(nèi)容是 100% 安全的情況下,必須 使用 Blade 模板引擎的 {{ $content }} 語法會(huì)對(duì)用戶內(nèi)容進(jìn)行轉(zhuǎn)義。

3. Blade 的 {!! $content !!} 語法會(huì)直接對(duì)內(nèi)容進(jìn)行 非轉(zhuǎn)義 輸出,使用此語法時(shí),必須 使用 HTMLPurifier for Laravel 5 來為用戶輸入內(nèi)容進(jìn)行過濾。使用方法參見: 使用 HTMLPurifier 來解決 Laravel 5 中的 XSS 跨站腳本攻擊安全問題

SQL 注入

1. Laravel 的 查詢構(gòu)造器 和 Eloquent 是基于 PHP 的 PDO,PDO 使用 prepared 來準(zhǔn)備查詢語句,保障了安全性。

2. 在使用 raw() 來編寫復(fù)雜查詢語句時(shí),必須 使用數(shù)據(jù)綁定(占位符)。

跨站請(qǐng)求偽造(CSRF)

1. CSRF 跨站請(qǐng)求偽造是 Web 應(yīng)用中最常見的安全威脅之一,Laravel 默認(rèn)對(duì)所有『非冪等的請(qǐng)求』強(qiáng)制使用 VerifyCsrfToken 中間件防護(hù),需要開發(fā)者做的,是區(qū)分清楚什么時(shí)候該使用『非冪等的請(qǐng)求』。
   ※ 冪等請(qǐng)求指的是:'HEAD', 'GET', 'OPTIONS',既無論你執(zhí)行多少次重復(fù)的操作都不會(huì)給資源造成變更。

2. 所有刪除的動(dòng)作,必須 使用 DELETE 作為請(qǐng)求方法;

3. 所有對(duì)數(shù)據(jù)更新的動(dòng)作,必須 使用 POST、PUT 或者 PATCH 請(qǐng)求方法。

附錄3:Laravel 程序優(yōu)化

<p style="text-indent:2em">作為優(yōu)秀的開發(fā)者,在日常編碼中,應(yīng)積極培養(yǎng)書寫高執(zhí)行效率代碼的意識(shí)。不過項(xiàng)目運(yùn)行效率是一個(gè)系統(tǒng)性工程,不應(yīng)該只停留在代碼層面上,有時(shí)更應(yīng)該考慮整個(gè)項(xiàng)目架構(gòu),包括項(xiàng)目中使用的軟件等。</p>
<p style="text-indent:2em">本文羅列了一些常見的優(yōu)化項(xiàng)目,并且對(duì)其做了約束。</p>

配置信息緩存

1. 生產(chǎn)環(huán)境中的 應(yīng)該 使用『配置信息緩存』來加速 Laravel 配置信息的讀取。
2. 使用以下 Artisan 自帶命令,把 config 文件夾里所有配置信息合并到一個(gè)文件里,減少運(yùn)行時(shí)文件的載入數(shù)量:
        執(zhí)行命令: php artisan config:cache

3. 可以使用以下命令來取消配置信息緩存:
        執(zhí)行命令: php artisan config:clear

4. 注釋:
    a). 緩存文件存放在 bootstrap/cache/ 文件夾中。
    b). 配置信息緩存不會(huì)隨著更新而自動(dòng)重載,所以,開發(fā)時(shí)候建議關(guān)閉配置信息緩存,一般在生產(chǎn)環(huán)境中使用??梢耘浜?Envoy 任務(wù)運(yùn)行器 使用,在每次上線代碼時(shí)執(zhí)行 config:clear 命令

路由緩存

1. 生產(chǎn)環(huán)境中的 應(yīng)該 使用『路由緩存』來加速 Laravel 的路由注冊(cè)。

2. 路由緩存可以有效的提高路由器的注冊(cè)效率,在大型應(yīng)用程序中效果越加明顯,可以使用以下命令:
    執(zhí)行命令: php artisan route:cache

3. 可以使用下面命令清除路由緩存:
    執(zhí)行命令: php artisan route:clear

4. 注釋:
    a). 緩存文件存放在 bootstrap/cache/ 文件夾中。另外,路由緩存不支持路由匿名函數(shù)編寫邏輯
    b). 路由緩存不會(huì)隨著更新而自動(dòng)重載,所以,開發(fā)時(shí)候建議關(guān)閉路由緩存,一般在生產(chǎn)環(huán)境中使用。可以配合 Envoy 任務(wù)運(yùn)行器 使用,在每次上線代碼時(shí)執(zhí)行 route:clear 命令

類映射加載優(yōu)化

1. optimize 命令把常用加載的類合并到一個(gè)文件里,通過減少文件的加載,來提高運(yùn)行效率。

2. 生產(chǎn)環(huán)境中的 應(yīng)該 使用 optimize 命令來優(yōu)化類的加載速度:
    執(zhí)行命令: php artisan optimize --force

3. 要清除類映射加載優(yōu)化,請(qǐng)運(yùn)行以下命令:
    執(zhí)行命令: php artisan clear-compiled

4. 注釋:
    a). 以上命令會(huì)在 bootstrap/cache/ 文件夾中生成緩存文件。你可以通過修改 config/compile.php 文件來添加要合并的類。在 production 環(huán)境中,參數(shù) --force 不需要指定,文件就會(huì)自動(dòng)生成。
    b). 此命令要運(yùn)行在 php artisan config:cache 后,因?yàn)?optimize 命令是根據(jù)配置信息(如:config/app.php 文件的 providers 數(shù)組)來生成文件的。

自動(dòng)加載優(yōu)化

1. 此命令不止針對(duì)于 Laravel 程序,適用于所有使用 composer 來構(gòu)建的程序。此命令會(huì)把 PSR-0 和 PSR-4 轉(zhuǎn)換為一個(gè)類映射表,來提高類的加載速度。
    執(zhí)行命令: composer dumpautoload -o

2. 注意:
    php artisan optimize --force 命令里已經(jīng)做了這個(gè)操作。

使用 Memcached 來存儲(chǔ)會(huì)話

1. 每一個(gè) Laravel 的請(qǐng)求,都會(huì)產(chǎn)生會(huì)話,修改會(huì)話的存儲(chǔ)方式能有效提高程序效率。會(huì)話的配置文件是 config/session.php。

2. 生產(chǎn)環(huán)境中的 必須 使用 Memcached 或者 Redis 等專業(yè)的緩存軟件來存儲(chǔ)會(huì)話,應(yīng)該 優(yōu)先選擇 Memcached:
    配置項(xiàng)參數(shù): 'driver' => 'memcached',

使用專業(yè)緩存驅(qū)動(dòng)器

1. 「緩存」是提高應(yīng)用程序運(yùn)行效率的法寶之一,Laravel 默認(rèn)緩存驅(qū)動(dòng)是 file 文件緩存。
2. 生產(chǎn)環(huán)境中的 必須 使用專業(yè)的緩存系統(tǒng),如 Redis 或者 Memcached。應(yīng)該 優(yōu)先考慮 Redis。應(yīng)該 避免使用數(shù)據(jù)庫緩存。
    配置項(xiàng)參數(shù): 'default' => 'redis',

數(shù)據(jù)庫請(qǐng)求優(yōu)化

關(guān)聯(lián)模型數(shù)據(jù)讀取時(shí) 必須 使用 延遲預(yù)加載 和 預(yù)加載 。

臨近上線時(shí) 必須 使用 Laravel Debugbar 或者 Clockwork 留意每一個(gè)頁面的總 SQL 請(qǐng)求條數(shù),進(jìn)行數(shù)據(jù)庫請(qǐng)求調(diào)優(yōu)。

為數(shù)據(jù)集書寫緩存邏輯

應(yīng)該 合理的使用 Laravel 提供的緩存層操作,把從數(shù)據(jù)庫里面拿出來的數(shù)據(jù)集合進(jìn)行緩存,減少數(shù)據(jù)庫的壓力,運(yùn)行在內(nèi)存上的專業(yè)緩存軟件對(duì)數(shù)據(jù)的讀取也遠(yuǎn)遠(yuǎn)快于數(shù)據(jù)庫。

使用即時(shí)編譯器

可以 使用 OpCache 進(jìn)行優(yōu)化。OpCache 都能輕輕松松的讓你的應(yīng)用程序在不用做任何修改的情況下,直接提高 50% 或者更高的性能。

前端資源合并

1. 作為優(yōu)化的標(biāo)準(zhǔn):
    一個(gè)頁面 應(yīng)該 只加載一個(gè) CSS 文件;
    一個(gè)頁面 應(yīng)該 只加載一個(gè) JS 文件。

2. 另外,為了文件要能方便走 CDN,需要文件名 應(yīng)該 隨著修改而變化。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容