Laravel控制器


在MVC框架中,字母「C」代表控制器。它充當檢視和模型之間的指揮中心(或橋樑)。

建立一個控制器

開啟您正在使用的作業系統上的命令提示字元或終端,然後鍵入以下命令使用 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
第2步 - 成功執行後,您會收到以下輸出。

第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 {
   //
}

控制器中介軟體

我們已經在前面學習了中介軟體,它可以與控制器一起使用。中介軟體也可以被分配到控制器的路由或控制器的建構函式中。可以使用中介軟體方法來分配中介軟體到控制器。 已註冊中介軟體也可以限制到控制器的某些方法。

分配中介軟體路由

Route::get('profile', [
   'middleware' => 'auth',
   'uses' => 'UserController@showProfile'
]);
在這裡,我們在路由組態檔案分配身份驗證中介軟體使用到 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的構造方法。

範例

第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/FirstMiddleware.php 。

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/SecondMiddleware.php.

SecondMiddleware.php

<?php
namespace App\Http\Middleware;
use Closure;

class SecondMiddleware {
   public function handle($request, Closure $next){
      echo '<br>Second Middleware';
      return $next($request);
   }
}
註冊上面兩個中介軟體,開啟檔案:app/Http/Kernel.php
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'First'  => \App\Http\Middleware\FirstMiddleware::class,
        'Second'  => \App\Http\Middleware\SecondMiddleware::class,
    ];
第6步 - 通過執行以下行建立一個名為 UserController 的控制器。
php artisan make:controller UserController
第7步 - URL成功執行後,您會看到以下輸出 -

第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步 - 請存取以下網址。

http://localhost:8000/usercontroller/path

第11步- 將出現如下面的輸出結果。

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 描述 輸出影象
http://localhost:8000/my 執行 Controller.php 的 index 方法 index
http://localhost:8000/my/create 執行 Controller.php 的 create 方法 create
http://localhost:8000/my/1 執行 Controller.php 的 show方法 show
http://localhost:8000/my/1/edit 執行 Controller.php 的 edit方法 edit

隱式控制器

隱式控制器允許你定義一個路由處理控制器中的每一個動作。如下圖所示使用 Route:controller 方法,在路由檔案 route.php 中定義它。

Route::controller(‘base URI’,’<class-name-of-the-controller>’);
替換 <class-name-of-the-controller>使用你給定控制器類名。

控制器的方法名應該是類似 GET或POST HTTP動詞開頭。如果以 get 開始,它只會處理 get 請求,如果它使用 post 開駋那麼將處理post請求。在HTTP動詞後,可以方法使用任何名稱,但它應遵循 URI 的格式。

範例

第1步 - 執行下面的命令來建立一個控制器。其類名稱為 ImplicitController。這個類你也可以使用其它的任何名稱。

php artisan make:controller ImplicitController
第2步 - 成功執行後,會產生以下輸出 -
第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步 - 存取以下網址來測試構造器注入。

http://localhost:8000/myclass

第4步 - 輸出結果如下面圖所示。

方法注入

除了構造器注入,也可以輸入 - 在你的控制器操作方法觸發依賴。

範例

步驟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步 - 存取以下網址來測試構造器注入。

http://localhost:8000/myclass

它會產生下面的輸出 -