Laravel 资源控制器
Laravel资源控制器可以用一行代码提供CRUD路由给控制器。资源控制器用于创建一个处理应用程序中的所有HTTP请求的控制器。
resource() 是一个静态函数,类似于get() 方法,它可以在控制器中使用多个路由。
resource() 方法的语法:
Route::resource(‘posts’, ‘PostController’);
在上面的语法中,’posts’ 包含所有的路由,’PostController’ 是控制器的名称。在这种情况下,我们不需要像在get() 方法中那样指定方法的名称,比如@index,因为create()、store()、destroy() 方法已经在PostController类中可用。
让我们通过一个例子来理解:
步骤1: 使用以下命令创建控制器:
php artisan make:controller PostController -resource;
上述命令将在 app/Http/Controllers/PostController.php 目录下创建控制器。 PostController 类包含每个资源操作的方法。
PostController.php文件的结构如下所示:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PostController extends Controller
{
/**
* Display a listing of the resource.
* @return \Illuminate\Http\Response
*/
public function index()
{
//
}
/**
* Show the form for creating a new resource.
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request request
* @return \Illuminate\Http\Response
*/
public function store(Requestrequest)
{
//
}
/**
* Display the specified resource.
* @param int id
* @return \Illuminate\Http\Response
*/
public function show(id)
{
//
}
/**
* Show the form for editing the specified resource.
* @param int id
* @return \Illuminate\Http\Response
*/
public function edit(id)
{
//
}
/**
* Update the specified resource in storage.
* @param \Illuminate\Http\Request request
* @param intid
* @return \Illuminate\Http\Response
*/
public function update(Request request,id)
{
//
}
/**
* Remove the specified resource from storage.
* @param int id
* @return \Illuminate\Http\Response
*/
public function destroy(id)
{
//}}
步骤2: 现在,我们需要将资源路由注册到控制器,可以按照以下方式完成:
Route::resource('posts','PostController');
打开Git Bash窗口,并输入以下命令 php artisan route:list 。该命令产生以下输出:
resource()方法中的post参数生成了上述输出中显示的名称或资源及其对应的方法。在上述输出中,posts.destroy将参数发送到Delete方法,这在Laravel中非常特殊。
通过一个例子来理解资源的概念。
访问PostController类的show()方法
假设我们想调用PostController.php文件中的show()方法。为此,在show()方法中添加以下代码:
public function show(id)
{
return "show method is called and ID is : ".id;
}
如我们所知, posts.show 的URI是posts/{posts},这意味着我们需要输入参数才能访问 PostController 类的show()方法。
假设我输入的URL是 localhost/laravelproject/public/posts/58 ,那么输出将是:
访问PostController类的create()方法
步骤1: 首先,我们需要在create()方法中添加代码。我添加了以下代码:
public function create()
{
return "This is the create method";
}
如我们所知,posts.create
的 URI 是 posts/create
,所以访问 create()
方法的 URL 会是 localhost/laravelproject/public/posts/create
。
步骤2: 在浏览器中输入URL localhost/laravelproject/public/posts/create
,然后输出结果会是:
多个控制器的路由注册
我们可以通过将一个数组传递给 resources() 方法来注册多个控制器的路由。假设我想要注册两个控制器的路由,比如 PostController 和 StudentController 。以下是实现这一目标的步骤:
步骤1: 首先,您需要使用以下命令创建 PostController 和 StudentController :
Php artisan make:controller PostController; // to create the PostController.
Php artisan make:controller StudentController; // to create the StudentController.
步骤2: 将以下代码添加到 web.php 文件中注册路由:
route::resources(
['posts'=>'PostController',
'student'=>'StudentController']
);
步骤3: 在 Git Bash 窗口中输入命令 php artisan route:list 。
上述屏幕显示了PostController和StudentController的路由都已注册。
部分资源路由
当我们不想为所有的方法注册路由时,我们可以只指定控制器可以处理的那些函数。
创建部分资源路由的步骤:
步骤1: 首先,我们使用以下命令创建StudentController:
php artisan make:controller StudentController;
步骤2: 现在,在 web.php 文件中添加以下命令以创建Partial资源路由。
Route::resource('student','StudentController',['only' => ['create','show']]);
步骤3: 要验证以上代码是否已为指定的方法注册了路由,请在Git Bash窗口上输入命令’ php artisan route:list‘。
上面的屏幕显示创建(create())和显示(show())方法的路由已经生成。
命名资源路由
控制器的所有方法都有默认的路由名称,但Laravel允许您通过传递名称数组来覆盖路由名称。名称数组包含您想要指定的路由的名称。
让我们通过一个例子来了解“命名资源路由”。
- 我们可以在 web.php 文件中添加以下代码来命名资源路由。
Route::resource('student', 'StudentController',['names' => ['create' =>'student.build']]);
- 现在,在 Git Bash 窗口中输入以下命令: php artisan route:list
上述屏幕显示了create()方法的路由名称已被重命名为 student.build ,其默认名称为 student.create 。
命名资源路由参数
Route::resource() 方法自动为所有资源路由生成路由参数,但我们可以使用参数数组覆盖路由参数。参数数组是一个包含资源名称和路由参数的关联数组。
- 我们可以在 web.php 文件中添加以下代码来覆盖路由参数:
Route::resource('student', 'StudentController', ['parameters' => ['student' => 'admin_student']]);
以上代码为路由参数赋值,即 admin_student 为 student 资源。
- 要检查所有路由参数的列表,使用以下命令: php artisan route:list 。
上面的屏幕显示了一个路由中添加了 admin_student 参数。