Laravel - 控制器

在MVC框架中,字母"C"代表Controller.它充当视图和模型之间的引导流量.在本章中,您将了解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'
]);

这里我们在配置文件路由中将auth中间件分配给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');
   }
}

这里我们使用中的中间件方法分配 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步 : 将以下代码添加到 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步 : 请访问以下网址.

http://localhost:8000/usercontroller/path

步骤11 : 输出将如下图所示.

UserController2

Restful Resource Controllers

通常在创建应用程序时,我们需要执行 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/myindexmy.index
GET/my/create创建my.create
POST/mystoremy.store
GET/my/{my}showmy .show
GET/my/{my}/edit编辑my.edit
PUT/PATCH/my/{my}updatemy.update
DELETE/my/{my}destroymy.destroy

第5步 : 尝试执行下表中显示的URL.

URL描述输出图像
http://localhost:8000/my执行MyController.php的索引方法index
http://localhost:8000/my/create执行MyController.php的create方法create
http://localhost:8000/my/1执行MyController.php的show方法show
http://localhost:8000/my/1/edit执行MyController.php的编辑方法编辑

隐式控制器

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

Route::controller(‘base URI’,’<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

它将产生以下输出 :

构造函数注入