Laravel - 控制器



在 MVC 框架中,字母“C”代表控制器 (Controller)。它充當檢視 (Views) 和模型 (Models) 之間的流量導向。本章將學習 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 中介軟體分配給 UserController 的 profile 路由。

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

<?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 的 handle 方法中,位於 **app/Http/Middleware**。

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 的 handle 方法中,位於 **app/Http/Middleware**。

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** - 我們現在透過使用資源註冊控制器來註冊 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
廣告