Laravel 的 路由与控制器 是构建应用程序的核心组件。路由用于处理传入的 HTTP 请求并将它们分配给相应的控制器方法,控制器负责处理请求并返回响应。以下是 Laravel 路由与控制器 的详细介绍。
1. 路由基础
1.1 定义路由
在 Laravel 中,路由通常定义在 routes/web.php 文件中。你可以使用不同类型的 HTTP 请求方法(如 GET、POST、PUT、DELETE)来定义路由。
例如,定义一个简单的 GET 路由:
Route::get('/', function () {
return view('welcome');
});
1.2 路由参数
Laravel 路由支持动态参数,这意味着你可以通过 URL 获取参数并将它们传递给控制器或闭包。
例如,定义一个带有动态参数的路由:
Route::get('user/{id}', function ($id) {
return 'User ID is ' . $id;
});
1.3 路由约束
你可以为路由中的参数设置正则表达式约束,确保只有符合指定模式的参数才会被接受。
例如,限制 id 参数为数字:
Route::get('user/{id}', function ($id) {
return 'User ID is ' . $id;
})->where('id', '[0-9]+');
1.4 命名路由
你可以为路由指定一个名字,这样在生成 URL 或重定向时可以使用路由名称,而不是 URL 路径。
例如,命名路由:
Route::get('profile', function () {
return view('profile');
})->name('profile');
在视图或控制器中生成 URL:
$url = route('profile'); // 生成 /profile 的 URL
1.5 路由中间件
中间件用于过滤 HTTP 请求,检查请求的合法性。你可以在路由定义中使用中间件来处理认证、日志记录等任务。
例如,使用 auth 中间件保护路由:
Route::get('dashboard', function () {
return view('dashboard');
})->middleware('auth');
2. 控制器
2.1 创建控制器
你可以使用 Artisan 命令来创建控制器:
php artisan make:controller UserController
这会在 app/Http/Controllers 目录下创建一个 UserController.php 文件。你可以在控制器中定义处理请求的方法。
2.2 控制器方法
在控制器中,你可以创建方法来处理特定的请求。例如,在 UserController 中定义一个 show 方法来显示用户信息:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function show($id)
{
return 'User ID is ' . $id;
}
}
2.3 路由与控制器绑定
你可以将路由与控制器方法绑定,而不是使用闭包。例如,将上面的 show 方法与路由绑定:
Route::get('user/{id}', [UserController::class, 'show']);
2.4 资源控制器
Laravel 提供了资源控制器,它会为你自动创建处理常见 CRUD 操作的路由。你可以通过 php artisan make:controller 命令来生成资源控制器。
php artisan make:controller PostController --resource
生成的 PostController 包含以下方法:
index():显示所有资源。create():显示创建资源的表单。store():存储新资源。show($id):显示指定资源。edit($id):显示编辑资源的表单。update($id):更新指定资源。destroy($id):删除指定资源。
你可以通过以下代码将资源路由与控制器绑定:
Route::resource('posts', PostController::class);
这会自动生成符合 RESTful 风格的路由,包括 GET /posts、POST /posts、GET /posts/{id} 等。
2.5 控制器的依赖注入
Laravel 允许你在控制器方法中使用依赖注入,自动将需要的服务或类注入到控制器方法中。例如:
namespace App\Http\Controllers;
use App\Models\Post;
class PostController extends Controller
{
public function show($id, Post $post)
{
$post = $post->findOrFail($id);
return view('post.show', compact('post'));
}
}
Laravel 会自动解析 Post 模型并将其注入到 show 方法中。
2.6 控制器中间件
你可以将中间件应用到控制器中,而不仅仅是单个路由。例如,应用 auth 中间件到整个控制器:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class DashboardController extends Controller
{
public function __construct()
{
$this->middleware('auth');
}
public function index()
{
return view('dashboard');
}
}
3. 路由与控制器最佳实践
- 使用资源控制器:对于标准的 CRUD 操作,使用资源控制器来减少代码量。
- 遵循 RESTful 规范:尽量按照 RESTful 路由命名规范定义路由和控制器方法。
- 控制器方法分离:将复杂的业务逻辑分离到服务层或独立的类中,保持控制器的简洁。