Skip to content

Laravel - 请求

Laravel 的 Illuminate\Http\Request 类提供了一种面向对象的方式来与应用程序当前处理的 HTTP 请求进行交互。这包括检索输入、cookie、文件以及关于请求本身的信息。

要通过依赖注入获取当前 HTTP 请求的实例,你应该在控制器方法或路由闭包上类型提示 Illuminate\Http\Request 类。传入的请求实例将由 Laravel 服务容器自动注入:

use Illuminate\Http\Request;
Route::get('/users', function (Request $request) {
// Use $request instance
});
// In a controller method:
public function store(Request $request)
{
$name = $request->input('name');
// ...
}

Illuminate\Http\Request 实例提供了多种方法来检查传入的 HTTP 请求。以下是一些常见方法:

  • path 方法返回请求的路径信息。因此,如果传入请求的目标是 http://example.com/foo/bar,path 方法将返回 foo/bar。
  • is 方法允许你验证传入请求的路径是否匹配给定的模式。使用此方法时,你可以使用 * 字符作为通配符。
  • url 方法返回传入请求的完整 URL。
  • fullUrl 方法返回包含查询字符串的完整 URL。
  • method 方法返回请求的 HTTP 动词(GET、POST、PUT、DELETE)。
  • isMethod 方法检查 HTTP 动词是否匹配给定的字符串。

步骤 1:执行以下命令创建一个名为 RequestDemoController 的新控制器。

php artisan make:controller RequestDemoController

步骤 2:成功执行后,控制台将显示类似“Controller created successfully.”的消息。

步骤 3:将以下代码添加到 app/Http/Controllers/RequestDemoController.php:

app/Http/Controllers/RequestDemoController.php

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class RequestDemoController extends Controller
{
public function inspect(Request $request)
{
echo 'Path: ' . $request->path() . '<br>';
echo 'Is foo/* pattern match? ' . ($request->is('foo/*') ? 'Yes' : 'No') . '<br>';
echo 'Is bar/* pattern match? ' . ($request->is('bar/*') ? 'Yes' : 'No') . '<br>';
echo 'Full URL: ' . $request->fullUrl() . '<br>';
echo 'HTTP Method: ' . $request->method() . '<br>';
}
}

步骤 4:在 routes/web.php 文件中添加以下路由定义。

routes/web.php

use App\Http\Controllers\RequestDemoController;
Route::get('/foo/bar/test', [RequestDemoController::class, 'inspect']);

步骤 5:在浏览器中访问以下 URL:

http://localhost:8000/foo/bar/test?name=John

步骤 6:输出将显示有关请求 URI 的信息,类似于: Path: foo/bar/test
Is foo/* pattern match? Yes
Is bar/* pattern match? No
Full URL: http://localhost:8000/foo/bar/test?name=John
HTTP Method: GET

你可以使用 all() 方法将所有传入请求的输入数据作为数组检索。然而,你通常只需要输入数据的子集。无论请求使用哪种 HTTP 动词,你都可以使用一些简单的方法访问用户输入。

input() 方法从请求载荷(查询字符串或表单数据)中检索值。

$name = $request->input('name');
// 如果输入不存在,你可以提供一个默认值
$role = $request->input('role', 'guest');

你还可以使用 Illuminate\Http\Request 实例上的动态属性访问用户输入。

$name = $request->name;

当处理包含数组输入的表单时,使用“点”表示法访问数组元素:

$name = $request->input('products.0.name');
$names = $request->input('products.*.name');

步骤 1:在 resources/views/auth/register.blade.php 创建一个注册表单视图。

resources/views/auth/register.blade.php

<!DOCTYPE html>
<html>
<head>
<title>User Registration</title>
</head>
<body>
<h2>Register</h2>
<form action="{{ url('/user/submit-registration') }}" method="POST">
@csrf
<div>
<label for="name">Name:</label>
<input type="text" id="name" name="name" value="{{ old('name') }}">
</div>
<div>
<label for="username">Username:</label>
<input type="text" id="username" name="username" value="{{ old('username') }}">
</div>
<div>
<label for="password">Password:</label>
<input type="password" id="password" name="password">
</div>
<button type="submit">Register</button>
</form>
</body>
</html>

注意 @csrf 用于 CSRF 保护,以及 old('field_name') 用于在验证错误时重新填充表单(尽管此特定控制器示例中未显示验证,但这是一种良好实践)。

步骤 2:执行以下命令创建一个 UserRegistrationController。

php artisan make:controller UserRegistrationController

步骤 3:控制台输出将确认:“Controller created successfully.”。

步骤 4:将以下代码复制到 app/Http/Controllers/UserRegistrationController.php 中。

app/Http/Controllers/UserRegistrationController.php

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserRegistrationController extends Controller
{
public function showRegistrationForm()
{
return view('auth.register');
}
public function register(Request $request)
{
// 使用 input() 方法检索 name 输入字段
$name = $request->input('name');
echo 'Name: ' . htmlspecialchars($name) . '<br>';
// 使用动态属性检索 username 输入字段
$username = $request->username;
echo 'Username: ' . htmlspecialchars($username) . '<br>';
// 检索 password 输入字段
$password = $request->input('password');
echo 'Password: 在这里显示密码是不安全的。应该存储哈希版本。';
// 在实际应用程序中,你会对密码进行哈希处理:
// $hashedPassword = Hash::make($password);
}
}

步骤 5:在 routes/web.php 中添加以下路由。

routes/web.php

use App\Http\Controllers\UserRegistrationController;
Route::get('/register-user', [UserRegistrationController::class, 'showRegistrationForm']);
Route::post('/user/submit-registration', [UserRegistrationController::class, 'register']);

步骤 6:在浏览器中访问 http://localhost:8000/register-user。你将看到注册表单。

步骤 7:填写详细信息并单击“注册”。下一页将显示你提交的输入值,演示了如何在控制器中检索它们。例如:Name: John Doe, Username: johndoe, Password: Displaying password here is insecure. Hashed version would be stored.

有关处理请求的更多详细信息,包括文件上传、cookie 和其他高级功能,请查阅 Laravel 官方文档中的 HTTP 请求部分。