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

控制器中间件

我们之前见过中间件,它也可以与控制器一起使用。中间件也可以分配给控制器的路由或控制器的构造函数中。您可以使用中间件方法将中间件分配给控制器。已注册的中间件也可以限制为控制器的某些方法。

将中间件分配给路由

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

这里我们在配置文件路由中将身份验证中间件分配给 UserController。

在 Controller 的构造函数中分配中间件

<?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 构造函数中的中间件方法分配 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 − 在 app/Http/Middleware 中新建的 FirstMiddleware 的 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 − 在 app/Http/Middleware 中新建的 SecondMiddleware 的 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。

http://localhost: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 说明 输出图像
http://localhost:8000/my Executes index method of MyController.php index
http://localhost:8000/my/create Executes create method of MyController.php create
http://localhost:8000/my/1 Executes show method of MyController.php show
http://localhost:8000/my/1/edit Executes edit method of MyController.php edit

隐式控制器

隐式控制器允许您定义单个路由来处理控制器中的每个操作。您可以在 route.php 文件中使用 Route:controller 方法定义它,如下所示。

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 测试构造函数注入。

http://localhost: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 测试构造函数注入。

http://localhost:8000/myclass

它将产生以下输出 −

Constructor Injection