Laravel 控制器
在MVC框架中,字母’C’代表Controller,它在视图和模型之间充当交通指挥的角色。在本章中,您将学习有关Laravel中的控制器的内容。
创建控制器
打开命令提示符或终端(基于您使用的操作系统),并键入以下命令以使用Artisan CLI(命令行界面)创建控制器。
php artisan make:controller <controller-name> --plain
用你的控制器的名字替换<controller-name>
。这将创建一个普通构造函数,因为我们传递了参数 — 普通的。如果你不想创建普通的构造函数,你可以简单地忽略这个参数。创建出的构造函数可以在 app/Http/Controllers 中看到。
你会看到一些基本的编码已经为你完成,你可以添加自定义的编码。可以通过以下语法从routes.php调用创建的控制器。
语法
Route::get(‘base URI’,’controller@method’);
示例
步骤 1 - 执行以下命令以创建 UserController 。
php artisan make:controller UserController --plain
步骤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 {
//
}
控制器中间件
我们之前见过中间件,它也可以与控制器一起使用。中间件也可以分配给控制器的路由或者在控制器的构造函数中。你可以使用middleware方法来分配中间件给控制器。注册的中间件也可以限制在控制器的某个方法上。
给路由分配中间件
Route::get('profile', [
'middleware' => 'auth',
'uses' => 'UserController@showProfile'
]);
这里我们在profile路由中为UserController分配了auth中间件。
在控制器的构造函数中分配中间件
<?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
将下面的英文翻译成中文,不解释,保留HTML格式:
步骤3 - 将以下代码添加到新创建的FirstMiddleware的 handle 方法中,位置在 app/Http/Middleware 。
FirstMiddleware.php
<?php
namespace App\Http\Middleware;
use Closure;
class FirstMiddleware {
public function handle(request, Closurenext) {
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, Closurenext) {
echo '<br>Second Middleware';
return next(request);
}
}
步骤6 − 执行以下代码创建一个名为 UserController 的控制器。
php artisan make:controller UserController --plain
步骤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(Requestrequest) {
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(Requestrequest, id) {
echo 'update';
}
public function destroy(id) {
echo 'destroy';
}
}
步骤3 − 在 app/Http/routes.php 文件中添加以下代码行。
app/Http/routes.php
Route::resource('my','MyController');
步骤4 − 我们现在通过注册一个资源控制器来注册MyController的所有方法。下面是资源控制器处理的操作表格。
Verb | Path | Action | Route Name |
---|---|---|---|
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 | 执行MyController.php的index方法 | 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的edit方法 | 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步成功执行后,您将收到以下输出 –
步骤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(\MyClassmyclass) {
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 − 访问下面的URL来测试构造函数注入。
http://localhost:8000/myclass
它将会产生以下输出 −