路由是 Laravel 的核心功能之一,决定了当用户访问不同的 URL 时,系统应该执行什么样的操作。可以理解为请求和响应的桥梁,路由决定了 HTTP 请求(如 GET、POST 等)应该被哪个控制器、方法或者闭包函数来处理。
路由通常会出现在 routes/web.php
(处理浏览器请求)或者 routes/api.php
(处理 API 请求)中。
在 Laravel 中,你可以使用 Route
类来定义路由。
定义一个简单的 GET 路由:
// routes/web.php
Route::get('/home', function () {
return view('welcome');
});
Route::get('/home', function () {...})
这行代码的意思是,任何访问 /home
URL 的 GET 请求都会触发这个匿名函数,返回一个 welcome
视图。function () { return view('welcome'); }
是定义一个简单的闭包,返回的是一个视图页面。Laravel 路由支持多种 HTTP 请求方法,常见的有:
Route::get()
:处理 GET 请求,通常用于获取数据。Route::post()
:处理 POST 请求,通常用于提交表单数据。Route::put()
:处理 PUT 请求,通常用于更新数据。Route::delete()
:处理 DELETE 请求,通常用于删除数据。例如:
Route::post('/submit', function () {
return 'Form Submitted';
});
上面的代码定义了一个 POST 请求路由,用于处理表单提交。
Laravel 允许路由中包含动态参数。这些参数会从 URL 中提取,并传递到控制器或闭包函数中。
定义带参数的路由:
Route::get('/user/{id}', function ($id) {
return "User ID: " . $id;
});
{id}
是一个动态参数,表示 URL 中的部分内容。function ($id)
中的 $id
会接收到 URL 中的值。例如,访问 /user/123
会返回 "User ID: 123"。
你可以为路由参数定义约束,确保传递的参数符合预期。例如,限制 id
参数必须是数字。
Route::get('/user/{id}', function ($id) {
return "User ID: " . $id;
})->where('id', '[0-9]+');
这个路由将只允许数字作为 id
。
命名路由允许你为路由设置一个名称,方便在应用的其他地方引用该路由。
Route::get('/profile', function () {
return 'Profile Page';
})->name('profile');
在视图或控制器中,你可以通过路由名称生成 URL:
$url = route('profile'); // 返回 /profile 的 URL
中间件是 Laravel 用来过滤 HTTP 请求的机制。你可以在路由上使用中间件来做认证、日志记录、请求过滤等。
示例:
Route::get('/profile', function () {
return 'Profile Page';
})->middleware('auth'); // 仅授权用户可以访问
auth
中间件确保只有已经登录的用户才能访问 /profile
路由。
控制器是 Laravel 中用来处理请求的类。控制器将路由与业务逻辑分离,使得代码更加清晰、可维护。控制器包含方法,这些方法会被路由调用来处理用户请求。
Laravel 提供了 Artisan 命令来创建控制器。
php artisan make:controller ProductController
这个命令会在 app/Http/Controllers
目录下创建一个名为 ProductController.php
的文件。
控制器的方法处理请求并返回响应。例如,你可以在控制器中添加 index
和 show
方法来处理不同的请求:
// app/Http/Controllers/ProductController.php
namespace App\\Http\\Controllers;
use Illuminate\\Http\\Request;
use App\\Models\\Product;
class ProductController extends Controller
{
public function index()
{
$products = Product::all(); // 获取所有商品
return view('products.index', compact('products')); // 返回视图
}
public function show($id)
{
$product = Product::findOrFail($id); // 查找指定 ID 的商品
return view('products.show', compact('product')); // 返回视图
}
}
将路由和控制器方法结合起来,Laravel 会根据请求 URL 来调用相应的控制器方法。
在 routes/web.php
中定义路由:
// routes/web.php
Route::get('/products', [ProductController::class, 'index']);
Route::get('/products/{id}', [ProductController::class, 'show']);
上面的代码中,当用户访问 /products
时,会触发 ProductController
的 index
方法;当访问 /products/{id}
时,会触发 show
方法。
Laravel 提供了一种快捷的方式来处理常见的 CRUD 路由:资源路由。
php artisan make:controller ProductController --resource
这个命令会为控制器自动生成 CRUD 操作(index
、create
、store
、show
、edit
、update
和 destroy
)的方法。
资源路由定义:
Route::resource('products', ProductController::class);
Laravel 会自动为你的控制器生成七个常见的路由,分别处理 CRUD 操作。
Laravel 支持在控制器中使用依赖注入,这样可以将外部服务自动注入到控制器中,减少代码耦合度。
依赖注入示例:
namespace App\\Http\\Controllers;
use App\\Repositories\\ProductRepository;
class ProductController extends Controller
{
protected $productRepository;
public function __construct(ProductRepository $productRepository)
{
$this->productRepository = $productRepository;
}
public function index()
{
$products = $this->productRepository->getAllProducts(); // 使用依赖注入获取产品列表
return view('products.index', compact('products'));
}
}
在这个例子中,ProductRepository
被注入到控制器中,Laravel 会自动实例化 ProductRepository
并将其传递给控制器。
控制器方法通常会返回以下几种类型的内容:
视图:用于返回 HTML 页面。
return view('products.index', compact('products'));
重定向:用于将用户重定向到其他路由。
return redirect()->route('products.index');
JSON 响应:适用于 API 返回数据。
return response()->json($products);
文件下载:用于返回文件下载。
return response()->download($filePath);
控制器中可以使用 Laravel 的验证功能,确保请求的数据是有效的。你可以使用 validate
方法进行表单数据验证。
示例:
public function store(Request $request)
{
// 验证请求数据
$validated = $request->validate([
'name' => 'required|max:255',
'price' => 'required|numeric',
]);
// 验证通过后,保存数据
$product = new Product($validated);
$product->save();
return redirect()->route('products.index');
}
如果数据验证失败,Laravel 会自动返回错误信息并重定向到原来的页面。
学习路线:
Route::resource
快速生成 CRUD 路由。管理控制器中的依赖关系,如何确保数据有效性。
每个步骤都是为了帮助你建立一个更清晰、规范的架构,使你的 Laravel 应用更易于维护和扩展。