PHP laravel框架 路由与控制器的使用

1. Laravel 路由基础

1.1 路由是什么?

路由是 Laravel 的核心功能之一,决定了当用户访问不同的 URL 时,系统应该执行什么样的操作。可以理解为请求和响应的桥梁,路由决定了 HTTP 请求(如 GET、POST 等)应该被哪个控制器、方法或者闭包函数来处理。

路由通常会出现在 routes/web.php(处理浏览器请求)或者 routes/api.php(处理 API 请求)中。

1.2 基本路由

在 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'); } 是定义一个简单的闭包,返回的是一个视图页面。

1.3 HTTP 请求方法

Laravel 路由支持多种 HTTP 请求方法,常见的有:

  • Route::get():处理 GET 请求,通常用于获取数据。
  • Route::post():处理 POST 请求,通常用于提交表单数据。
  • Route::put():处理 PUT 请求,通常用于更新数据。
  • Route::delete():处理 DELETE 请求,通常用于删除数据。

例如:

Route::post('/submit', function () {
    return 'Form Submitted';
});

上面的代码定义了一个 POST 请求路由,用于处理表单提交。

1.4 路由参数

Laravel 允许路由中包含动态参数。这些参数会从 URL 中提取,并传递到控制器或闭包函数中。

定义带参数的路由:

Route::get('/user/{id}', function ($id) {
    return "User ID: " . $id;
});

  • {id} 是一个动态参数,表示 URL 中的部分内容。
  • function ($id) 中的 $id 会接收到 URL 中的值。

例如,访问 /user/123 会返回 "User ID: 123"。

1.5 路由约束

你可以为路由参数定义约束,确保传递的参数符合预期。例如,限制 id 参数必须是数字。

Route::get('/user/{id}', function ($id) {
    return "User ID: " . $id;
})->where('id', '[0-9]+');

这个路由将只允许数字作为 id

1.6 命名路由

命名路由允许你为路由设置一个名称,方便在应用的其他地方引用该路由。

Route::get('/profile', function () {
    return 'Profile Page';
})->name('profile');

在视图或控制器中,你可以通过路由名称生成 URL:

$url = route('profile');  // 返回 /profile 的 URL

1.7 路由中间件

中间件是 Laravel 用来过滤 HTTP 请求的机制。你可以在路由上使用中间件来做认证、日志记录、请求过滤等。

示例:

Route::get('/profile', function () {
    return 'Profile Page';
})->middleware('auth');  // 仅授权用户可以访问

auth 中间件确保只有已经登录的用户才能访问 /profile 路由。

2. 控制器基础

2.1 控制器是什么?

控制器是 Laravel 中用来处理请求的类。控制器将路由与业务逻辑分离,使得代码更加清晰、可维护。控制器包含方法,这些方法会被路由调用来处理用户请求。

2.2 创建控制器

Laravel 提供了 Artisan 命令来创建控制器。

php artisan make:controller ProductController

这个命令会在 app/Http/Controllers 目录下创建一个名为 ProductController.php 的文件。

2.3 控制器方法

控制器的方法处理请求并返回响应。例如,你可以在控制器中添加 indexshow 方法来处理不同的请求:

// 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'));  // 返回视图
    }
}

2.4 路由与控制器结合

将路由和控制器方法结合起来,Laravel 会根据请求 URL 来调用相应的控制器方法。

routes/web.php 中定义路由:

// routes/web.php
Route::get('/products', [ProductController::class, 'index']);
Route::get('/products/{id}', [ProductController::class, 'show']);

上面的代码中,当用户访问 /products 时,会触发 ProductControllerindex 方法;当访问 /products/{id} 时,会触发 show 方法。

2.5 资源路由

Laravel 提供了一种快捷的方式来处理常见的 CRUD 路由:资源路由

php artisan make:controller ProductController --resource

这个命令会为控制器自动生成 CRUD 操作(indexcreatestoreshoweditupdatedestroy)的方法。

资源路由定义:

Route::resource('products', ProductController::class);

Laravel 会自动为你的控制器生成七个常见的路由,分别处理 CRUD 操作。

2.6 控制器中的依赖注入

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 并将其传递给控制器。

2.7 控制器返回的内容

控制器方法通常会返回以下几种类型的内容:

  1. 视图:用于返回 HTML 页面。

    return view('products.index', compact('products'));
    
    
  2. 重定向:用于将用户重定向到其他路由。

    return redirect()->route('products.index');
    
    
  3. JSON 响应:适用于 API 返回数据。

    return response()->json($products);
    
    
  4. 文件下载:用于返回文件下载。

    return response()->download($filePath);
    
    

2.8 表单验证

控制器中可以使用 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 会自动返回错误信息并重定向到原来的页面。

总结

学习路线:

  1. 理解路由与控制器:从基本的路由定义到复杂的参数和中间件,熟悉路由如何指向控制器。
  2. 掌握控制器的基础:了解控制器如何接收请求,如何组织和管理逻辑。
  3. 学习资源路由:学会使用 Route::resource 快速生成 CRUD 路由。
  4. 深入了解依赖注入与验证:学会如何

管理控制器中的依赖关系,如何确保数据有效性。

每个步骤都是为了帮助你建立一个更清晰、规范的架构,使你的 Laravel 应用更易于维护和扩展。

你可能感兴趣的:(php,数据库,mysql)