首页 > 编程笔记 > PHP笔记 阅读:9

PHP Laravel控制器的创建和使用(附带实例)

Laravel 中的控制器主要用于接收用户的请求,调用模型处理数据,最后通过视图展示数据。本节将对控制器的使用进行详细讲解。

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 步:
下面演示使用 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”。

相关文章