Laravel 快速指南



Laravel - 概述

Laravel 是一個開源的 PHP 框架,它強大且易於理解。它遵循模型-檢視-控制器 (MVC) 設計模式。Laravel 重用不同框架的現有元件,這有助於建立 Web 應用程式。因此設計的 Web 應用程式更加結構化和實用。

Laravel 提供了豐富的功能集,其中包含了 CodeIgniter、Yii 等 PHP 框架以及 Ruby on Rails 等其他程式語言的基本特性。Laravel 擁有非常豐富的功能,可以提高 Web 開發速度。

如果您熟悉 Core PHP 和 Advanced PHP,Laravel 將使您的任務更容易。如果您計劃從頭開始開發網站,它可以節省大量時間。此外,用 Laravel 構建的網站是安全的,可以防止多種 Web 攻擊。

Laravel 的優勢

在基於 Laravel 設計 Web 應用程式時,它為您提供以下優勢:

  • 由於 Laravel 框架,Web 應用程式變得更具可擴充套件性。

  • 由於 Laravel 在開發 Web 應用程式時重用其他框架的元件,因此在設計 Web 應用程式時節省了大量時間。

  • 它包含名稱空間和介面,因此有助於組織和管理資源。

Composer

Composer 是一個包含所有依賴項和庫的工具。它允許使用者根據指定的框架(例如,Laravel 安裝中使用的框架)建立專案。藉助 Composer,可以輕鬆安裝第三方庫。

所有依賴項都記錄在原始檔夾中的 **composer.json** 檔案中。

Artisan

Laravel 中使用的命令列介面稱為 **Artisan**。它包含一組命令,可幫助構建 Web 應用程式。這些命令是從 Symphony 框架中整合的,從而在 Laravel 5.1(Laravel 的最新版本)中增加了附加功能。

Laravel 的特性

Laravel 提供以下關鍵特性,使其成為設計 Web 應用程式的理想選擇:

模組化

Laravel 提供 20 個內建庫和模組,有助於增強應用程式。每個模組都與 Composer 依賴項管理器整合,從而簡化了更新。

可測試性

Laravel 包含有助於透過各種測試用例進行測試的功能和幫助程式。此功能有助於根據要求維護程式碼。

路由

Laravel 為使用者提供了一種靈活的方法來定義 Web 應用程式中的路由。路由有助於更好地擴充套件應用程式並提高其效能。

配置管理

在 Laravel 中設計的 Web 應用程式將在不同的環境中執行,這意味著其配置將不斷變化。Laravel 提供了一種一致的方法來有效地處理配置。

查詢構建器和 ORM

Laravel 集成了一個查詢構建器,它有助於使用各種簡單的鏈式方法查詢資料庫。它提供了 **ORM**(物件關係對映)和稱為 Eloquent 的 **ActiveRecord** 實現。

模式構建器

模式構建器在 PHP 程式碼中維護資料庫定義和模式。它還跟蹤資料庫遷移方面的變化。

模板引擎

Laravel 使用 **Blade 模板**引擎,這是一種輕量級的模板語言,用於設計包含動態內容的預定義塊的層次結構塊和佈局。

電子郵件

Laravel 包含一個 **mail** 類,它有助於從 Web 應用程式傳送包含豐富內容和附件的郵件。

身份驗證

使用者身份驗證是 Web 應用程式中的常見功能。Laravel 簡化了身份驗證的設計,因為它包括 **註冊、忘記密碼** 和 **傳送密碼提醒** 等功能。

Redis

Laravel 使用 **Redis** 連線到現有的會話和通用快取。Redis 直接與會話互動。

佇列

Laravel 包括佇列服務,例如向大量使用者傳送電子郵件或指定的 **Cron** 作業。這些佇列有助於更輕鬆地完成任務,而無需等待先前任務完成。

事件和命令匯流排

Laravel 5.1 包含 **命令匯流排**,它有助於以簡單的方式執行命令和排程事件。Laravel 中的命令根據應用程式的生命週期執行。

Laravel - 安裝

Laravel 使用 **composer** 來管理依賴項。在安裝 Laravel 之前,請確保您的系統上已安裝 Composer。在本節中,您將看到 Laravel 的安裝過程。

您必須按照以下步驟將 Laravel 安裝到您的系統中:

**步驟 1** - 訪問以下網址並下載 composer 以將其安裝到您的系統中。

https://getcomposer.org/download/

**步驟 2** - 安裝 Composer 後,在命令提示符中鍵入 Composer 命令來檢查安裝,如下面的螢幕截圖所示。

Composer

**步驟 3** - 在您的系統中的任何位置為新的 Laravel 專案建立一個新目錄。然後,移動到您建立新目錄的路徑,並在那裡鍵入以下命令來安裝 Laravel。

composer create-project laravel/laravel –-prefer-dist

現在,我們將重點關注 5.7 版本的安裝。在 Laravel 5.7 版本中,您可以透過鍵入以下命令來安裝完整的框架:

composer create-project laravel/laravel test dev-develop

該命令的輸出如下所示:

Composer Create Project

Laravel 框架可以直接使用開發分支安裝,該分支包含最新的框架。

**步驟 4** - 以上命令將在當前目錄中安裝 Laravel。透過執行以下命令啟動 Laravel 服務。

php artisan serve

**步驟 5** - 執行上述命令後,您將看到如下所示的螢幕:

Administrator

**步驟 6** - 複製上面螢幕截圖中以灰色下劃線的 URL,並在瀏覽器中開啟該 URL。如果您看到以下螢幕,則表示 Laravel 已成功安裝。

Laravel Installed

Laravel - 應用結構

Laravel 中的應用程式結構基本上是專案中包含的資料夾、子資料夾和檔案的結構。在 Laravel 中建立專案後,我們將獲得此處所示的應用程式結構概述。

此處顯示的快照指的是 Laravel 的根資料夾,即 **laravel-project**。它包含各種子資料夾和檔案。資料夾和檔案的分析以及它們的功能方面如下所述:

Root Directory

App

它是應用程式資料夾,包含專案的整個原始碼。它包含事件、異常和中介軟體宣告。app 資料夾包含各種子資料夾,如下所述:

Console

Console 包含 Laravel 必要的 artisan 命令。它包含一個名為 **Commands** 的目錄,其中所有命令都以適當的簽名宣告。**Kernal.php** 檔案呼叫在 **Inspire.php** 中宣告的命令。

Console

如果我們需要在 Laravel 中呼叫特定命令,則應對此目錄進行相應的更改。

Events

此資料夾包含專案的所有事件。

Events

事件用於觸發活動、引發錯誤或必要的驗證,並提供更大的靈活性。Laravel 將所有事件儲存在一個目錄下。包含的預設檔案是 **event.php**,其中聲明瞭所有基本事件。

Exceptions

此資料夾包含處理異常所需的所有方法。它還包含處理所有異常的 **handle.php** 檔案。

Http

**Http** 資料夾包含控制器、中介軟體和應用程式請求的子資料夾。由於 Laravel 遵循 MVC 設計模式,因此此資料夾包含為特定目錄定義的模型、控制器和檢視。

**Middleware** 子資料夾包含中介軟體機制,包括過濾器機制以及響應和請求之間的通訊。

**Requests** 子資料夾包含應用程式的所有請求。

Jobs

**Jobs** 目錄維護 Laravel 應用程式排隊的活動。基類在所有作業之間共享,並提供一箇中心位置來將它們放在一個屋簷下。

Listeners

偵聽器依賴於事件,它們包含用於處理事件和異常的方法。例如,宣告的 **login** 事件包含 **LoginListener** 事件。

Policies

策略是包含授權邏輯的 PHP 類。Laravel 包含一個功能,可以在此子資料夾內的策略類中建立所有授權邏輯。

Providers

此資料夾包含註冊核心伺服器事件和配置 Laravel 應用程式所需的所有服務提供商。

Bootstrap

此資料夾包含所有應用程式引導指令碼。它包含一個名為 **cache** 的子資料夾,其中包含與快取 Web 應用程式相關的所有檔案。您還可以找到 **app.php** 檔案,它初始化引導所需的指令碼。

Config

**config** 資料夾包含 Laravel 應用程式平穩執行所需的各種配置和相關引數。config 資料夾中包含的各種檔案如下所示。檔名根據與其關聯的功能而執行。

Config-folder

Database

顧名思義,此目錄包含資料庫功能的各種引數。它包含三個子目錄,如下所示:

  • **Seeds** - 這包含用於單元測試資料庫的類。

  • **Migrations** - 此資料夾有助於查詢 Web 應用程式中使用的資料庫的遷移。

  • **Factories** - 此資料夾用於生成大量資料記錄。

Public

這是根資料夾,用於初始化 Laravel 應用程式。它包含以下檔案和資料夾:

  • .htaccess − 此檔案提供伺服器配置。

  • javascript 和 css − 這些檔案被視為資原始檔 (assets)。

  • index.php − 此檔案是初始化 Web 應用程式所必需的。

Resources (資源)

Resources 目錄包含增強 Web 應用程式的檔案。此目錄中包含的子資料夾及其用途解釋如下:

  • assets − assets 資料夾包含 LESS 和 SCSS 等檔案,這些檔案是為 Web 應用程式設定樣式所必需的。

  • lang − 此資料夾包含本地化或國際化的配置。

  • views − views 是與終端使用者互動的 HTML 檔案或模板,在 MVC 架構中起著主要作用。

請注意,resources 目錄將被扁平化,而不是包含 assets 資料夾。下圖顯示了相同的圖形表示:

Resource Directory Changes

Storage (儲存)

這是儲存所有日誌和 Laravel 專案執行時經常需要的必要檔案的資料夾。此目錄中包含的子資料夾及其用途如下:

  • app − 此資料夾包含按順序呼叫的檔案。

  • framework − 它包含經常呼叫的會話、快取和檢視。

  • Logs − 所有異常和錯誤日誌都記錄在此子資料夾中。

Tests (測試)

所有單元測試用例都包含在此目錄中。測試用例類的命名約定為 **駝峰式命名法 (camel_case)**,並遵循與類功能一致的約定。

Vendor (供應商)

Laravel 完全基於 Composer 依賴項,例如安裝 Laravel 設定或包含第三方庫等。Vendor 資料夾包含所有 Composer 依賴項。

除了上述檔案之外,Laravel 還包含其他一些檔案,這些檔案在各種功能中起著主要作用,例如 GitHub 配置、包和第三方庫。

應用程式結構中包含的檔案如下所示:

Files

Laravel - 配置

在上一章中,我們已經看到 Laravel 的基本配置檔案包含在 **config** 目錄中。在本章中,讓我們討論配置中包含的類別。

環境配置

環境變數是為 Web 應用程式提供 Web 服務列表的變數。所有環境變數都在 **.env** 檔案中宣告,其中包含初始化配置所需的引數。

預設情況下,**.env** 檔案包含以下引數:

APP_ENV = local
APP_DEBUG = true
APP_KEY = base64:ZPt2wmKE/X4eEhrzJU6XX4R93rCwYG8E2f8QUA7kGK8 =
APP_URL = https://
DB_CONNECTION = mysql
DB_HOST = 127.0.0.1
DB_PORT = 3306
DB_DATABASE = homestead
DB_USERNAME = homestead
DB_PASSWORD = secret
CACHE_DRIVER = file
SESSION_DRIVER = file
QUEUE_DRIVER = sync
REDIS_HOST = 127.0.0.1
REDIS_PASSWORD = null
REDIS_PORT = 6379
MAIL_DRIVER = smtp
MAIL_HOST = mailtrap.ioMAIL_PORT = 2525
MAIL_USERNAME = null
MAIL_PASSWORD = null
MAIL_ENCRYPTION = null

重要提示

使用 Laravel 的基本配置檔案時,需要注意以下幾點:

  • **.env** 檔案不應提交到應用程式原始碼管理,因為每個開發人員或使用者都有一些預定義的 Web 應用程式環境配置。

  • 對於備份選項,開發團隊應該包含 **.env.example** 檔案,其中應包含預設配置。

檢索環境變數

可以透過 **env-helper** 函式訪問在 **.env** 檔案中宣告的所有環境變數,這些函式將呼叫相應的引數。每當應用程式從使用者端接收請求時,這些變數也會列入 **$_ENV** 全域性變數中。您可以按如下所示訪問環境變數:

'env' => env('APP_ENV', 'production'),

**env-helper** 函式在 **config** 資料夾中包含的 **app.php** 檔案中呼叫。上面的示例呼叫基本本地引數。

訪問配置值

您可以使用全域性 config 輔助函式輕鬆訪問應用程式中任何位置的配置值。如果配置值未初始化,則返回預設值。

例如,要設定預設時區,可以使用以下程式碼:

config(['app.timezone' => 'Asia/Kolkata']);

配置快取

為了提高效能並提升 Web 應用程式的速度,快取所有配置值非常重要。快取配置值的命令是:

config:cache

以下螢幕截圖顯示了系統方法中的快取:

Configuration Caching

維護模式

有時您可能需要更新一些配置值或對您的網站進行維護。在這種情況下,將其置於 **維護模式** 將使操作更容易。處於維護模式的此類 Web 應用程式會丟擲名為 **MaintenanceModeException** 的異常,其狀態程式碼為 503。

您可以使用以下命令啟用 Laravel Web 應用程式的維護模式:

php artisan down

PHP Artisian Down

以下螢幕截圖顯示了 Web 應用程式停機時的外觀:

Start Maintenance Mode

完成更新和其他維護工作後,您可以使用以下命令停用 Web 應用程式的維護模式:

php artisan up

Start Maintenance Up

現在,您可以發現網站顯示輸出,功能正常,表明維護模式已移除,如下所示:

Laravel Installed

Laravel - 路由

在 Laravel 中,所有請求都藉助路由進行對映。基本路由將請求路由到關聯的控制器。本章討論 Laravel 中的路由。

Laravel 中的路由包括以下類別:

  • 基本路由
  • 路由引數
  • 命名路由

基本路由

所有應用程式路由都在 **app/routes.php** 檔案中註冊。此檔案告訴 Laravel 它應該響應的 URI,並且關聯的控制器將對其進行特定呼叫。歡迎頁面的示例路由可以在下面給出的螢幕截圖中看到:

Routes

Route::get ('/', function () {
   return view('welcome');});

示例

請觀察以下示例,以瞭解有關路由的更多資訊:

app/Http/routes.php

<?php
Route::get('/', function () {
   return view('welcome');
});

resources/view/welcome.blade.php

<!DOCTYPE html>
<html>
   <head>
      <title>Laravel</title>
      <link href = "https://fonts.googleapis.com/css?family=Lato:100" rel = "stylesheet" 
         type = "text/css">
      
      <style>
         html, body {
            height: 100%;
         }
         body {
            margin: 0;
            padding: 0;
            width: 100%;
            display: table;
            font-weight: 100;
            font-family: 'Lato';
         }
         .container {
            text-align: center;
            display: table-cell;
            vertical-align: middle;
         }
         .content {
            text-align: center;
            display: inline-block;
         }
         .title {
            font-size: 96px;
         }
      </style>
   </head>
   
   <body>
      <div class = "container">
         
         <div class = "content">
            <div class = "title">Laravel 5.1</div>
         </div>
			
      </div>
   </body>
</html>

路由機制如下圖所示:

Routing Mechanism

現在讓我們詳細瞭解路由機制中涉及的步驟:

**步驟 1** − 最初,我們應該執行應用程式的根 URL。

**步驟 2** − 現在,執行的 URL 應與 **route.php** 檔案中的相應方法匹配。在本例中,它應匹配方法和根 ('/') URL。這將執行相關函式。

**步驟 3** − 該函式呼叫模板檔案 **resources/views/welcome.blade.php**。接下來,該函式呼叫帶有引數 **'welcome'** 的 **view()** 函式,不使用 **blade.php**。

這將產生如下圖所示的 HTML 輸出:

Laravel5

路由引數

有時在 Web 應用程式中,您可能需要捕獲透過 URL 傳遞的引數。為此,您應該修改 **routes.php** 檔案中的程式碼。

您可以透過此處討論的兩種方式捕獲 **routes.php** 檔案中的引數:

必需引數

這些引數是必須捕獲才能路由 Web 應用程式的引數。例如,必須從 URL 中捕獲使用者的識別號。這可以透過定義路由引數來實現,如下所示:

Route::get('ID/{id}',function($id) {
   echo 'ID: '.$id;
});

可選引數

有時開發人員可以將引數設定為可選引數,並且可以在 URL 中的引數名稱後新增 **?** 來實現。務必將預設值作為引數名稱提及。請檢視以下示例,該示例顯示如何定義可選引數:

Route::get('user/{name?}', function ($name = 'TutorialsPoint') { return $name;});

以上示例檢查值是否與 **TutorialsPoint** 匹配,並相應地路由到定義的 URL。

命名路由

命名路由允許以方便的方式建立路由。可以使用 route 定義上的 name 方法指定路由的連結。以下程式碼顯示了使用控制器建立命名路由的示例:

Route::get('user/profile', 'UserController@showProfile')->name('profile');

使用者控制器將呼叫引數為 **profile** 的函式 **showProfile**。引數使用 route 定義上的 **name** 方法。

Laravel - 中介軟體

中介軟體充當請求和響應之間的橋樑。它是一種過濾機制。本章向您解釋 Laravel 中的中介軟體機制。

Laravel 包含一箇中間件,用於驗證應用程式使用者是否已透過身份驗證。如果使用者已透過身份驗證,則將其重定向到主頁;否則,如果未透過身份驗證,則將其重定向到登入頁面。

可以透過執行以下命令建立中介軟體:

php artisan make:middleware <middleware-name>

將 **<middleware-name>** 替換為您中介軟體的名稱。您建立的中介軟體可以在 **app/Http/Middleware** 目錄中看到。

示例

請觀察以下示例,以瞭解中介軟體機制:

**步驟 1** − 現在讓我們建立 AgeMiddleware。要建立它,我們需要執行以下命令:

php artisan make:middleware AgeMiddleware

**步驟 2** − 成功執行命令後,您將收到以下輸出:

AgeMiddleware

**步驟 3** − **AgeMiddleware** 將在 **app/Http/Middleware** 中建立。新建立的檔案將已經為您建立了以下程式碼。

<?php

namespace App\Http\Middleware;
use Closure;

class AgeMiddleware {
   public function handle($request, Closure $next) {
      return $next($request);
   }
}

註冊中介軟體

在使用每個中介軟體之前,我們需要註冊它。Laravel 中有兩種型別的中介軟體。

  • 全域性中介軟體
  • 路由中介軟體

**全域性中介軟體** 將在應用程式的每個 HTTP 請求上執行,而 **路由中介軟體** 將分配給特定路由。中介軟體可以在 **app/Http/Kernel.php** 中註冊。此檔案包含兩個屬性 **$middleware** 和 **$routeMiddleware**。**$middleware** 屬性用於註冊全域性中介軟體,**$routeMiddleware** 屬性用於註冊特定於路由的中介軟體。

要註冊全域性中介軟體,請在 $middleware 屬性的末尾列出類。

protected $middleware = [
   \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
   \App\Http\Middleware\EncryptCookies::class,
   \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
   \Illuminate\Session\Middleware\StartSession::class,
   \Illuminate\View\Middleware\ShareErrorsFromSession::class,
   \App\Http\Middleware\VerifyCsrfToken::class,
];

要註冊特定於路由的中介軟體,請向 $routeMiddleware 屬性新增鍵和值。

protected $routeMiddleware = [
   'auth' => \App\Http\Middleware\Authenticate::class,
   'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
   'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
];

示例

我們在前面的示例中建立了 **AgeMiddleware**。我們現在可以在特定於路由的中介軟體屬性中註冊它。註冊該中介軟體的程式碼如下所示。

以下是 **app/Http/Kernel.php** 的程式碼:

<?php

namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel {
   protected $middleware = [
      \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
      \App\Http\Middleware\EncryptCookies::class,
      \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
      \Illuminate\Session\Middleware\StartSession::class,
      \Illuminate\View\Middleware\ShareErrorsFromSession::class,
      \App\Http\Middleware\VerifyCsrfToken::class,
   ];
  
   protected $routeMiddleware = [
      'auth' => \App\Http\Middleware\Authenticate::class,
      'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
      'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
      'Age' => \App\Http\Middleware\AgeMiddleware::class,
   ];
}

中介軟體引數

我們還可以使用中介軟體傳遞引數。例如,如果您的應用程式具有不同的角色,例如使用者、管理員、超級管理員等,並且您希望根據角色對操作進行身份驗證,則可以透過使用中介軟體傳遞引數來實現此目的。我們建立的中介軟體包含以下函式,我們可以在 **$next** 引數後傳遞自定義引數。

public function handle($request, Closure $next) {
   return $next($request);
}

示例

**步驟 1** − 透過執行以下命令建立 RoleMiddleware:

php artisan make:middleware RoleMiddleware

**步驟 2** − 成功執行後,您將收到以下輸出:

Middleware Parameters

**步驟 3** − 在 **app/Http/Middleware/RoleMiddleware.php** 中新建立的 RoleMiddleware 的 handle 方法中新增以下程式碼。

<?php

namespace App\Http\Middleware;
use Closure;

class RoleMiddleware {
   public function handle($request, Closure $next, $role) {
      echo "Role: ".$role;
      return $next($request);
   }
}

**步驟 4** − 在 **app\Http\Kernel.php** 檔案中註冊 RoleMiddleware。在該檔案中新增以灰色突出顯示的行以註冊 RoleMiddleware。

RoleMiddleware

**步驟 5** − 執行以下命令以建立 **TestController**:

php artisan make:controller TestController --plain

**步驟 6** − 成功執行上述步驟後,您將收到以下輸出:

TestController

**步驟 7** − 將以下程式碼行復制到 **app/Http/TestController.php** 檔案。

app/Http/TestController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class TestController extends Controller {
   public function index() {
      echo "<br>Test Controller.";
   }
}

**步驟 8** − 在 **app/Http/routes.php** 檔案中新增以下程式碼行。

app/Http/routes.php

Route::get('role',[
   'middleware' => 'Role:editor',
   'uses' => 'TestController@index',
]);

**步驟 9** − 訪問以下 URL 以測試帶有引數的中介軟體

https://:8000/role

**步驟 10** − 輸出將如下圖所示。

Role Editor

可終止中介軟體

可終止中介軟體在響應傳送到瀏覽器後執行某些任務。這可以透過在中介軟體中建立具有terminate方法的中介軟體來實現。可終止中介軟體應與全域性中介軟體一起註冊。terminate方法將接收兩個引數$request$response。可以按照以下程式碼所示建立terminate方法。

示例

步驟 1 − 執行以下命令建立TerminateMiddleware

php artisan make:middleware TerminateMiddleware

步驟 2 − 以上步驟將產生以下輸出:

Terminable Middleware

步驟 3 − 將以下程式碼複製到新建立的TerminateMiddleware中的app/Http/Middleware/TerminateMiddleware.php檔案。

<?php

namespace App\Http\Middleware;
use Closure;

class TerminateMiddleware {
   public function handle($request, Closure $next) {
      echo "Executing statements of handle method of TerminateMiddleware.";
      return $next($request);
   }
   
   public function terminate($request, $response) {
      echo "<br>Executing statements of terminate method of TerminateMiddleware.";
   }
}

步驟 4 − 在app\Http\Kernel.php檔案中註冊TerminateMiddleware。在該檔案中新增灰色突出顯示的行以註冊TerminateMiddleware。

TerminateMiddleware

步驟 5 − 執行以下命令建立ABCController

php artisan make:controller ABCController --plain

步驟 6 − 成功執行URL後,您將收到以下輸出:

ABCController

步驟 7 − 將以下程式碼複製到app/Http/ABCController.php檔案。

app/Http/ABCController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class ABCController extends Controller {
   public function index() {
      echo "<br>ABC Controller.";
   }
}

**步驟 8** − 在 **app/Http/routes.php** 檔案中新增以下程式碼行。

app/Http/routes.php

Route::get('terminate',[
   'middleware' => 'terminate',
   'uses' => 'ABCController@index',
]);

步驟 9 − 訪問以下URL以測試可終止中介軟體。

https://:8000/terminate

**步驟 10** − 輸出將如下圖所示。

ABC Controller

Laravel - 名稱空間

名稱空間可以定義為一類元素,其中每個元素都具有與該關聯類唯一的名稱。它可以與其他類中的元素共享。

名稱空間宣告

use關鍵字允許開發人員縮短名稱空間。

use <namespace-name>;

Laravel中使用的預設名稱空間是App,但是使用者可以更改名稱空間以與Web應用程式匹配。使用artisan命令建立使用者定義的名稱空間的方法如下:

php artisan app:name SocialNet

Select Git

建立的名稱空間可以包含各種功能,這些功能可以在控制器和各種類中使用。

Laravel - 控制器

在MVC框架中,字母“C”代表控制器。它充當檢視和模型之間的流量導向器。在本章中,您將學習Laravel中的控制器。

建立控制器

根據您使用的作業系統,開啟命令提示符或終端,並鍵入以下命令使用Artisan CLI(命令列介面)建立控制器。

php artisan make:controller <controller-name> --plain

將<controller-name>替換為您控制器的名稱。這將建立一個簡單的建構函式,因為我們正在傳遞引數——plain。如果您不想建立簡單的建構函式,可以忽略該引數。建立的建構函式可以在app/Http/Controllers中看到。

您將看到已經為您完成了一些基本的編碼工作,您可以新增自定義編碼。建立的控制器可以透過以下語法從routes.php呼叫。

語法

Route::get(‘base URI’,’controller@method’);

示例

步驟 1 − 執行以下命令建立UserController

php artisan make:controller UserController --plain

步驟 2 − 成功執行後,您將收到以下輸出。

UserController

步驟 3 − 您可以在app/Http/Controller/UserController.php中看到建立的控制器,其中已經為您編寫了一些基本程式碼,您可以根據需要新增自己的程式碼。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class UserController extends Controller {
   //
}

控制器中介軟體

我們之前已經瞭解過中介軟體,它也可以與控制器一起使用。中介軟體也可以分配給控制器的路由或控制器建構函式中。您可以使用middleware方法將中介軟體分配給控制器。註冊的中介軟體也可以限制在控制器的某些方法中。

將中介軟體分配到路由

Route::get('profile', [
   'middleware' => 'auth',
   'uses' => 'UserController@showProfile'
]);

這裡我們將auth中介軟體分配給profile路由中的UserController。

在控制器建構函式中分配中介軟體

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class UserController extends Controller {
   public function __construct() {
      $this->middleware('auth');
   }
}

這裡我們使用UserController建構函式中的middleware方法分配auth中介軟體。

示例

步驟 1 − 將以下程式碼行新增到app/Http/routes.php檔案中並儲存。

routes.php

<?php
Route::get('/usercontroller/path',[
   'middleware' => 'First',
   'uses' => 'UserController@showPath'
]);

步驟 2 − 透過執行以下程式碼行建立名為FirstMiddleware的中介軟體。

php artisan make:middleware FirstMiddleware

步驟 3 − 將以下程式碼新增到新建立的FirstMiddleware(位於app/Http/Middleware)的handle方法中。

FirstMiddleware.php

<?php

namespace App\Http\Middleware;
use Closure;

class FirstMiddleware {
   public function handle($request, Closure $next) {
      echo '<br>First Middleware';
      return $next($request);
   }
}

步驟 4 − 執行以下命令建立名為SecondMiddleware的中介軟體。

php artisan make:middleware SecondMiddleware

步驟 5 − 將以下程式碼新增到新建立的SecondMiddleware(位於app/Http/Middleware)的handle方法中。

SecondMiddleware.php

<?php

namespace App\Http\Middleware;
use Closure;

class SecondMiddleware {
   public function handle($request, Closure $next) {
      echo '<br>Second Middleware';
      return $next($request);
   }
}

步驟 6 − 執行以下命令建立一個名為UserController的控制器。

php artisan make:controller UserController --plain

步驟 7 − 成功執行URL後,您將收到以下輸出:

UserController1

步驟 8 − 將以下程式碼複製到app/Http/UserController.php檔案。

app/Http/UserController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class UserController extends Controller {
   public function __construct() {
      $this->middleware('Second');
   }
   public function showPath(Request $request) {
      $uri = $request->path();
      echo '<br>URI: '.$uri;
      
      $url = $request->url();
      echo '<br>';
      
      echo 'URL: '.$url;
      $method = $request->method();
      echo '<br>';
      
      echo 'Method: '.$method;
   }
}

步驟 9 − 如果您尚未執行,請執行以下命令啟動php的內部Web伺服器。

php artisan serve

步驟 10 − 訪問以下URL。

https://:8000/usercontroller/path

步驟 11 − 輸出將如下圖所示。

UserController2

RESTful資源控制器

在建立應用程式時,我們經常需要執行CRUD(建立、讀取、更新、刪除)操作。Laravel使這項工作變得輕鬆。只需建立一個控制器,Laravel就會自動提供所有CRUD操作的方法。您還可以為routes.php檔案中的所有方法註冊單個路由。

示例

步驟 1 − 執行以下命令建立一個名為MyController的控制器。

php artisan make:controller MyController

步驟 2 − 在以下檔案中新增以下程式碼:

app/Http/Controllers/MyController.php檔案。

app/Http/Controllers/MyController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class MyController extends Controller {
   public function index() {
      echo 'index';
   }
   public function create() {
      echo 'create';
   }
   public function store(Request $request) {
      echo 'store';
   }
   public function show($id) {
      echo 'show';
   }
   public function edit($id) {
      echo 'edit';
   }
   public function update(Request $request, $id) {
      echo 'update';
   }
   public function destroy($id) {
      echo 'destroy';
   }
}

步驟 3 − 在app/Http/routes.php檔案中新增以下程式碼行。

app/Http/routes.php

Route::resource('my','MyController');

步驟 4 − 我們現在透過使用resource註冊控制器來註冊MyController的所有方法。以下是資源控制器處理的操作表。

方法 路徑 動作 路由名稱
GET /my index my.index
GET /my/create create my.create
POST /my store my.store
GET /my/{my} show my.show
GET /my/{my}/edit edit my.edit
PUT/PATCH /my/{my} update my.update
DELETE /my/{my} destroy my.destroy

步驟 5 − 嘗試執行下表中顯示的URL。

URL 描述 輸出圖片
https://:8000/my 執行MyController.php的index方法 index
https://:8000/my/create 執行MyController.php的create方法 create
https://:8000/my/1 執行MyController.php的show方法 show
https://:8000/my/1/edit 執行MyController.php的edit方法 edit

隱式控制器

隱式控制器允許您定義單個路由來處理控制器中的每個操作。您可以使用如下所示的Route:controller方法在route.php檔案中定義它。

Route::controller(‘base URI’,’<class-name-of-the-controller>’);

將<class-name-of-the-controller>替換為您為控制器指定的類名。

控制器的方法名應以HTTP動詞(如get或post)開頭。如果以get開頭,它將只處理get請求;如果以post開頭,它將處理post請求。在HTTP動詞之後,您可以為方法命名,但它應遵循URI的標題大小寫版本。

示例

步驟 1 − 執行以下命令建立一個控制器。我們保留了類名ImplicitController。您可以隨意為類命名。

php artisan make:controller ImplicitController --plain

步驟 2 − 成功執行步驟1後,您將收到以下輸出:

Implicitcontroller

步驟 3 − 將以下程式碼複製到

app/Http/Controllers/ImplicitController.php檔案。

app/Http/Controllers/ImplicitController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class ImplicitController extends Controller {
   /**
      * Responds to requests to GET /test
   */
   public function getIndex() {
      echo 'index method';
   }
   
   /**
      * Responds to requests to GET /test/show/1
   */
   public function getShow($id) {
      echo 'show method';
   }
   
   /**
      * Responds to requests to GET /test/admin-profile
   */
   public function getAdminProfile() {
      echo 'admin profile method';
   }
   
   /**
      * Responds to requests to POST /test/profile
   */
   public function postProfile() {
      echo 'profile method';
   }
}

步驟 4 − 將以下程式碼行新增到app/Http/routes.php檔案,以將請求路由到指定的控制器。

app/Http/routes.php

Route::controller('test','ImplicitController');

建構函式注入

Laravel服務容器用於解析所有Laravel控制器。因此,您可以對控制器在其建構函式中可能需要的任何依賴項進行型別提示。依賴項將自動解析並注入到控制器例項中。

示例

步驟 1 − 將以下程式碼新增到app/Http/routes.php檔案。

app/Http/routes.php

class MyClass{
   public $foo = 'bar';
}
Route::get('/myclass','ImplicitController@index');

步驟 2 − 將以下程式碼新增到

app/Http/Controllers/ImplicitController.php檔案。

app/Http/Controllers/ImplicitController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class ImplicitController extends Controller {
   private $myclass;
   
   public function __construct(\MyClass $myclass) {
      $this->myclass = $myclass;
   }
   public function index() {
      dd($this->myclass);
   }
}

步驟 3 − 訪問以下URL以測試建構函式注入。

https://:8000/myclass

步驟 4 − 輸出將如下圖所示。

Myclass

方法注入

除了建構函式注入外,您還可以對控制器的操作方法進行型別提示依賴項。

示例

步驟 1 − 將以下程式碼新增到app/Http/routes.php檔案。

app/Http/routes.php

class MyClass{
   public $foo = 'bar';
}
Route::get('/myclass','ImplicitController@index');

步驟 2 − 將以下程式碼新增到

app/Http/Controllers/ImplicitController.php檔案。

app/Http/Controllers/ImplicitController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class ImplicitController extends Controller {
   public function index(\MyClass $myclass) {
      dd($myclass);
   }
} 

步驟 3 − 訪問以下URL以測試建構函式注入。

https://:8000/myclass

它將產生以下輸出:

Constructor Injection

Laravel - 請求

在本章中,您將詳細學習Laravel中的請求。

檢索請求URI

“path”方法用於檢索請求的URI。is方法用於檢索與方法引數中指定的特定模式匹配的請求URI。要獲取完整的URL,我們可以使用url方法。

示例

步驟 1 − 執行以下命令建立一個名為UriController的新控制器。

php artisan make:controller UriController –plain

步驟 2 − 成功執行URL後,您將收到以下輸出:

UriController

步驟 3 − 建立控制器後,在該檔案中新增以下程式碼。

app/Http/Controllers/UriController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class UriController extends Controller {
   
   public function index(Request $request) {
      // Usage of path method
      $path = $request->path();
      echo 'Path Method: '.$path;
      echo '<br>';
     
      // Usage of is method
      $pattern = $request->is('foo/*');
      echo 'is Method: '.$pattern;
      echo '<br>';
      
      // Usage of url method
      $url = $request->url();
      echo 'URL method: '.$url;
   }
}

步驟 4 − 在app/Http/route.php檔案中新增以下程式碼行。

app/Http/route.php

Route::get('/foo/bar','UriController@index');

步驟 5 − 訪問以下URL。

https://:8000/foo/bar

步驟 6 − 輸出將如下圖所示。

Path Method

檢索輸入

可以在Laravel中輕鬆檢索輸入值。無論使用的是“get”還是“post”方法,Laravel方法都將以相同的方式檢索這兩種方法的輸入值。我們可以透過兩種方式檢索輸入值。

  • 使用input()方法
  • 使用Request例項的屬性

使用input()方法

input()方法接受一個引數,即表單中欄位的名稱。例如,如果表單包含使用者名稱欄位,則可以透過以下方式訪問它。

$name = $request->input('username');

使用Request例項的屬性

input()方法類似,我們可以直接從請求例項中獲取username屬性。

$request->username

示例

觀察以下示例以瞭解更多關於請求的資訊:

步驟 1 − 建立一個登錄檔單,使用者可以在其中註冊自己,並將表單儲存在resources/views/register.php

<html>

   <head>
      <title>Form Example</title>
   </head>

   <body>
      <form action = "/user/register" method = "post">
         <input type = "hidden" name = "_token" value = "<?php echo csrf_token() ?>">
      
         <table>
            <tr>
               <td>Name</td>
               <td><input type = "text" name = "name" /></td>
            </tr>
            <tr>
               <td>Username</td>
               <td><input type = "text" name = "username" /></td>
            </tr>
            <tr>
               <td>Password</td>
               <td><input type = "text" name = "password" /></td>
            </tr>
            <tr>
               <td colspan = "2" align = "center">
                  <input type = "submit" value = "Register" />
               </td>
            </tr>
         </table>
      
      </form>
   </body>
</html>

步驟 2 − 執行以下命令建立一個UserRegistration控制器。

php artisan make:controller UserRegistration --plain

步驟 3 − 成功執行上述步驟後,您將收到以下輸出:

UserRegistration

步驟 4 − 將以下程式碼複製到

app/Http/Controllers/UserRegistration.php控制器。

app/Http/Controllers/UserRegistration.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class UserRegistration extends Controller {
   public function postRegister(Request $request) {
      //Retrieve the name input field
      $name = $request->input('name');
      echo 'Name: '.$name;
      echo '<br>';
      
      //Retrieve the username input field
      $username = $request->username;
      echo 'Username: '.$username;
      echo '<br>';
      
      //Retrieve the password input field
      $password = $request->password;
      echo 'Password: '.$password;
   }
}

步驟 5 − 在app/Http/routes.php檔案中新增以下程式碼行。

app/Http/routes.php

Route::get('/register',function() {
   return view('register');
});
Route::post('/user/register',array('uses'=>'UserRegistration@postRegister'));

步驟 6 − 訪問以下URL,您將看到如下圖所示的登錄檔單。鍵入註冊詳細資訊並單擊“註冊”,您將在第二頁看到我們已檢索並顯示的使用者註冊詳細資訊。

https://:8000/register

步驟 7 − 輸出將類似於以下圖片。

Registration

Laravel - Cookie

Cookie在處理Web應用程式上的使用者會話時起著重要作用。在本章中,您將學習如何在基於Laravel的Web應用程式中使用Cookie。

建立Cookie

Laravel 的全域性 Cookie 助手可以建立 Cookie。它是一個 **Symfony\Component\HttpFoundation\Cookie** 的例項。可以使用 withCookie() 方法將 Cookie 附加到響應中。建立一個 **Illuminate\Http\Response** 類的響應例項來呼叫 withCookie() 方法。Laravel 生成的 Cookie 是加密和簽名的,客戶端無法修改或讀取。

下面是一個帶有說明的示例程式碼。

//Create a response instance
$response = new Illuminate\Http\Response('Hello World');

//Call the withCookie() method with the response method
$response->withCookie(cookie('name', 'value', $minutes));

//return the response
return $response;

Cookie() 方法將接收 3 個引數。第一個引數是 Cookie 的名稱,第二個引數是 Cookie 的值,第三個引數是 Cookie 自動刪除之前的持續時間。

可以使用 forever 方法將 Cookie 設定為永久有效,如下面的程式碼所示。

$response->withCookie(cookie()->forever('name', 'value'));

檢索 Cookie

設定 Cookie 後,可以使用 cookie() 方法檢索 Cookie。此 cookie() 方法只接收一個引數,即 Cookie 的名稱。可以使用 **Illuminate\Http\Request** 例項呼叫 cookie 方法。

下面是一個示例程式碼。

//’name’ is the name of the cookie to retrieve the value of
$value = $request->cookie('name');

示例

觀察下面的例子,瞭解更多關於 Cookie 的資訊:

**步驟 1** - 執行以下命令建立一個控制器,我們將在其中操作 Cookie。

php artisan make:controller CookieController --plain

**步驟 2** − 成功執行後,您將收到以下輸出:

CookieController

**步驟 3** - 將以下程式碼複製到

**app/Http/Controllers/CookieController.php** 檔案中。

app/Http/Controllers/CookieController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Http\Response;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class CookieController extends Controller {
   public function setCookie(Request $request) {
      $minutes = 1;
      $response = new Response('Hello World');
      $response->withCookie(cookie('name', 'virat', $minutes));
      return $response;
   }
   public function getCookie(Request $request) {
      $value = $request->cookie('name');
      echo $value;
   }
}

**步驟 4** - 在 **app/Http/routes.php** 檔案中新增以下行。

app/Http/routes.php

Route::get('/cookie/set','CookieController@setCookie');
Route::get('/cookie/get','CookieController@getCookie');

**步驟 5** - 訪問以下 URL 來設定 Cookie。

https://:8000/cookie/set

**步驟 6** - 輸出將如下所示。截圖中的視窗來自 Firefox,但根據您的瀏覽器,也可以從 Cookie 選項中檢查 Cookie。

Hello World

**步驟 7** - 訪問以下 URL 從上面的 URL 獲取 Cookie。

https://:8000/cookie/get

**步驟 8** - 輸出將如下面的圖片所示。

Virat

Laravel - 響應

Web 應用程式根據許多引數以多種方式響應使用者的請求。本章詳細解釋了 Laravel Web 應用程式中的響應。

基本響應

Laravel 提供了幾種不同的返回響應方式。響應可以從路由或控制器傳送。可以傳送的基本響應是簡單的字串,如下面的示例程式碼所示。此字串將自動轉換為相應的 HTTP 響應。

示例

步驟 1 − 將以下程式碼新增到app/Http/routes.php檔案。

app/Http/routes.php

Route::get('/basic_response', function () {
   return 'Hello World';
});

**步驟 2** - **訪問**以下 URL 測試基本響應。

https://:8000/basic_response

**步驟 3** - 輸出將如下面的圖片所示。

Basic Response

附加標頭

可以使用 header() 方法將標頭附加到響應中。我們還可以附加一系列標頭,如下面的示例程式碼所示。

return response($content,$status)
   ->header('Content-Type', $type)
   ->header('X-Header-One', 'Header Value')
   ->header('X-Header-Two', 'Header Value');

示例

觀察下面的例子,瞭解更多關於響應的資訊:

步驟 1 − 將以下程式碼新增到app/Http/routes.php檔案。

app/Http/routes.php

Route::get('/header',function() {
   return response("Hello", 200)->header('Content-Type', 'text/html');
});

**步驟 2** - 訪問以下 URL 測試基本響應。

https://:8000/header

**步驟 3** - 輸出將如下面的圖片所示。

Hello

附加 Cookie

**withcookie()** 助手方法用於附加 Cookie。使用此方法生成的 Cookie 可以透過使用響應例項呼叫 **withcookie()** 方法來附加。預設情況下,Laravel 生成的所有 Cookie 都是加密和簽名的,因此客戶端無法修改或讀取它們。

示例

觀察下面的例子,瞭解更多關於附加 Cookie 的資訊:

步驟 1 − 將以下程式碼新增到app/Http/routes.php檔案。

app/Http/routes.php

Route::get('/cookie',function() {
   return response("Hello", 200)->header('Content-Type', 'text/html')
      ->withcookie('name','Virat Gandhi');
});

**步驟 2** - **訪問**以下 URL 測試基本響應。

https://:8000/cookie

**步驟 3** - 輸出將如下面的圖片所示。

Hello

JSON 響應

可以使用 json 方法傳送 JSON 響應。此方法會自動將 Content-Type 標頭設定為 **application/json**。**json** 方法會自動將陣列轉換為相應的 **json** 響應。

示例

觀察下面的例子,瞭解更多關於 JSON 響應的資訊:

**步驟 1** - 在 **app/Http/routes.php** 檔案中新增以下行。

app/Http/routes.php

Route::get('json',function() {
   return response()->json(['name' => 'Virat Gandhi', 'state' => 'Gujarat']);
});

**步驟 2** - 訪問以下 URL 測試 json 響應。

https://:8000/json

**步驟 3** - 輸出將如下面的圖片所示。

Json Response

Laravel - 檢視

在 MVC 框架中,字母 **“V”** 代表 **檢視**。它將應用程式邏輯和表示邏輯分開。檢視儲存在 **resources/views** 目錄中。通常,檢視包含應用程式將提供的 HTML。

示例

觀察下面的例子,瞭解更多關於檢視的資訊:

**步驟 1** - 複製以下程式碼並將其儲存到 **resources/views/test.php**

<html>
   <body>
      <h1>Hello, World</h1>
   </body>
</html>

**步驟 2** - 在 **app/Http/routes.php** 檔案中新增以下行,為上面的檢視設定路由。

app/Http/routes.php

Route::get('/test', function() {
   return view('test');
});

**步驟 3** - 訪問以下 URL 檢視檢視的輸出。

https://:8000/test

步驟 4 − 輸出將如下圖所示。

Understanding Views

向檢視傳遞資料

在構建應用程式時,可能需要向檢視傳遞資料。將陣列傳遞給檢視助手函式。傳遞陣列後,可以使用鍵在 HTML 檔案中獲取該鍵的值。

示例

觀察下面的例子,瞭解更多關於向檢視傳遞資料的資訊:

**步驟 1** - 複製以下程式碼並將其儲存到 **resources/views/test.php**

<html>
   <body>
      <h1><?php echo $name; ?></h1>
   </body>
</html>

**步驟 2** - 在 **app/Http/routes.php** 檔案中新增以下行,為上面的檢視設定路由。

app/Http/routes.php

Route::get('/test', function() {
   return view('test',[‘name’=>’Virat Gandhi’]);
});

**步驟 3** - 鍵名的值將傳遞給 test.php 檔案,$name 將被該值替換。

**步驟 4** - 訪問以下 URL 檢視檢視的輸出。

https://:8000/test

**步驟 5** - 輸出將如下面的圖片所示。

Virat Gandhi

與所有檢視共享資料

我們已經瞭解瞭如何向檢視傳遞資料,但有時需要向所有檢視傳遞資料。Laravel 使這變得更簡單。有一種稱為 **share()** 的方法可用於此目的。**share()** 方法將接收兩個引數,鍵和值。通常,可以在服務提供者的 boot 方法中呼叫 **share()** 方法。我們可以使用任何服務提供者,**AppServiceProvider** 或我們自己的服務提供者。

示例

觀察下面的例子,瞭解更多關於與所有檢視共享資料的資訊:

**步驟 1** - 在 **app/Http/routes.php** 檔案中新增以下行。

app/Http/routes.php

Route::get('/test', function() {
   return view('test');
});

Route::get('/test2', function() {
   return view('test2');
});

**步驟 2** - 建立兩個檢視檔案 - **test.php** 和 **test2.php**,程式碼相同。這兩個檔案將共享資料。將以下程式碼複製到這兩個檔案中。**resources/views/test.php & resources/views/test2.php**

<html>
   <body>
      <h1><?php echo $name; ?></h1>
   </body>
</html>

**步驟 3** - 更改 **app/Providers/AppServiceProvider.php** 檔案中 boot 方法的程式碼,如下所示。(這裡,我們使用了 share 方法,我們傳遞的資料將與所有檢視共享。)**app/Providers/AppServiceProvider.php**

<?php

namespace App\Providers;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider {
   
   /**
      * Bootstrap any application services.
      *
      * @return void
   */

   public function boot() {
      view()->share('name', 'Virat Gandhi');
   }

   /**
      * Register any application services.
      *
      * @return void
   */

   public function register() {
      //
   }
}

**步驟 4** - **訪問**以下 URL。

https://:8000/test
https://:8000/test2

**步驟 5** - 輸出將如下面的圖片所示。

Virat Gandhi

Laravel - Blade 模板

Laravel 5.1 引入了使用 **Blade**(一個模板引擎)設計獨特佈局的概念。這樣設計的佈局可以被其他檢視使用,幷包含一致的設計和結構。

與其他模板引擎相比,Blade 在以下方面是獨一無二的:

  • 它不限制開發人員在檢視中使用純 PHP 程式碼。

  • 這樣設計的 Blade 檢視會被編譯和快取,直到它們被修改。

Welcome Blade

此處給出的螢幕截圖顯示了 Laravel 的完整目錄結構。

您可以觀察到所有檢視都儲存在 **resources/views** 目錄中,Laravel 框架的預設檢視是 **welcome.blade.php**。

請注意,其他 Blade 模板也是類似建立的。

建立 Blade 模板佈局的步驟

您必須使用以下步驟建立 Blade 模板佈局:

步驟 1

  • 在 **resources/views** 資料夾內建立一個 layout 資料夾。我們將使用此資料夾將所有佈局儲存在一起。

  • 建立一個名為 **master.blade.php** 的檔案,該檔案將包含與其關聯的以下程式碼:

<html>
   <head>
      <title>DemoLaravel - @yield('title')</title>
   </head>
   <body>
      @yield('content')
   </body>
</html>

步驟 2

在此步驟中,您應該擴展布局。擴展布局包括定義子元素。Laravel 使用 **Blade @extends** 指令來定義子元素。

擴展布局時,請注意以下幾點:

  • 在 Blade 佈局中定義的檢視以獨特的方式注入容器。

  • 檢視的各個部分被建立為子元素。

  • 子元素儲存在 layouts 資料夾中,名為 **child.blade.php**

此處顯示了一個顯示擴充套件上面建立的佈局的示例:

@extends('layouts.app')
@section('title', 'Page Title')
@section('sidebar')
   @parent
<p>This refers to the master sidebar.</p>
@endsection
@section('content')
<p>This is my body content.</p>
@endsection

步驟 3

要在檢視中實現子元素,您應該根據需要定義佈局。

Landing Page

觀察此處顯示的螢幕截圖。您可以發現登入頁面中提到的每個連結都是超連結。請注意,您還可以使用上面給出的步驟,使用 Blade 模板將它們建立為子元素。

Laravel - 重定向

命名路由用於為路由指定特定名稱。可以使用 **“as”** 陣列鍵分配名稱。

Route::get('user/profile', ['as' => 'profile', function () {
   //
}]);

**注意** - 在這裡,我們將名稱 **profile** 分配給路由 **user/profile**。

重定向到命名路由

示例

觀察下面的例子,瞭解更多關於重定向到命名路由的資訊:

**步驟 1** - 建立一個名為 test.php 的檢視,並將其儲存到

resources/views/test.php.

<html>
   <body>
      <h1>Example of Redirecting to Named Routes</h1>
   </body>
</html>

**步驟 2** - 在 **routes.php** 中,我們為 **test.php** 檔案設定了路由。我們將其重新命名為 **testing**。我們還設定了另一個路由 **redirect**,它將請求重定向到命名路由 **testing**。

app/Http/routes.php

Route::get('/test', ['as'=>'testing',function() {
   return view('test2');
}]);

Route::get('redirect',function() {
   return redirect()->route('testing');
});

**步驟 3** - 訪問以下 URL 測試命名路由示例。

https://:8000/redirect

**步驟 4** - 執行上述 URL 後,您將被重定向到 https://:8000/test,因為我們正在重定向到命名路由 **testing**。

**步驟 5** - 成功執行 URL 後,您將收到以下輸出:

Virat Gandhi

重定向到控制器操作

不僅是命名路由,我們還可以重定向到控制器操作。我們只需要簡單地將控制器和 **action** 的名稱傳遞給 action 方法,如下面的示例所示。如果要傳遞引數,可以將其作為 action 方法的第二個引數傳遞。

return redirect()->action(‘NameOfController@methodName’,[parameters]);

示例

**步驟 1** - 執行以下命令建立一個名為 **RedirectController** 的控制器。

php artisan make:controller RedirectController --plain

**步驟 2** − 成功執行後,您將收到以下輸出:

Redirect Controller

**步驟 3** - 將以下程式碼複製到檔案

app/Http/Controllers/RedirectController.php.

app/Http/Controllers/RedirectController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class RedirectController extends Controller {
   public function index() {
      echo "Redirecting to controller's action.";
   }
}

**步驟 4** - 在 **app/Http/routes.php** 中新增以下行。

app/Http/routes.php

Route::get('rr','RedirectController@index');
Route::get('/redirectcontroller',function() {
   return redirect()->action('RedirectController@index');
});

**步驟 5** - 訪問以下 URL 測試示例。

https://:8000/redirectcontroller

步驟 6 − 輸出將如下圖所示。

RedirectController.jpg

Laravel - 資料庫操作

Laravel 使資料庫處理變得非常容易。Laravel 目前支援以下 4 個數據庫:

  • MySQL
  • Postgres
  • SQLite
  • SQL Server

可以使用原始 SQL、流暢查詢構建器和 Eloquent ORM 向資料庫發出查詢。為了理解 Laravel 的所有 CRUD(建立、讀取、更新、刪除)操作,我們將使用簡單的學生管理系統。

連線到資料庫

在 **config/database.php** 檔案中配置資料庫,並在 MySQL 中建立如下表所示的 college 資料庫和結構。

資料庫:College

表:student

列名 列資料型別 額外
Id int(11) 主鍵 | 自動遞增
Name varchar(25)

我們將瞭解如何在學生表中使用 Laravel 從資料庫新增、刪除、更新和檢索記錄。

序號 記錄和描述
1 插入記錄

我們可以使用 DB facade 和 insert 方法插入記錄。

2 檢索記錄

配置資料庫後,我們可以使用 DB facade 和 select 方法檢索記錄。

3 更新記錄

我們可以使用 DB facade 和 update 方法更新記錄。

4 刪除記錄

我們可以使用 DB facade 和 delete 方法刪除記錄。

Laravel - 錯誤和日誌記錄

本章介紹 Laravel 專案中的錯誤和日誌記錄以及如何處理它們。

錯誤

一個正在進行的專案,註定會有一些錯誤。當您啟動一個新的 Laravel 專案時,錯誤和異常處理已經為您配置好了。通常,在本地環境中,我們需要檢視錯誤以進行除錯。我們需要在生產環境中向用戶隱藏這些錯誤。這可以透過在應用程式根目錄中儲存的環境檔案 **.env** 中設定變數 **APP_DEBUG** 來實現。

對於本地環境,**APP_DEBUG** 的值應為 **true**,但對於生產環境,應將其設定為 **false** 以隱藏錯誤。

**注意** - 更改 **APP_DEBUG** 變數後,應重新啟動 Laravel 伺服器。

日誌記錄

日誌記錄是一種重要的機制,系統可以透過它記錄生成的錯誤。它有助於提高系統的可靠性。Laravel 支援不同的日誌記錄模式,例如單一模式、每日模式、syslog 模式和 errorlog 模式。您可以在 **config/app.php** 檔案中設定這些模式。

'log' => 'daily'

您可以在 **storage/logs/laravel.log** 檔案中檢視生成的日誌條目。

Laravel - 表單

Laravel 提供了各種內建標籤,可以輕鬆安全地處理 HTML 表單。所有主要的 HTML 元素都是使用 Laravel 生成的。為此,我們需要使用 composer 將 HTML 包新增到 Laravel。

示例 1

**步驟 1** − 執行以下命令來繼續。

composer require illuminate/html

**步驟 2** − 這將新增 HTML 包到 Laravel,如下面的圖片所示。

HTML Package

**步驟 3** − 現在,我們需要將上面顯示的包新增到 Laravel 配置檔案,該檔案儲存在 **config/app.php** 中。開啟此檔案,您將看到 Laravel 服務提供程式的列表,如下面的圖片所示。在下面的圖片中,按照帶框的指示新增 HTML 服務提供程式。

Laravel Service

**步驟 4** − 在同一檔案中為 HTML 和 Form 新增別名。請注意下圖中帶框的兩行,並新增這兩行。

Outlined Box

**步驟 5** − 現在一切設定完畢。讓我們看看如何使用 Laravel 標籤使用各種 HTML 元素。

開啟表單

{{ Form::open(array('url' => 'foo/bar')) }}
   //
{{ Form::close() }}

生成標籤元素

echo Form::label('email', 'E-Mail Address');

生成文字輸入

echo Form::text('username');

指定預設值

echo Form::text('email', 'example@gmail.com');

生成密碼輸入

echo Form::password('password');

生成檔案輸入

echo Form::file('image');

生成複選框或單選按鈕輸入

echo Form::checkbox('name', 'value');
echo Form::radio('name', 'value');

生成選中的複選框或單選按鈕輸入

echo Form::checkbox('name', 'value', true);
echo Form::radio('name', 'value', true);

生成下拉列表

echo Form::select('size', array('L' => 'Large', 'S' => 'Small'));

生成提交按鈕

echo Form::submit('Click Me!');

示例 2

**步驟 1** − 複製以下程式碼以建立一個名為

resources/views/form.php 的檢視.

resources/views/form.php 的檢視

<html>
   <body>
      
      <?php
         echo Form::open(array('url' => 'foo/bar'));
            echo Form::text('username','Username');
            echo '<br/>';
            
            echo Form::text('email', 'example@gmail.com');
            echo '<br/>';
     
            echo Form::password('password');
            echo '<br/>';
            
            echo Form::checkbox('name', 'value');
            echo '<br/>';
            
            echo Form::radio('name', 'value');
            echo '<br/>';
            
            echo Form::file('image');
            echo '<br/>';
            
            echo Form::select('size', array('L' => 'Large', 'S' => 'Small'));
            echo '<br/>';
            
            echo Form::submit('Click Me!');
         echo Form::close();
      ?>
   
   </body>
</html>

**步驟 2** − 在 **app/Http/routes.php** 中新增以下行,以新增 form.php 檢視的路由。

app/Http/routes.php

Route::get('/form',function() {
   return view('form');
});

**步驟 3** − 訪問以下 URL 以查看錶單。

https://:8000/form

步驟 4 − 輸出將如下圖所示。

View Form

Laravel - 本地化

Laravel 的本地化功能支援在應用程式中使用不同的語言。您需要將所有不同語言的字串儲存在一個檔案中,這些檔案儲存在 **resources/views** 目錄中。您應該為每種受支援的語言建立一個單獨的目錄。所有語言檔案都應返回如下所示的鍵值字串陣列。

<?php
return [
   'welcome' => 'Welcome to the application'
];

示例

**步驟 1** − 為語言建立 3 個檔案 - **英語、法語** 和 **德語**。將英語檔案儲存在 **resources/lang/en/lang.php**

<?php
   return [
      'msg' => 'Laravel Internationalization example.'
   ];
?>

**步驟 2** − 將法語檔案儲存在 **resources/lang/fr/lang.php**。

<?php
   return [
      'msg' => 'Exemple Laravel internationalisation.'
   ];
?>

**步驟 3** − 將德語檔案儲存在 **resources/lang/de/lang.php**。

<?php
   return [
      'msg' => 'Laravel Internationalisierung Beispiel.' 
   ];
?>

**步驟 4** − 透過執行以下命令建立一個名為 **LocalizationController** 的控制器。

php artisan make:controller LocalizationController --plain

**步驟 5** − 成功執行後,您將收到以下輸出:

LocalizationController

**步驟 6** − 將以下程式碼複製到檔案

app/Http/Controllers/LocalizationController.php

app/Http/Controllers/LocalizationController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class LocalizationController extends Controller {
   public function index(Request $request,$locale) {
      //set’s application’s locale
      app()->setLocale($locale);
      
      //Gets the translated message and displays it
      echo trans('lang.msg');
   }
}

**步驟 7** − 在 **app/Http/routes.php** 檔案中為 LocalizationController 新增路由。請注意,我們在 localization/ 後面傳遞了 {locale} 引數,我們將使用它來檢視不同語言的輸出。

app/Http/routes.php

Route::get('localization/{locale}','LocalizationController@index');

**步驟 8** − 現在,讓我們訪問不同的 URL 來檢視所有不同的語言。執行以下 URL 以檢視英文輸出。

https://:8000/localization/en

**步驟 9** − 輸出將如下面的圖片所示。

Laravel Internationalization

**步驟 10** − 執行以下 URL 以檢視法語輸出。

https://:8000/localization/fr

步驟 11 − 輸出將如下圖所示。

French Example

**步驟 12** − 執行以下 URL 以檢視德語輸出

https://:8000/localization/de

**步驟 13** − 輸出將如下面的圖片所示。

German Example

Laravel - Session

會話用於跨請求儲存有關使用者的資訊。Laravel 提供了各種驅動程式,例如 **file、cookie、apc、array、Memcached、Redis** 和 **database** 來處理會話資料。預設情況下使用檔案驅動程式,因為它很輕量級。會話可以在儲存在 **config/session.php** 中的檔案中進行配置。

訪問會話資料

要訪問會話資料,我們需要一個會話例項,可以透過 HTTP 請求訪問。獲取例項後,我們可以使用 **get()** 方法,它將接受一個引數 **“key”** 來獲取會話資料。

$value = $request->session()->get('key');

您可以使用 **all()** 方法獲取所有會話資料,而不是 **get()** 方法。

儲存會話資料

可以使用 **put()** 方法將資料儲存在會話中。**put()** 方法將接受兩個引數:“鍵”和“值”。

$request->session()->put('key', 'value');

刪除會話資料

**forget()** 方法用於從會話中刪除專案。此方法將採用 **“key”** 作為引數。

$request->session()->forget('key');

使用 **flush()** 方法代替 **forget()** 方法刪除所有會話資料。使用 **pull()** 方法從會話中檢索資料並在之後刪除它。pull() 方法也將採用 **key** 作為引數。**forget()** 方法和 **pull()** 方法的區別在於 **forget()** 方法不會返回會話的值,而 **pull()** 方法會返回它並從會話中刪除該值。

示例

**步驟 1** − 透過執行以下命令建立一個名為 **SessionController** 的控制器。

php artisan make:controller SessionController --plain

**步驟 2** − 成功執行後,您將收到以下輸出:

SessionController

**步驟 3** − 將以下程式碼複製到檔案

app/Http/Controllers/SessionController.php。

app/Http/Controllers/SessionController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class SessionController extends Controller {
   public function accessSessionData(Request $request) {
      if($request->session()->has('my_name'))
         echo $request->session()->get('my_name');
      else
         echo 'No data in the session';
   }
   public function storeSessionData(Request $request) {
      $request->session()->put('my_name','Virat Gandhi');
      echo "Data has been added to session";
   }
   public function deleteSessionData(Request $request) {
      $request->session()->forget('my_name');
      echo "Data has been removed from session.";
   }
}

**步驟 4** − 在 **app/Http/routes.php** 檔案中新增以下幾行。

app/Http/routes.php

Route::get('session/get','SessionController@accessSessionData');
Route::get('session/set','SessionController@storeSessionData');
Route::get('session/remove','SessionController@deleteSessionData');

**步驟 5** − 訪問以下 URL **在會話中設定資料**。

https://:8000/session/set

步驟 6 − 輸出將如下圖所示。

Data in Session

**步驟 7** − 訪問以下 URL **從會話中獲取資料**。

https://:8000/session/get

**步驟 8** - 輸出將如下面的圖片所示。

Virat Gandhi

**步驟 9** − 訪問以下 URL **刪除會話資料**。

https://:8000/session/remove

**步驟 10** − 您將看到如下面的圖片所示的訊息。

Session

Laravel - 驗證

在設計應用程式時,驗證是最重要的方面。它驗證傳入的資料。預設情況下,基本控制器類使用 **ValidatesRequests** 特性,該特性提供了一種方便的方法來使用各種強大的驗證規則來驗證傳入的 HTTP 請求。

Laravel 中可用的驗證規則

Laravel 將始終檢查會話資料中的錯誤,如果可用,則會自動將其繫結到檢視。因此,重要的是要注意,在每次請求中,所有檢視中始終可以使用 **$errors** 變數,允許您方便地假設 **$errors** 變數始終已定義並且可以安全地使用。下表顯示了 Laravel 中所有可用的驗證規則。

Laravel 中可用的驗證規則
已接受 活動URL 之後(日期)
字母 字母和短橫線 字母數字
陣列 之前(日期) 介於之間
布林值 已確認 日期
日期格式 不同 位數
位數介於之間 電子郵件 存在(資料庫)
影像(檔案) 在…之中 整數
IP 地址 JSON 最大值
MIME 型別(檔案) 最小值 不在…之中
數字 正則表示式 必需
如果需要 除非需要 與…一起需要
與所有一起需要 無需… 無需所有…
相同 大小 字串
時區 唯一(資料庫) URL

**$errors** 變數將是 **Illuminate\Support\MessageBag** 的例項。錯誤訊息可以透過新增如下所示的程式碼在檢視檔案中顯示。

@if (count($errors) > 0)
   <div class = "alert alert-danger">
      <ul>
         @foreach ($errors->all() as $error)
            <li>{{ $error }}</li>
         @endforeach
      </ul>
   </div>
@endif

示例

**步驟 1** − 透過執行以下命令建立一個名為 **ValidationController** 的控制器。

php artisan make:controller ValidationController --plain

**步驟 2** − 成功執行後,您將收到以下輸出:

ValidationController

**步驟 3** - 將以下程式碼複製到

**app/Http/Controllers/ValidationController.php** 檔案。

app/Http/Controllers/ValidationController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class ValidationController extends Controller {
   public function showform() {
      return view('login');
   }
   public function validateform(Request $request) {
      print_r($request->all());
      $this->validate($request,[
         'username'=>'required|max:8',
         'password'=>'required'
      ]);
   }
}

**步驟 4** − 建立一個名為 **resources/views/login.blade.php** 的檢視檔案,並將以下程式碼複製到該檔案中。

resources/views/login.blade.php

<html>
   
   <head>
      <title>Login Form</title>
   </head>

   <body>
      
      @if (count($errors) > 0)
         <div class = "alert alert-danger">
            <ul>
               @foreach ($errors->all() as $error)
                  <li>{{ $error }}</li>
               @endforeach
            </ul>
         </div>
      @endif
      
      <?php
         echo Form::open(array('url'=>'/validation'));
      ?>
      
      <table border = '1'>
         <tr>
            <td align = 'center' colspan = '2'>Login</td>
         </tr>
         <tr>
            <td>Username</td>
            <td><?php echo Form::text('username'); ?></td>
         </tr>
         <tr>
            <td>Password</td>
            <td><?php echo Form::password('password'); ?></td>
         </tr>
         <tr>
            <td align = 'center' colspan = '2'
               ><?php echo Form::submit('Login'); ?  ></td>
         </tr>
      </table>
      
      <?php
         echo Form::close();
      ?>
   
   </body>
</html>

**步驟 5** − 在 **app/Http/routes.php** 中新增以下幾行。

app/Http/routes.php

Route::get('/validation','ValidationController@showform');
Route::post('/validation','ValidationController@validateform');

**步驟 6** − 訪問以下 URL 以測試驗證。

https://:8000/validation

**步驟 7** − 單擊 **“登入”** 按鈕,無需在文字欄位中輸入任何內容。輸出將如下面的圖片所示。

Login

Laravel - 檔案上傳

在 Laravel 中上傳檔案非常容易。我們只需要建立一個使用者可以選擇要上傳的檔案的檢視檔案,以及一個將處理上傳檔案的控制器。

在檢視檔案中,我們需要透過新增以下程式碼行來生成檔案輸入。

Form::file('file_name');

在 Form::open() 中,我們需要新增 **‘files’=>’true’**,如下所示。這使得表單可以分多部分上傳。

Form::open(array('url' => '/uploadfile','files'=>'true'));

示例

**步驟 1** − 建立一個名為 **resources/views/uploadfile.php** 的檢視檔案,並將以下程式碼複製到該檔案中。

resources/views/uploadfile.php

<html>
   <body>
      <?php
         echo Form::open(array('url' => '/uploadfile','files'=>'true'));
         echo 'Select the file to upload.';
         echo Form::file('image');
         echo Form::submit('Upload File');
         echo Form::close();
      ?>
   </body>
</html>

**步驟 2** − 透過執行以下命令建立一個名為 **UploadFileController** 的控制器。

php artisan make:controller UploadFileController --plain

**步驟 3** − 成功執行後,您將收到以下輸出:

UploadFileController

步驟 4 − 將以下程式碼複製到

**app/Http/Controllers/UploadFileController.php** 檔案。

app/Http/Controllers/UploadFileController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class UploadFileController extends Controller {
   public function index() {
      return view('uploadfile');
   }
   public function showUploadFile(Request $request) {
      $file = $request->file('image');
   
      //Display File Name
      echo 'File Name: '.$file->getClientOriginalName();
      echo '<br>';
   
      //Display File Extension
      echo 'File Extension: '.$file->getClientOriginalExtension();
      echo '<br>';
   
      //Display File Real Path
      echo 'File Real Path: '.$file->getRealPath();
      echo '<br>';
   
      //Display File Size
      echo 'File Size: '.$file->getSize();
      echo '<br>';
   
      //Display File Mime Type
      echo 'File Mime Type: '.$file->getMimeType();
   
      //Move Uploaded File
      $destinationPath = 'uploads';
      $file->move($destinationPath,$file->getClientOriginalName());
   }
}

**步驟 5** − 在 **app/Http/routes.php** 中新增以下幾行。

app/Http/routes.php

Route::get('/uploadfile','UploadFileController@index');
Route::post('/uploadfile','UploadFileController@showUploadFile');

**步驟 6** − 訪問以下 URL 以測試上傳檔案功能。

https://:8000/uploadfile

**步驟 7** − 您將收到如下面的圖片所示的提示。

Browse File

Laravel - 傳送郵件

Laravel 使用功能豐富的免費庫 **SwiftMailer** 傳送電子郵件。使用庫函式,我們可以輕鬆地傳送電子郵件,而無需太多麻煩。電子郵件模板的載入方式與檢視相同,這意味著您可以使用 Blade 語法並將資料注入到模板中。

下表顯示了 **send** 函式的語法和屬性:

語法 void send(string|array $view, array $data, Closure|string $callback)
引數
  • $view(string|array) − 包含電子郵件訊息的檢視的名稱

  • $data(array) − 要傳遞給檢視的資料陣列

  • $callback − 一個 Closure 回撥,它接收訊息例項,允許您自定義收件人、主題以及郵件訊息的其他方面

返回值
描述 傳送電子郵件。

在第三個引數中,$callback closure 接收訊息例項,並使用該例項,我們還可以呼叫以下函式並更改訊息,如下所示。

  • $message → subject('歡迎來到 Tutorials Point');
  • $message → from('email@example.com', 'Mr. Example');
  • $message → to('email@example.com', 'Mr. Example');

一些不太常用的方法包括:

  • $message → sender('email@example.com', 'Mr. Example');
  • $message → returnPath('email@example.com');
  • $message → cc('email@example.com', 'Mr. Example');
  • $message → bcc('email@example.com', 'Mr. Example');
  • $message → replyTo('email@example.com', 'Mr. Example');
  • $message → priority(2);

要附加或嵌入檔案,您可以使用以下方法:

  • $message → attach('path/to/attachment.txt');
  • $message → embed('path/to/attachment.jpg');

郵件可以作為 HTML 或文字傳送。您可以透過傳遞如下所示的陣列,在第一個引數中指示要傳送的郵件型別。預設型別為 HTML。如果要傳送純文字郵件,請使用以下語法。

語法

Mail::send([‘text’=>’text.view’], $data, $callback);

在此語法中,第一個引數採用陣列。使用 **text** 作為檢視的鍵名作為鍵的值。

示例

**步驟 1** − 我們現在將從 Gmail 帳戶傳送電子郵件,為此,您需要在 Laravel 環境檔案 **-.env** 檔案中配置您的 Gmail 帳戶。在您的 Gmail 帳戶中啟用 2 步驗證,並建立一個特定於應用程式的密碼,然後更改 .env 引數,如下所示。

.env

MAIL_DRIVER = smtp
MAIL_HOST = smtp.gmail.com
MAIL_PORT = 587
MAIL_USERNAME = your-gmail-username
MAIL_PASSWORD = your-application-specific-password
MAIL_ENCRYPTION = tls

**步驟 2** − 更改 **.env** 檔案後,執行以下兩個命令以清除快取並重新啟動 Laravel 伺服器。

php artisan config:cache

**步驟 3** − 透過執行以下命令建立一個名為 **MailController** 的控制器。

php artisan make:controller MailController --plain

**步驟 4** − 成功執行後,您將收到以下輸出:

MailController

**步驟 5** − 將以下程式碼複製到

**app/Http/Controllers/MailController.php** 檔案。

app/Http/Controllers/MailController.php

<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Mail;

use App\Http\Requests;
use App\Http\Controllers\Controller;

class MailController extends Controller {
   public function basic_email() {
      $data = array('name'=>"Virat Gandhi");
   
      Mail::send(['text'=>'mail'], $data, function($message) {
         $message->to('abc@gmail.com', 'Tutorials Point')->subject
            ('Laravel Basic Testing Mail');
         $message->from('xyz@gmail.com','Virat Gandhi');
      });
      echo "Basic Email Sent. Check your inbox.";
   }
   public function html_email() {
      $data = array('name'=>"Virat Gandhi");
      Mail::send('mail', $data, function($message) {
         $message->to('abc@gmail.com', 'Tutorials Point')->subject
            ('Laravel HTML Testing Mail');
         $message->from('xyz@gmail.com','Virat Gandhi');
      });
      echo "HTML Email Sent. Check your inbox.";
   }
   public function attachment_email() {
      $data = array('name'=>"Virat Gandhi");
      Mail::send('mail', $data, function($message) {
         $message->to('abc@gmail.com', 'Tutorials Point')->subject
            ('Laravel Testing Mail with Attachment');
         $message->attach('C:\laravel-master\laravel\public\uploads\image.png');
         $message->attach('C:\laravel-master\laravel\public\uploads\test.txt');
         $message->from('xyz@gmail.com','Virat Gandhi');
      });
      echo "Email Sent with attachment. Check your inbox.";
   }
}

**步驟 6** − 將以下程式碼複製到 **resources/views/mail.blade.php** 檔案。

resources/views/mail.blade.php

<h1>Hi, {{ $name }}</h1>
l<p>Sending Mail from Laravel.</p>

**步驟 7** − 在 **app/Http/routes.php** 中新增以下幾行。

app/Http/routes.php

Route::get('sendbasicemail','MailController@basic_email');
Route::get('sendhtmlemail','MailController@html_email');
Route::get('sendattachmentemail','MailController@attachment_email');

**步驟 8** − 訪問以下 URL 以測試基本電子郵件。

https://:8000/sendbasicemail

**步驟 9** − 輸出螢幕將如下所示。檢查您的收件箱以檢視基本電子郵件輸出。

Basic Email Sent

**步驟 10** − 訪問以下 URL 以測試 HTML 電子郵件。

https://:8000/sendhtmlemail

**步驟 11** − 輸出螢幕將如下所示。檢查您的收件箱以檢視 html 電子郵件輸出。

HTML Email

**步驟 12** − 訪問以下 URL 以測試帶有附件的 HTML 電子郵件。

https://:8000/sendattachmentemail

**步驟 13** − 您可以看到以下輸出

Email Sent

注意 − 在MailController.php檔案中,from方法中的電子郵件地址應為您可以傳送電子郵件的地址。通常,它應該是您伺服器上配置的電子郵件地址。

Laravel - Ajax

Ajax(非同步JavaScript和XML)是一套Web開發技術,它利用客戶端使用的許多Web技術來建立非同步Web應用程式。在您的檢視檔案中匯入jquery庫以使用jquery的ajax函式,這些函式將用於使用ajax從伺服器傳送和接收資料。在伺服器端,您可以使用response()函式向客戶端傳送響應,並使用json()函式連結response函式以JSON格式傳送響應。

json() 函式語法

json(string|array $data = array(), int $status = 200, array $headers = array(), int $options)

示例

步驟1 − 建立一個名為resources/views/message.php的檢視檔案,並將以下程式碼複製到該檔案中。

<html>
   <head>
      <title>Ajax Example</title>
      
      <script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js">
      </script>
      
      <script>
         function getMessage() {
            $.ajax({
               type:'POST',
               url:'/getmsg',
               data:'_token = <?php echo csrf_token() ?>',
               success:function(data) {
                  $("#msg").html(data.msg);
               }
            });
         }
      </script>
   </head>
   
   <body>
      <div id = 'msg'>This message will be replaced using Ajax. 
         Click the button to replace the message.</div>
      <?php
         echo Form::button('Replace Message',['onClick'=>'getMessage()']);
      ?>
   </body>

</html>

步驟2 − 透過執行以下命令建立一個名為AjaxController的控制器。

php artisan make:controller AjaxController --plain

**步驟 3** − 成功執行後,您將收到以下輸出:

AjaxController

步驟 4 − 將以下程式碼複製到

app/Http/Controllers/AjaxController.php 檔案。

app/Http/Controllers/AjaxController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class AjaxController extends Controller {
   public function index() {
      $msg = "This is a simple message.";
      return response()->json(array('msg'=> $msg), 200);
   }
}

**步驟 5** − 在 **app/Http/routes.php** 中新增以下幾行。

app/Http/routes.php

Route::get('ajax',function() {
   return view('message');
});
Route::post('/getmsg','AjaxController@index');

步驟6 − 訪問以下URL以測試Ajax功能。

https://:8000/ajax

步驟7 − 您將被重定向到一個頁面,您將在其中看到如下所示的訊息。

Replace Message

步驟8 − 單擊按鈕後,輸出將如下所示。

Simple Message

Laravel - 錯誤處理

大多數Web應用程式都有特定的錯誤處理機制。利用這些機制,它們可以跟蹤錯誤和異常,並將它們記錄下來以分析效能。在本節中,您將閱讀有關Laravel應用程式中錯誤處理的內容。

重要提示

在進一步詳細瞭解Laravel中的錯誤處理之前,請注意以下重要事項:

  • 對於任何新專案,Laravel預設情況下在App\Exceptions\Handler類中記錄錯誤和異常。然後將它們提交回使用者進行分析。

  • 當您的Laravel應用程式設定為除錯模式時,每個在您的Web應用程式中發生的錯誤都會顯示包含堆疊跟蹤的詳細錯誤訊息。

Error Log
  • 預設情況下,除錯模式設定為false,您可以將其更改為true。這使使用者能夠使用堆疊跟蹤跟蹤所有錯誤。

App Debug
  • Laravel專案的配置包括debug選項,該選項確定向用戶顯示有關錯誤的資訊量。在Web應用程式中,預設情況下,該選項設定為.env檔案中環境變數中定義的值。

    • 該值在本地開發環境中設定為true,在生產環境中設定為false

    • 如果在生產環境中將該值設定為true,則與終端使用者共享敏感資訊的風險更高。

錯誤日誌

在Web應用程式中記錄錯誤有助於跟蹤它們並規劃刪除它們的策略。可以在config/app.php檔案中配置Web應用程式中的日誌資訊。處理Laravel中的錯誤日誌時,請注意以下幾點:

  • Laravel使用monolog PHP日誌記錄庫。

  • 用於錯誤跟蹤的日誌記錄引數為single、daily、syslogerrorlog

  • 例如,如果您希望將錯誤訊息記錄到日誌檔案中,則應將應用程式配置中的log值設定為daily,如下面的命令所示:

'log' => env('APP_LOG',’daily’),
  • 如果將daily日誌模式作為引數,Laravel預設情況下會保留5天的錯誤日誌。如果您希望更改日誌檔案的最大數量,則必須將配置檔案中的log_max_files引數設定為所需的值。

‘log_max_files’ => 25;

嚴重性級別

由於Laravel使用monolog PHP日誌記錄庫,因此有各種引數用於分析嚴重性級別。可用的各種嚴重性級別包括error、critical、alertemergency訊息。您可以設定嚴重性級別,如下面的命令所示:

'log_level' => env('APP_LOG_LEVEL', 'error')

Laravel - 事件處理

事件提供了一個簡單的觀察者實現,允許使用者訂閱和監聽Web應用程式中觸發的各種事件。Laravel中的所有事件類都儲存在app/Events資料夾中,監聽器儲存在app/Listeners資料夾中。

在Web應用程式中生成事件和監聽器的artisan命令如下所示:

php artisan event:generate

此命令將事件和監聽器生成到上面討論的各個資料夾中。

Event Generator

事件和監聽器為解耦Web應用程式提供了一種很好的方法,因為一個事件可以有多個相互獨立的監聽器。artisan命令建立的events資料夾包含以下兩個檔案:event.php和SomeEvent.php。它們顯示如下:

Event.php

<?php
namespace App\Events;
abstract class Event{
   //
}

如上所述,event.php包含類Event的基本定義,並呼叫名稱空間App\Events。請注意,使用者定義的或自定義事件在此檔案中建立。

SomeEvent.php

<?php

namespace App\Events;

use App\Events\Event;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class SomeEvent extends Event{
   use SerializesModels;
   /**
      * Create a new event instance.
      *
      * @return void
   */
   
   public function __construct() {
      //
   }
   
   /**
      * Get the channels the event should be broadcast on.
      *
      * @return array
   */
   
   public function broadcastOn() {
      return [];
   }
}

請注意,此檔案使用序列化來廣播Web應用程式中的事件,並且此檔案中也初始化了必要的引數。

例如,如果我們需要在建構函式中初始化order變數以註冊事件,我們可以按以下方式進行:

public function __construct(Order $order) {
   $this->order = $order;
}

Listeners

監聽器處理註冊事件中提到的所有活動。artisan命令event:generateapp/listeners目錄中建立所有listeners。Listeners資料夾包含一個檔案EventListener.php,其中包含處理監聽器所需的所有方法。

EventListener.php

<?php

namespace App\Listeners;

use App\Events\SomeEvent;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class EventListener{
   /**
      * Create the event listener.
      *
      * @return void
   */
   
   public function __construct() {
      //
   }

   /**
      * Handle the event.
      *
      * @param SomeEvent $event
      * @return void
   */
   
   public function handle(SomeEvent $event) {
      //
   }
}

如程式碼中所述,它包含用於管理各種事件的handle函式。我們可以建立各種針對單個事件的獨立監聽器。

Laravel - Facades

Facade為應用程式服務容器中可用的類提供了一個靜態介面。Laravel Facades充當服務容器中底層類的靜態代理,在保持比傳統靜態方法更高的可測試性和靈活性的同時,提供了簡潔、富有表現力的語法的優勢。

如何建立Facade

以下是建立Laravel中Facade的步驟:

  • 步驟1 − 建立PHP類檔案。

  • 步驟2 − 將該類繫結到服務提供者。

  • 步驟3 − 將該服務提供者註冊到

    Config\app.php作為提供者。

  • 步驟4 − 建立此類擴充套件的類

    Illuminate\Support\Facades\Facade。

  • 步驟5 − 將步驟4註冊到Config\app.php作為別名。

Facade類引用

Laravel附帶許多Facades。下表顯示了內建的Facade類引用:

Facade 服務容器繫結
App Illuminate\Foundation\Application app
Artisan Illuminate\Contracts\Console\Kernel artisan
Auth Illuminate\Auth\AuthManager auth
Auth(例項) Illuminate\Auth\Guard
Blade Illuminate\View\Compilers\BladeCompiler blade.compiler
Bus Illuminate\Contracts\Bus\Dispatcher
Cache Illuminate\Cache\Repository cache
Config Illuminate\Config\Repository config
Cookie Illuminate\Cookie\CookieJar cookie
Crypt Illuminate\Encryption\Encrypter encrypter
DB Illuminate\Database\DatabaseManager db
DB(例項) Illuminate\Database\Connection
Event Illuminate\Events\Dispatcher events
File Illuminate\Filesystem\Filesystem files
Gate Illuminate\Contracts\Auth\Access\Gate
Hash Illuminate\Contracts\Hashing\Hasher hash
Input Illuminate\Http\Request request
Lang Illuminate\Translation\Translator translator
Log Illuminate\Log\Writer log
Mail Illuminate\Mail\Mailer mailer
Password Illuminate\Auth\Passwords\PasswordBroker auth.password
Queue Illuminate\Queue\QueueManager queue
Queue(例項) Illuminate\Queue\QueueInterface
Queue(基類) Illuminate\Queue\Queue
Redirect Illuminate\Routing\Redirector redirect
Redis Illuminate\Redis\Database redis
Request Illuminate\Http\Request request
Response Illuminate\Contracts\Routing\ResponseFactory
Route Illuminate\Routing\Router router
Schema Illuminate\Database\Schema\Blueprint
Session Illuminate\Session\SessionManager session
Session(例項) Illuminate\Session\Store
Storage (儲存) Illuminate\Contracts\Filesystem\Factory filesystem
URL Illuminate\Routing\UrlGenerator url
Validator Illuminate\Validation\Factory validator
Validator(例項) Illuminate\Validation\Validator
View Illuminate\View\Factory view
View(例項) Illuminate\View\View

示例

步驟1 − 透過執行以下命令建立一個名為TestFacadesServiceProvider的服務提供者。

php artisan make:provider TestFacadesServiceProvider

**步驟 2** − 成功執行後,您將收到以下輸出:

FacadesServiceProvider

步驟3 − 在App/Test處建立一個名為TestFacades.php的類。

App/Test/TestFacades.php

<?php
   namespace App\Test;
   class TestFacades{
      public function testingFacades() {
         echo "Testing the Facades in Laravel.";
      }
   }
?>

步驟4 − 在“App/Test/Facades”處建立一個名為“TestFacades.php”的Facade類。

App/Test/Facades/TestFacades.php

<?php

namespace app\Test\Facades;

use Illuminate\Support\Facades\Facade;

class TestFacades extends Facade {
   protected static function getFacadeAccessor() { return 'test'; }
}

步驟5 − 在App/Test/Facades處建立一個名為TestFacadesServiceProviders.php的Facade類。

App/Providers/TestFacadesServiceProviders.php

<?php

namespace App\Providers;

use App;
use Illuminate\Support\ServiceProvider;

class TestFacadesServiceProvider extends ServiceProvider {
   public function boot() {
      //
   }
   public function register() {
      App::bind('test',function() {
         return new \App\Test\TestFacades;
      });
   }
}

步驟6 − 在config/app.php檔案中新增服務提供者,如下圖所示。

config/app.php

Service Provider

步驟7 − 在config/app.php檔案中新增別名,如下圖所示。

config/app.php

Alias

步驟8 − 在app/Http/routes.php中新增以下幾行。

app/Http/routes.php

Route::get('/facadeex', function() {
   return TestFacades::testingFacades();
});

步驟9 − 訪問以下URL以測試Facade。

https://:8000/facadeex

步驟10 − 訪問URL後,您將收到以下輸出:

Testing Facades

Laravel - Contracts

Laravel契約是一組介面,具有框架提供的各種功能和核心服務。

例如,Illuminate\Contracts\Queue\Queue契約使用排隊作業所需的方法,而Illuminate\Contracts\Mail\Mailer使用傳送電子郵件的方法。

每個定義的契約都包含框架的相應實現。所有Laravel契約都可以在下面提到的GitHub儲存庫中找到:

https://github.com/illuminate/contracts

此儲存庫提供了Laravel框架中可用的各種契約,可以下載並相應地使用。

重要提示

使用Laravel契約時,請注意以下重要事項:

  • 必須在類的建構函式中定義Facades。

  • 契約在類中顯式定義,您無需在建構函式中定義契約。

示例

考慮Laravel中使用的授權契約,如下所示:

<?php

namespace Illuminate\Contracts\Auth\Access;

interface Authorizable{
   /**
      * Determine if the entity has a given ability.
      *
      * @param string $ability
      * @param array|mixed $arguments
      * @return bool
   */
   public function can($ability, $arguments = []);
}

該契約使用一個名為can的函式,其中包含一個名為ability的引數和一個名為arguments的引數,該引數使用陣列形式的使用者標識。

您需要按照以下語法定義一個契約:

interface <contract-name>

契約類似於外觀模式,用於建立健壯且經過良好測試的 Laravel 應用程式。使用契約和外觀模式之間存在多種實際差異

以下程式碼演示瞭如何使用契約來快取資源庫:

<?php

namespace App\Orders;
use Illuminate\Contracts\Cache\Repository as Cache;

class Repository{
   /**
      * The cache instance.
   */
   
   protected $cache;
   
   /**
      * Create a new repository instance.
      *
      * @param Cache $cache
      * @return void
   */
   
   public function __construct(Cache $cache) {
      $this->cache = $cache;
   }
}

契約不包含任何實現和新的依賴項;易於編寫指定契約的替代實現,因此使用者可以替換快取實現而無需修改任何程式碼庫。

Laravel - CSRF 保護

CSRF 指的是針對 Web 應用程式的跨站請求偽造攻擊。CSRF 攻擊是由系統的已認證使用者執行的未經授權的活動。因此,許多 Web 應用程式容易受到此類攻擊。

Laravel 提供以下 CSRF 保護方式:

Laravel 內建了一個 CSRF 外掛,它為每個活動的使用者會話生成令牌。這些令牌驗證操作或請求是由相關的已認證使用者傳送的。

實現

本節詳細討論了在 Laravel 中實現 CSRF 保護的方法。在繼續進行 CSRF 保護之前,需要注意以下幾點:

  • CSRF 實現在 Web 應用程式中宣告的 HTML 表單內。您必須在表單中包含一個隱藏的已驗證 CSRF 令牌,以便 Laravel 的 CSRF 保護中介軟體可以驗證請求。語法如下:

<form method = "POST" action="/profile">
   {{ csrf_field() }}
   ...
</form>
  • 您可以使用 JavaScript HTTP 庫方便地構建 JavaScript 驅動的應用程式,因為這會將 CSRF 令牌包含到每個傳出的請求中。

  • 名為resources/assets/js/bootstrap.js的檔案註冊了 Laravel 應用程式的所有令牌,幷包含一個儲存帶有Axios HTTP 庫csrf-tokenmeta標籤。

沒有 CSRF 令牌的表單

考慮以下幾行程式碼。它們顯示一個表單,該表單將兩個引數作為輸入:emailmessage

<form>
   <label> Email </label>
      <input type = "text" name = "email"/>
      <br/>
   <label> Message </label> <input type="text" name = "message"/>
   <input type = ”submit” name = ”submitButton” value = ”submit”>
</form>

以上程式碼的結果是終端使用者可以檢視的以下表單:

Contact Form

上面顯示的表單將接受來自授權使用者的任何輸入資訊。這可能會使 Web 應用程式容易受到各種攻擊。

請注意,提交按鈕包含控制器部分的功能。postContact 函式用於關聯檢視的控制器中。如下所示:

public function postContact(Request $request) {
   return $request-> all();
}

請注意,該表單不包含任何 CSRF 令牌,因此作為輸入引數共享的敏感資訊容易受到各種攻擊。

包含 CSRF 令牌的表單

以下幾行程式碼顯示了使用 CSRF 令牌重新設計的表單:

<form method = ”post” >
   {{ csrf_field() }}
   <label> Email </label>
   <input type = "text" name = "email"/>
   <br/>
   <label> Message </label>
   <input type = "text" name = "message"/>
   <input type = ”submit” name = ”submitButton” value = ”submit”>
</form>

獲得的輸出將返回包含以下令牌的 JSON:

{
   "token": "ghfleifxDSUYEW9WE67877CXNVFJKL",
   "name": "TutorialsPoint",
   "email": "contact@tutorialspoint.com"
}

這是單擊提交按鈕時建立的 CSRF 令牌。

Laravel - 認證

身份驗證是識別使用者憑據的過程。在 Web 應用程式中,身份驗證由會話管理,會話接收諸如電子郵件或使用者名稱和密碼之類的輸入引數來進行使用者身份識別。如果這些引數匹配,則認為使用者已透過身份驗證。

命令

Laravel 使用以下命令建立表單和關聯的控制器來執行身份驗證:

php artisan make:auth

此命令有助於成功建立身份驗證腳手架,如下面的螢幕截圖所示:

Authentication

控制器

用於身份驗證過程的控制器是HomeController

<?php

namespace App\Http\Controllers;

use App\Http\Requests;
use Illuminate\Http\Request;

class HomeController extends Controller{
   /**
      * Create a new controller instance.
      *
      * @return void
   */
   
   public function __construct() {
      $this->middleware('auth');
   }
   
   /**
      * Show the application dashboard.
      *
      * @return \Illuminate\Http\Response
   */
   
   public function index() {
      return view('home');
   }
}

因此,生成的腳手架應用程式建立了登入頁面和註冊頁面以執行身份驗證。它們如下所示:

登入

Login Page

註冊

Register

手動驗證使用者

Laravel 使用Auth外觀來幫助手動驗證使用者。它包含attempt方法來驗證其電子郵件和密碼。

考慮以下LoginController程式碼行,其中包含所有身份驗證功能:

<?php

// Authentication mechanism
namespace App\Http\Controllers;

use Illuminate\Support\Facades\Auth;

class LoginController extends Controller{
   /**
      * Handling authentication request
      *
      * @return Response
   */
   
   public function authenticate() {
      if (Auth::attempt(['email' => $email, 'password' => $password])) {
      
         // Authentication passed...
         return redirect()->intended('dashboard');
      }
   }
}

Laravel - 授權

在上一章中,我們學習了 Laravel 中的身份驗證過程。本章向您解釋 Laravel 中的授權過程。

身份驗證和授權的區別

在進一步學習 Laravel 中的授權過程之前,讓我們瞭解身份驗證和授權之間的區別。

身份驗證中,系統或 Web 應用程式透過使用者提供的憑據來識別其使用者。如果發現憑據有效,則對其進行身份驗證,否則則不進行身份驗證。

授權中,系統或 Web 應用程式會檢查已認證的使用者是否可以訪問他們試圖訪問或請求的資源。換句話說,它會檢查他們在請求資源上的許可權。如果發現他們可以訪問資源,則表示他們已獲得授權。

因此,身份驗證涉及檢查使用者憑據的有效性,而授權則涉及檢查已認證使用者對資源的許可權。

Laravel 中的授權機制

Laravel 提供了一種簡單的授權機制,該機制包含兩種主要方法,即GatesPolicies

編寫 Gates 和 Policies

Gates 用於確定使用者是否有權執行指定的動作。它們通常在App/Providers/AuthServiceProvider.php中使用 Gate 外觀定義。Gates 也是宣告用於執行授權機制的函式。

Policies 在陣列中宣告,並用於使用授權機制的類和方法中。

以下幾行程式碼解釋瞭如何在 Laravel Web 應用程式中使用 Gates 和 Policies 來授權使用者。請注意,在此示例中,boot函式用於授權使用者。

<?php

namespace App\Providers;

use Illuminate\Contracts\Auth\Access\Gate as GateContract;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider{
   /**
      * The policy mappings for the application.
      *
      * @var array
   */
   
   protected $policies = [
      'App\Model' => 'App\Policies\ModelPolicy',
   ];
   
   /**
      * Register any application authentication / authorization services.
      *
      * @param \Illuminate\Contracts\Auth\Access\Gate $gate
      * @return void
   */
   
   public function boot(GateContract $gate) {
      $this->registerPolicies($gate);
      //
   }
}

Laravel - Artisan 命令列工具

Laravel 框架提供三種主要的命令列互動工具,即:Artisan、TickerREPL。本章將詳細解釋 Artisan。

Artisan 簡介

Artisan 是 Laravel 中常用的命令列介面,它包含一組有助於開發 Web 應用程式的命令。

示例

以下是 Artisan 中的一些命令及其各自的功能:

啟動 Laravel 專案

php artisan serve

啟用快取機制

php artisan route:cache

檢視 Artisan 支援的可用命令列表

php artisan list

檢視任何命令的幫助資訊,並檢視可用的選項和引數

php artisan help serve

以下螢幕截圖顯示了上述命令的輸出:

Artisan Help Serve

編寫命令

除了 Artisan 中列出的命令外,使用者還可以建立一個自定義命令,該命令可用於 Web 應用程式。請注意,命令儲存在app/console/commands目錄中。

建立使用者定義命令的預設命令如下所示:

php artisan make:console <name-of-command>

鍵入上述命令後,您將看到如下所示的螢幕截圖中的輸出:

defaultCommand

DefaultCommand建立的檔名為DefaultCommand.php,如下所示:

<?php

namespace App\Console\Commands;
use Illuminate\Console\Command;

class DefaultCommand extends Command{
   /**
      * The name and signature of the console command.
      *
      * @var string
   */
   
   protected $signature = 'command:name';
   
   /**
      * The console command description.
      *
      * @var string
   */
   
   protected $description = 'Command description';
   
   /**
      * Create a new command instance.
      *
      * @return void
   */
   
   public function __construct() {
      parent::__construct();
   }
   
   /**
      * Execute the console command.
      *
      * @return mixed
   */
   
   public function handle() {
      //
   }
}

此檔案包含使用者定義命令的簽名和說明。名為handle的公共函式在執行命令時執行功能。這些命令在同一目錄中的Kernel.php檔案中註冊。

您還可以為使用者定義的命令建立任務計劃,如下面的程式碼所示:

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel {
   /**
      * The Artisan commands provided by your application.
      *
      * @var array
   */
   
   protected $commands = [
      // Commands\Inspire::class,
      Commands\DefaultCommand::class
   ];
   
   /**
      * Define the application's command schedule.
      *
      * @param \Illuminate\Console\Scheduling\Schedule $schedule
      * @return void
   */
   
   protected function schedule(Schedule $schedule) {
      // $schedule->command('inspire')
      // ->hourly();
   }
}

請注意,給定命令的任務計劃是在名為schedule的函式中定義的,該函式包含一個用於計劃任務的引數,該引數採用hourly引數。

命令註冊在命令陣列中,該陣列包含命令的路徑和名稱。

註冊命令後,它將列在 Artisan 命令中。當您呼叫指定命令的 help 屬性時,將顯示簽名和說明部分中包含的值。

讓我們看看如何檢視我們命令DefaultCommand的屬性。您應該使用如下所示的命令:

php artisan help DefaultCommand

Laravel - 加密

加密是使用某些演算法將純文字轉換為訊息的過程,以便任何第三方使用者都無法讀取資訊。這對於傳輸敏感資訊很有幫助,因為入侵者針對傳輸資訊的可能性較小。

加密使用稱為密碼學的過程執行。要加密的文字稱為明文,加密後獲得的文字或訊息稱為密文。將密文轉換為明文的過程稱為解密

Laravel 使用AES-256AES-128加密器,它使用 OpenSSL 進行加密。Laravel 中包含的所有值都使用訊息認證碼協議進行簽名,以便一旦加密,底層值就不會被篡改。

配置

在 Laravel 中生成金鑰的命令如下所示:

php artisan key:generate

請注意,此命令使用 PHP 安全隨機位元組生成器,您可以看到如下所示的螢幕截圖中的輸出:

Artisan Key

上述命令有助於生成可在 Web 應用程式中使用的金鑰。觀察下面的螢幕截圖:

注意

加密的值在config/app.php檔案中正確對齊,該檔案包含兩個用於加密的引數,即keycipher。如果使用此金鑰的值未正確對齊,則 Laravel 中加密的所有值都將不安全。

加密過程

可以使用 Laravel 類控制器的encrypt 助手對值進行加密。這些值使用 OpenSSL 和 AES-256 密碼進行加密。所有加密的值都使用訊息認證碼 (MAC) 進行簽名,以檢查加密字串的任何修改。

defaultCommand

以下程式碼在控制器中提到,用於儲存秘密或敏感訊息。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class DemoController extends Controller{
   **
      * Store a secret message for the user.
      *
      * @param Request $request
      * @param int $id
      * @return Response
   */
   
   public function storeSecret(Request $request, $id) {
      $user = User::findOrFail($id);
      $user->fill([
         'secret' => encrypt($request->secret)
      ])->save();
   }
}

解密過程

值的解密使用decrypt 助手完成。觀察以下幾行程式碼:

use Illuminate\Contracts\Encryption\DecryptException;

// Exception for decryption thrown in facade
try {
   $decrypted = decrypt($encryptedValue);
} catch (DecryptException $e) {
   //
}

請注意,如果由於使用了無效的 MAC 而解密過程不成功,則會丟擲相應的異常。

Laravel - 雜湊

雜湊(Hashing)是將字串轉換為較短的固定值或金鑰的過程,該值或金鑰代表原始字串。Laravel 使用 **Hash** 門面,提供了一種安全的方式來以雜湊方式儲存密碼。

基本用法

以下截圖顯示瞭如何建立一個名為 **passwordController** 的控制器,用於儲存和更新密碼:

Password

以下程式碼行解釋了 **passwordController** 的功能和用法:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use App\Http\Controllers\Controller

class passwordController extends Controller{
   /**
      * Updating the password for the user.
      *
      * @param Request $request
      * @return Response
   */
   
   public function update(Request $request) {
      // Validate the new password length...
      $request->user()->fill([
         'password' => Hash::make($request->newPassword) // Hashing passwords
      ])->save();
   }
}

使用 **make** 方法儲存雜湊密碼。此方法允許管理常用的 Laravel 中的 **bcrypt** 雜湊演算法的工作因子。

驗證密碼與雜湊值

應將密碼與雜湊值進行驗證,以檢查用於轉換的字串。為此,可以使用 **check** 方法。如下面的程式碼所示:

if (Hash::check('plain-text', $hashedPassword)) {
   // The passwords match...
}

請注意,**check** 方法將純文字與 **hashedPassword** 變數進行比較,如果結果為真,則返回真值。

Laravel - 理解發布流程

每個 Web 應用框架都有自己的版本歷史記錄,並且一直在更新和維護。每個最新版本都帶來新的功能,其中一些功能已被更改或棄用,因此瞭解哪個版本適合您的專案非常重要。

對於 Laravel,目前有兩個活躍版本,如下所示:

  • Laravel 4 - 於 2013 年 5 月釋出
  • Laravel 5.1 - 於 2015 年 2 月釋出

Laravel 5.1 還包含各種版本,最新版本為 Laravel 5.1.5,其中包含用於 Web 開發的所有強大功能。Laravel 的路線圖或版本釋出如下圖所示:

Laravel Release Process

在理解 Laravel 的釋出流程方面,以下幾點值得注意:

  • 在 Laravel 5.1 中刪除了舊的 **app/models** 目錄。

  • 所有控制器、中介軟體和請求都分組在一個目錄下,位於 app/Http 資料夾中。

  • 新的資料夾 **Providers** 目錄取代了 Laravel 4.x 版本中之前的 **app/start** 檔案。

  • 所有語言檔案和檢視都已移動到 **resources** 目錄。

  • 新的 artisan 命令 **route:cache** 用於註冊新路由,幷包含在 Laravel 5.1 及更高版本中。

  • Laravel 支援 **HTTP 中介軟體**,還包括 **CSRF 令牌** 和身份驗證模型。

  • 所有身份驗證模型都位於一個名為 **resources/views/auth** 的目錄下。它包括使用者註冊、身份驗證和密碼控制器。

Laravel 版本釋出

版本 釋出日期 Bug 修復截止日期 安全修復截止日期
V1 2011年6月 - -
V2 2011年9月 - -
v3 2012年2月 - -
v4 2013年5月 - -
5.0 2015年2月4日 2015年8月4日 2016年2月4日
5.1 (LTS) 2015年6月9日 2017年6月9日 2018年6月9日
5.2 2015年12月21日 2016年6月21日 2016年12月21日
5.3 2016年8月23日 2017年2月23日 2017年8月23日
5.4 2017年1月24日 2017年7月24日 2018年1月24日
5.5 (LTS) 2017年8月30日 2019年8月30日 2020年8月30日
5.6 2018年2月7日 2018年8月7日 2019年2月7日
5.7 2018年9月4日 2019年2月4日 2019年9月4日

請注意,突出顯示的版本表示最新版本。

Laravel - 遊客使用者許可權

訪客使用者門禁功能是 2018 年 9 月釋出的最新 5.7 版本的附加功能。此功能用於啟動特定使用者的授權過程。

在 Laravel 5.6 中,有一個過程用於為未經身份驗證的使用者返回 **false**。在 Laravel 5.7 中,我們可以允許訪客進行授權檢查,方法是在指定的控制器中使用特定的 **nullable** 型別提示,如下所示:

<?php
Gate::define('view-post', function (?User $user) {
   // Guests
});

程式碼解釋

透過使用 **nullable** 型別提示,當將訪客使用者傳遞給門禁時,$user 變數將為 null。然後,您可以根據需要決定是否授權操作。如果允許空型別並返回 true,則訪客將擁有授權。如果不使用空型別提示,則對於 Laravel 5.7,訪客將自動獲得 403 響應,如下面的快照所示:

Nullable Type Hint

403 和 404 錯誤的區別在於,當用戶嘗試訪問未知資源或 URL 時顯示 404,如上圖快照所示,如果未經授權的使用者訪問網站,則顯示 403 錯誤。

Laravel - Artisan 命令

Laravel 5.7 提供了一種處理和測試新命令的新方法。它包括測試 artisan 命令的新功能,演示如下:

class ArtisanCommandTest extends TestCase{
   public function testBasicTest() {
      $this->artisan('nova:create', [
         'name' => 'My New Admin panel'
      ])
      ->expectsQuestion('Please enter your API key', 'apiKeySecret')
      ->expectsOutput('Authenticating...')
      ->expectsQuestion('Please select a version', 'v1.0')
      ->expectsOutput('Installing...')
      ->expectsQuestion('Do you want to compile the assets?', 'yes')
      ->expectsOutput('Compiling assets...')
      ->assertExitCode(0);
   }
}

程式碼解釋

這裡在測試用例模組下建立了一個名為“ArtisanCommandTest”的新類。它包含一個基本函式 **testBasicTest**,其中包含各種斷言功能。

artisan 命令 **expectsQuestion** 包含兩個屬性。一個帶有問題,另一個帶有 **apiKeySecret**。在這裡,artisan 驗證 apiKeySecret 並驗證使用者傳送的輸入。

同樣的情況也適用於“請選擇一個版本”的問題,使用者需要在此處提及特定版本。

Laravel - 分頁自定義

Laravel 包含一個分頁功能,可幫助使用者或開發者新增分頁功能。Laravel 分頁器與查詢構建器和 Eloquent ORM 整合。paginate 方法會自動處理設定所需的限制和定義的偏移量。它只接受一個引數進行分頁,即每頁顯示的專案數量。

Laravel 5.7 包含一種新的分頁方法,用於自定義分頁器每一側的頁數。新的方法不再需要自定義分頁檢視。

自定義分頁檢視程式碼演示如下:

<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
class UserController extends Controller{
   /**
   * Show all of the users for the application.
   *
   * @return Response
   */
   public function index() {
      $users = DB::table('users')->paginate(15);
      return view('user.index', ['users' => $users]);
   }
}

根據 Laravel 標準進行的新分頁自定義如下:

<?php
User::paginate(10)->onEachSide(5);

請注意,**onEachSide** 指的是每 10 條分頁記錄的細分和 5 的細分。

Laravel - Dump Server

Laravel dump 伺服器隨 Laravel 5.7 版本一起提供。以前的版本不包含任何 dump 伺服器。Dump 伺服器將是 laravel/laravel composer 檔案中的開發依賴項。

隨著 5.7 版本的釋出,您將獲得此命令,其中包含開箱即用的概念,允許使用者將資料轉儲到控制檯或 HTML 檔案,而不是瀏覽器。命令執行如下:

php artisan dump-server
# Or send the output to an HTML file
php artisan dump-server --format=html > dump.html

解釋

該命令在後臺執行一個伺服器,有助於收集從應用程式傳送的資料,並將輸出透過控制檯傳送。當命令不在前臺執行時,dump() 函式應預設工作。

Laravel - Action URL

Laravel 5.7 引入了一項名為“可呼叫操作 URL”的新功能。此功能類似於 Laravel 5.6 中接受 action 方法中字串的功能。Laravel 5.7 中引入的新語法的主要目的是直接允許您訪問控制器。

Laravel 5.6 版本中使用的語法如下:

<?php
$url = action('UserController@profile', ['id' => 1]);

Laravel 5.7 中呼叫的類似操作如下:

<?php
$url = action([PostsController::class, 'index']);

新的可呼叫陣列語法格式的一個優點是,如果開發者使用支援程式碼導航的文字編輯器或 IDE,則可以直接導航到控制器的功能。

廣告