PHP Laravel控制器的创建和使用(附带实例)
Laravel 中的控制器主要用于接收用户的请求,调用模型处理数据,最后通过视图展示数据。本节将对控制器的使用进行详细讲解。
自动生成控制器的命令如下:
需要说明的是,“php”命令需要确保已经将 PHP 程序添加到环境变量中才可以使用。在 Windows 系统中通过安装向导安装 Composer 时,会自动添加环境变量。“php artisan”命令表示使用 php 执行当前目录下的一个文件名为“artisan”的 PHP 脚本文件。虽然该文件没有扩展名,但不影响 php 程序识别。
下面演示使用命令创建 TestController 控制器,具体步骤如下:
1) 在命令提示符窗口中切换到 C:\web\www\laravel 目录,创建一个 TestController 控制器,具体命令如下:
2) 使用编辑器打开 app\Http\Controllers\TestController.php 文件,具体代码如下:
3) 创建一个 Admin/TestController 控制器,具体命令如下:
4) 使用编辑器打开 app\Http\Controllers\Admin\TestController.php 文件,具体代码如下:
下面演示如何定义控制器路由,示例代码如下:
为了测试上述路由的效果,在 app\Http\Controllers\Admin\TestController.php 文件中编写 test1() 方法,具体代码如下:
在实现接收用户输入的数据时,一共分为 3 步:
下面演示使用 input() 方法接收用户输入,在 TestController 中演示 Request 实例的使用方法,具体代码如下:
使用 Request 实例可以接收请求数据和路由参数,下面我们分别进行演示。
① 接收请求数据。在路由中给 input() 方法配置路由规则,具体代码如下:
② 接收路由参数。修改路由文件,在路由中匹配 name 参数,具体代码如下:
Laravel创建控制器
控制器文件的保存目录为 app\Http\Controllers。控制器文件应包含命名空间的声明和引入,以及控制器类的定义。这些代码不容易记忆,且容易出错。为此,Laravel 提供了自动生成控制器的命令,只需要记住这个命令,就可以自动生成控制器。自动生成控制器的命令如下:
php artisan make:controller 目录名/控制器名在上述命令中,php artisan 表示使用 Laravel 提供的 artisan 工具;make:controller表示生成控制器,在后面书写控制器名。控制器是可以分目录管理的,不同模块的控制器保存在不同的目录下。控制器的名称采用大驼峰的形式,在控制器名称后面需要加上 Controller 后缀,例如“TestController”。
需要说明的是,“php”命令需要确保已经将 PHP 程序添加到环境变量中才可以使用。在 Windows 系统中通过安装向导安装 Composer 时,会自动添加环境变量。“php artisan”命令表示使用 php 执行当前目录下的一个文件名为“artisan”的 PHP 脚本文件。虽然该文件没有扩展名,但不影响 php 程序识别。
下面演示使用命令创建 TestController 控制器,具体步骤如下:
1) 在命令提示符窗口中切换到 C:\web\www\laravel 目录,创建一个 TestController 控制器,具体命令如下:
php artisan make:controller TestController上述命令执行后,会生成 app\Http\Controllers\TestController.php 文件。
2) 使用编辑器打开 app\Http\Controllers\TestController.php 文件,具体代码如下:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class TestController extends Controller { // }在上述代码中,TestController 被放在了 App\Http\Controllers 命名空间下,该控制器继承了当前目录下的 Controller 控制器基类。第 5 行代码导入了 Request 类,该类用于接收用户的请求信息。
3) 创建一个 Admin/TestController 控制器,具体命令如下:
php artisan make:controller Admin/TestController上述命令执行后,会生成 app\Http\Controllers\Admin\TestController.php 文件。
4) 使用编辑器打开 app\Http\Controllers\Admin\TestController.php 文件,具体代码如下:
<?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use Illuminate\Http\Request; class TestController extends Controller { // }在上述代码中,TestController 类的命名空间放在了 App\Http\Controllers\Admin 中。由于在该命名空间下没有 Controller 控制器基类,所以需要通过第 5 行代码将 Controller 控制器基类的命名空间引入。
Laravel控制器路由
控制器路由是路由的一种定义方式。前面我们讲解的路由定义是通过传入一个回调函数来处理请求,而控制器路由则是引入要使用的控制器的命名空间。指定控制器的方法来处理请求,只需将回调函数修改为“[控制器类名, 方法名]”的形式。下面演示如何定义控制器路由,示例代码如下:
use App\Http\Controllers\Admin\TestController as AdminTestController; Route::get('admin/test1', [AdminTestController::class,'test1']);在上述代码中,引入了 TestController 控制器的命名空间并将该控制器重命名为 AdminTestController,回调函数中声明了调用 AdminTestController 类中的 test1() 方法。
为了测试上述路由的效果,在 app\Http\Controllers\Admin\TestController.php 文件中编写 test1() 方法,具体代码如下:
public function test1() { return '这是test1()方法'; }通过浏览器访问 http://www.laravel.test/admin/test1,可以看到页面中输出了“这是test1()方法”。
接收用户输入
在控制器中,接收用户输入的方式主要有两种,一种是通过 Request 实例接收用户输入,另一种是通过路由参数接收用户输入。1) 通过Request实例接收用户输入
Request 实例保存了当前 HTTP 请求的信息,通过它可以获取用户输入的数据。Request 实例提供了多个方法来获取用户输入和请求信息,常用的方法如下表所示:方法 | 说明 |
---|---|
query() | 返回 URL 查询参数的关联数组。 |
path() | 获取请求路径信息。 |
url() | 获取请求的完整 URL。 |
method() | 获取请求的方式,如 GET、POST。 |
has() | 可以检查请求数据中是否存在指定的键名。 |
all() | 获取所有请求数据,以关联数组的形式返回。 |
input() | 获取特定的请求数据,该方法的第 1 个参数是键名;第 2 个参数是可选参数,用于设置参数的默认值。 |
在实现接收用户输入的数据时,一共分为 3 步:
- 第 1 步是在文件中导入 Illuminate\Http\Request 命名空间;
- 第 2 步是在方法中通过依赖注入获得 $request 对象;
- 第 3 步是调用 $request 对象的方法获取用户输入的数据。
下面演示使用 input() 方法接收用户输入,在 TestController 中演示 Request 实例的使用方法,具体代码如下:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; // 导入命名空间 class TestController extends Controller { public function input(Request $request) // 依赖注入 { $name = $request->input('name'); // 调用input()方法获取数据 return 'name的值为' . $name; } }从上述代码可以看出,$request 对象就是 Request 实例,它是由框架自动创建的。第 9 行代码中的参数 Request $request 表示该方法依赖 Request 实例。框架在调用 input() 方法前,会把已经创建好的 Request 实例自动传给 input() 方法,然后就可以在 input() 方法中通过形参 $request 来使用 Request 实例。
使用 Request 实例可以接收请求数据和路由参数,下面我们分别进行演示。
① 接收请求数据。在路由中给 input() 方法配置路由规则,具体代码如下:
use App\Http\Controllers\TestController; Route::get('test/input', [TestController::class,'input']);下面我们通过查询字符串的方式为 name 传入一个参数值“xiaoming”,具体 URL 如下:
http://www.laravel.test/test/input?name=xiaoming在浏览器中访问该 URL,可以看到运行结果为“name的值为xiaoming”。
② 接收路由参数。修改路由文件,在路由中匹配 name 参数,具体代码如下:
Route::get('test/input/{name}', [TestController::class,'input']);修改 TestController 的 input() 方法,具体代码如下:
public function input(Request $request) { $name = $request->name; return 'name的值为' . $name; }在 URL 中为 name 传递一个参数值 xiaoming,具体 URL 如下:
http://www.laravel.test/test/input/xiaoming通过浏览器打开上述 URL 后,可以看到运行结果为“name的值为xiaoming”。
2) 通过路由参数接收用户输入
在定义路由规则时定义 $name 参数,具体代码如下:Route::get('test/input/{name}', [TestController::class,'input']);在 input() 方法中接收 $name 参数,具体代码如下:
public function input($name) { return 'name的值为' . $name; }在 URL 中为 name 传入参数值“xiaoming”,具体 URL 如下:
http://www.laravel.test/test/input/xiaoming通过浏览器打开上述 URL 后,可以看到运行结果为“name的值为xiaoming”。