Laravel101:在控制器中实现RESTFUL架构
#教程 #php #laravel #laravel101

在我们的项目中,我们在制定任务模型和评估提交信息方面取得了进展。本文和即将发表的本文的目的是将静止的体系结构引入我们的项目。到本教程结束时,您将学习一种编程模式,不仅可以提高代码的可读性和清洁度,而且还可以使编程更有趣。相信我!


RESTFUL 架构,代表性状态转移的缩写,顾名思义,增强了代码可读性。在Laravel中,有一个预定义的模板,我们将用于修改现有代码。首先,让我们检查下表,取自Laravel documentation

Image description

表将发送到服务器的HTTP请求的主要特征分为四种类型: get post put 删除 get 用于检索信息, post 用于保存记录, put 用于更新记录, delete 用于删除记录。在Laravel中,相应地定义了路径和功能的名称。因此,通过简单地查看定义的路径,您可以轻松地了解控制器中的相应功能及其目的。

现在,让我们继续执行这些原则,逐步执行我们现有的代码:

Image description

我只是简单地定义了我在新添加的功能中不做任何事情。

然后让我们回到路由并修改所有任务路由:

Route::get('/tasks', [TaskController::class, 'index'])->name('tasks.index');
Route::get('/tasks/create', [TaskController::class, 'create'])->name('tasks.create');
Route::post('/tasks', [TaskController::class, 'store'])->name('tasks.store');
Route::get('/tasks/{task}', [TaskController::class, 'show'])->name('tasks.show');
Route::get('/tasks/{task}/edit', [TaskController::class, 'edit'])->name('tasks.edit');
Route::patch('/tasks/{task}', [TaskController::class, 'update'])->name('tasks.update');
Route::delete('/tasks/{task}', [TaskController::class, 'destroy'])->name('tasks.destroy');

我决定将任务页面移至新页面,让主页一个简单的登录页面为我们的项目!

现在,让我们定义每个页面以及我们需要按页面实现的所有必要组件。在这里,我只为其余的其他空白刀片页面添加!以及我们将在本文中浏览的新路线:

Image description

让我们从索引页面开始,我们希望列出所有任务。第一件事是,我们必须将IT IT在TaskController中的视图从home更改为tasks.index,然后将所有内容转移到New Directory tasks/index.blade.php

Image description

是!

创建功能也是一个简单的任务。我们只需要定义一个视图功能,然后将其指向tasks/create.blade.php。我这样做并试图打开页面,但它抛出了一个例外,表明我们需要更改页面中使用的路由名称。

Image description

好吧,这是我们恢复设计的地方。当您遵守此设计原则时,您将知道如何命名每个页面的路线。这样,您可以避免像我们刚刚经历的那样遇到错误的不便。

现在,让我们尝试存储新任务并看到它有效。

Image description

什么?如果您查看表格,您会发现路由是正确的,但是找不到邮政请求的请求。请注意表格的动作部分。

当前,我们在另一个页面上,特别是http://localhost:8000/tasks/create。因此,在以形式定义操作时,我们需要从根部启动路径,而不是从tasks开始,而只是意味着我们需要在开始时使用â/',或者您可以使用route helper函数:

Image description

错误已经解决了,这很简单,但是这是事实:创建一个新任务后,我们希望将其重定向回任务页面。为了实现这一目标,我们使用了我的选择,而不是我喜欢使用重定向函数!使用此功能,我们可以定义重定向页面的确切是什么!

您可能已经注意到我对错误部分进行了更改,以提高其功能,并确保显示后端收到的所有错误。我进行的简单修改是利用All()函数,该函数将错误对象数据作为数组。这使我们可以轻松访问并显示所有错误消息。

现在,让我们继续进入任务显示页面。由于我们已经实施了这条路线,因此我们只需要在此处遵循两个步骤。首先,我们导航到控制器并定义show函数以处理请求。最后,我们使用刀片管理信息显示。

让我们展示路线:

Route::get('/tasks/{task}', [TaskController::class, 'show'])->name('tasks.show');

这里的关键区别是动态路径。让我们仔细研究一下我们发送到服务器的变量:

Image description

通过向服务器发送任何值,我们可以在show函数中检索并显示适当的输出。让我们完成功能并尝试一下。

Image description

我刚刚制作了一个简单的节目页面!

一切似乎都正常工作,但是如果我们输入不正确的ID怎么办?在这种情况下,用户会遇到服务器异常。通过显示404错误页面来处理这种情况很重要,表明所请求的项目不存在。值得庆幸的是,Laravel使用雄辩为此提供了解决方案:

// findOrFail
$task = Task::findOrFail($id);

// or firstOrFail
$task = Task::where('id', $id)->firstOrFail();

这两种方法正常工作,但是让Laravel的内置结合,因为它更简单。

通过指定我们在show函数中收到的变量类型,Laravel自动识别它并执行一个称为绑定的过程,以找到我们的相应记录。此外,如果它没有通过模型找到记录,它将返回相同的404错误:

public function show(Task $task)
{
    return view('tasks.show', compact('task'));
}

那样简单!

太好了!现在,我们只剩下两件事:编辑和删除任务。

要编辑任务,首先我们需要加载我们要编辑和填充表单的记录数据,类似于歌曲创建表单,并使用初始数据,因此我们的编辑功能看起来像这样:

public function edit(Task $task)
{
    return view('tasks.edit', compact('task'));
}

现在,让我们只将创建表单复制到编辑页面中。我们需要做出的第一个更改是在输入字段中使用传递的数据。但是,我们要确保如果更新请求失败并返回错误,则先前输入的值将在输入字段中填充。为了处理这一点,我们可以使用旧()方法。这是代表任务标题的输入字段的示例:“”

<input ... value="{{ old("title") ?? $task->title }}" />

此代码检查是否存在任何先前输入的值(old(“ title”)),如果没有,则返回到原始任务标题值($ task-> title)。

此外,我们需要更新编辑表格的路由,您还必须更新它:

<form method="POST" action={{ '/tasks/' . $task->id }} > ...

或仅使用route Helper功能,该功能提供了一种更清洁,更可读的方法。在这种情况下,您可以将路由名称tasks.update指定为第一个参数,并将任务ID传递为第二个参数:

<form method="POST" action={{ route('tasks.update', $task->id) }} > ...

最后一步是更改请求类型,以添加/修补编辑表单。但是,在HTML表单中,我们只能使用帖子或获取方法。为了克服此限制,Blade提供了一个有用的功能,称为@Method:

<form method="POST" action={{ route('tasks.update', $task->id) }}>
    @method('PUT')
    <!-- Rest of the form -->
</form>

通过将@method('put')包括在表单中,Blade将生成一个隐藏的输入字段,该字段覆盖了表单方法并将其设置为放置。这样,当提交表格时,它将被视为看好。

Image description

最后,删除操作,就像之前我们需要更新销毁功能作为bellow,并使用另一个雄辩的辅助函数,称为删除为bellow:

public function destroy(Task $task)
{
    $task->delete();
    return redirect("/tasks");
}

但是我们应该如何和何处称呼此动作!

要克服这个,我们可以在task.index中添加另一个简单的表单,喜欢编辑页面在表单中定义删除方法:

Image description


出色的工作!您成功地实现了所有必要的功能,以便在遵循Rentful结构的同时使用Laravel中的模型。如您所见,代码变得更短,更易于阅读。令人印象深刻,是吗?

现在,让我们再次看一下routes/web.php。想象一下,拥有一个大型项目,其中有数十个模型。每个模型的编写重复路径函数可以是长列表。但是不用担心! Laravel对此有解决方案。

Route::resource('tasks', TaskController::class);

通过使用此方法,我们实际上定义了等同于我们先前定义的所有路径等效的路径。它使您摆脱了每个模型编写重复代码的麻烦。

我想提到另一件事。 Laravel Artisan Command提供了一些漂亮的选项,可以使您的生活在生成控制器时更加轻松。例如,使用一个简单的命令,您可以创建我们前面在控制器前面讨论的所有必要功能,从一开始:

php artisan make:controller TestController -r -m Task

我希望您能发现本教程愉快且内容丰富。到目前为止,您做得很好!如果您还有更多问题或需要进一步的帮助,请随时提出。愉快的编码!