鍍金池/ 教程/ PHP/ Laravel控制器
Laravel操作數(shù)據(jù)庫
Laravel會(huì)話(session)
Laravel文件上傳
Laravel Cookie
Laravel Facades
Laravel應(yīng)用程序結(jié)構(gòu)
Laravel響應(yīng)
Laravel插入數(shù)據(jù)庫表數(shù)據(jù)
Laravel錯(cuò)誤處理
Laravel環(huán)境安裝配置
Laravel本地化
Laravel Ajax
Laravel路由
Laravel錯(cuò)誤和日志記錄
Laravel檢索查詢數(shù)據(jù)
Laravel更新數(shù)據(jù)
Laravel刪除數(shù)據(jù)
Laravel表單處理
Laravel中間件
Laravel控制器
Laravel驗(yàn)證
Laravel安全
Laravel請(qǐng)求
Laravel發(fā)送郵件
Laravel重定向
Laravel教程
Laravel配置
Laravel事件處理
Laravel視圖

Laravel控制器

在MVC框架中,字母“C”代表控制器。它充當(dāng)視圖和模型之間的指揮中心(或橋梁)。

創(chuàng)建一個(gè)控制器

打開您正在使用的操作系統(tǒng)上的命令提示符或終端,然后鍵入以下命令使用 Artisan CLI (命令行接口)來創(chuàng)建控制器。
php artisan make:controller <controller-name> --plain 

替換 <controller-name> 為您的控制器的名稱。我們將創(chuàng)建一個(gè)簡(jiǎn)單的構(gòu)造器使用傳遞一個(gè)參數(shù)— plain。 如果不希望創(chuàng)建一個(gè)普通的構(gòu)造函數(shù),可以忽略參數(shù)。 創(chuàng)建的構(gòu)造函數(shù)在 app/Http/Controllers. 你會(huì)看到一些基本的編碼已經(jīng)自動(dòng)生成了,你可以自定義添加編碼。創(chuàng)建控制器可以通過routes.php文件中使用以下語法調(diào)用。

語法

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

示例

第1步- 執(zhí)行以下命令來創(chuàng)建用戶控制器 - UserController。
php artisan make:controller UserController
第2步 - 成功執(zhí)行后,您會(huì)收到以下輸出。

第3步 - 你可以在 app/Http/Controller/UserController.php 看到創(chuàng)建控制器已經(jīng)自動(dòng)生成一些基本的代碼,您可以根據(jù)需要添加自己的編碼。 

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class UserController extends Controller {
   //
}

控制器中間件

我們已經(jīng)在前面學(xué)習(xí)了中間件,它可以與控制器一起使用。中間件也可以被分配到控制器的路由或控制器的構(gòu)造函數(shù)中??梢允褂弥虚g件方法來分配中間件到控制器。 已注冊(cè)中間件也可以限制到控制器的某些方法。

分配中間件路由

Route::get('profile', [
   'middleware' => 'auth',
   'uses' => 'UserController@showProfile'
]);
在這里,我們?cè)诼酚膳渲梦募峙渖矸蒡?yàn)證中間件使用到 UserController。

控制器的構(gòu)造函數(shù)中分配中間件

<?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');
   }
}
在這里,我們將身份驗(yàn)證分配使用中間件在UserController的構(gòu)造方法。

示例

第1步 - 添加以下行到 app/Http/routes.php 文件文件并保存。

routes.php

<?php
Route::get('/usercontroller/path',[
   'middleware' => 'First',
   'uses' => 'UserController@showPath'
]);
第2步 - 通過執(zhí)行以下行創(chuàng)建一個(gè)名為FirstMiddleware 的中間件。
php artisan make:middleware FirstMiddleware
第3步 - 添加新創(chuàng)建一個(gè)名為 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步 - 通過執(zhí)行以下行創(chuàng)建一個(gè)叫作 SecondMiddleware 的中間件。
php artisan make:middleware SecondMiddleware

第5步 - 添加以下代碼在新創(chuàng)建一個(gè)處理方法 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);
   }
}
注冊(cè)上面兩個(gè)中間件,打開文件: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步 - 通過執(zhí)行以下行創(chuàng)建一個(gè)名為 UserController 的控制器。
php artisan make:controller UserController
第7步 - URL成功執(zhí)行后,您會(huì)看到以下輸出 -

第8步 - 將以下代碼復(fù)制到 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步 - 現(xiàn)在,如果還沒有啟動(dòng)PHP的內(nèi)部Web服務(wù)器,可通過執(zhí)行以下命令。
php artisan serve
第10步 - 請(qǐng)?jiān)L問以下網(wǎng)址。

http://localhost:8000/usercontroller/path

第11步- 將出現(xiàn)如下面的輸出結(jié)果。

Restful 資源控制器

通常情況下當(dāng)開發(fā)一個(gè)應(yīng)用,我們需要執(zhí)行CRUD(創(chuàng)建,讀取,更新,刪除)操作。Laravel使這項(xiàng)工作更容易做到的。只需創(chuàng)建一個(gè)控制器,而Laravel會(huì)提供所有的CRUD操作的方法。您也可以注冊(cè)一個(gè)路由的所有方法在routes.php文件中。

示例

第1步 - 通過執(zhí)行以下命令創(chuàng)建一個(gè)名為 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 - 我們現(xiàn)在通過使用資源控制器注冊(cè)MyController 的所有方法。下面是由資源控制器處理的動(dòng)作的列表。

動(dòng)詞
路徑 動(dòng)作
路由名稱
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步 - 嘗試執(zhí)行下表中的網(wǎng)址URL。
URL 描述 輸出圖像
http://localhost:8000/my 執(zhí)行 Controller.php 的 index 方法 index
http://localhost:8000/my/create 執(zhí)行 Controller.php 的 create 方法 create
http://localhost:8000/my/1 執(zhí)行 Controller.php 的 show方法 show
http://localhost:8000/my/1/edit 執(zhí)行 Controller.php 的 edit方法 edit

隱式控制器

隱式控制器允許你定義一個(gè)路由處理控制器中的每一個(gè)動(dòng)作。如下圖所示使用 Route:controller 方法,在路由文件 route.php 中定義它。

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

控制器的方法名應(yīng)該是類似 GET或POST HTTP動(dòng)詞開頭。如果以 get 開始,它只會(huì)處理 get 請(qǐng)求,如果它使用 post 開駋那么將處理post請(qǐng)求。在HTTP動(dòng)詞后,可以方法使用任何名稱,但它應(yīng)遵循 URI 的格式。

示例

第1步 - 執(zhí)行下面的命令來創(chuàng)建一個(gè)控制器。其類名稱為 ImplicitController。這個(gè)類你也可以使用其它的任何名稱。

php artisan make:controller ImplicitController
第2步 - 成功執(zhí)行后,會(huì)產(chǎn)生以下輸出 -
第3步 - 將以下代碼復(fù)制到 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 以將請(qǐng)求路由到指定的控制器。

app/Http/routes.php

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

構(gòu)造器注入

Laravel服務(wù)容器是用來解析所有Laravel控制器。因此,你能夠輸入-提示控制器也許需要在其構(gòu)造依賴。依賴關(guān)系將被自動(dòng)解析和注射到控制器實(shí)例。

示例

步驟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步 - 訪問以下網(wǎng)址來測(cè)試構(gòu)造器注入。

http://localhost:8000/myclass

第4步 - 輸出結(jié)果如下面圖所示。

方法注入

除了構(gòu)造器注入,也可以輸入 - 在你的控制器操作方法觸發(fā)依賴。

示例

步驟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步 - 訪問以下網(wǎng)址來測(cè)試構(gòu)造器注入。

http://localhost:8000/myclass

它會(huì)產(chǎn)生下面的輸出 -