卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章16739本站已运行3320

Laravel中的优雅访问器和修改器

Laravel中的优雅访问器和修改器

在本文中,我们将介绍 Laravel Web 框架中 Eloquent ORM 的修改器和访问器。介绍完毕后,我们将通过一些示例来理解这些概念。

在 Laravel 中,修改器和访问器允许您在将数据保存到数据库或从数据库中获取数据之前更改数据。具体来说,变异器允许您在将数据保存到数据库之前更改数据。另一方面,访问器允许您在从数据库获取数据后更改数据。

事实上,Laravel 模型是您可以创建修改器和访问器方法的中心位置。当然,将所有修改放在一个地方而不是分散在不同的地方是件好事。

在模型类中创建访问器和修改器

既然您现在已经熟悉了修改器和访问器的基本概念,我们将继续开发一个实际示例来演示它。

我假设您了解 Laravel 中的 Eloquent 模型,我们将使用 Post 模型作为示例的起点。如果您还没有创建 Post 模型,让我们使用 artisan 命令来创建它。

php artisan make:model Post --migration

这应该在 app/Post.php 中创建一个模型文件,如下所示。

<?php
 
namespace App;
 
use Illuminate\Database\Eloquent\Model;
 
class Post extends Model
{
    //
}

让我们用以下内容替换该文件的内容。

<?php
namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Casts\Attribute;

class Post extends Model
{
    /**
     * Interact with the user's name attribute.
     *
     * @param  string  $value
     * @return \Illuminate\Database\Eloquent\Casts\Attribute
     */
    protected function name(): Attribute
    {
        return Attribute::make(
            get: fn ($value) => ucfirst($value),
            set: fn ($value) => strtolower($value),
        );
    }
}

由于我们使用了 --migration 选项,它还应该创建关联的数据库迁移。以防万一您不知道,您可以运行以下命令,以便它实际在数据库中创建表。

php artisan migrate

为了运行本文中的示例,您需要在 post 表中创建 name 列。无论如何,我们不会详细讨论迁移的细节,因为这超出了本文的范围。

Mutator 方法

首先,我们来看看 mutator 方法。

protected function name(): Attribute
{
    return Attribute::make(
        #get: fn ($value) => ucfirst($value),
        set: fn ($value) => strtolower($value),
    );
}

正如我们之前讨论的,修改器用于在将数据保存到数据库之前更改数据。如您所见,mutator 方法的语法为 {attribute-name}。当然,您需要将 {attribute-name} 替换为驼峰大小写的实际属性名称。需要注意的是,所有访问器和修改器方法都会返回一个 Attribute 实例,该实例定义如何访问和修改属性。

在属性上调用 mutator 方法时,将使用 set 参数。为了简单起见,我们只使用了 strtolower 函数,该函数在将帖子标题保存到数据库之前将其转换为小写。

通过这种方式,您可以在表的所有列上创建变异方法。接下来,我们来看看访问器方法。

访问器方法

如果在将数据保存到数据库之前使用变元来更改数据,则访问器方法用于在从数据库获取数据后更改数据。要定义访问器方法,您需要在定义属性时提供 get 参数。

让我们看一下访问器方法。

protected function name(): Attribute
{
    return Attribute::make(
        get: fn ($value) => ucfirst($value),
        #set: fn ($value) => strtolower($value),
    );
}

从数据库获取 name 属性的值后,将调用 get 参数。在我们的例子中,我们刚刚使用 ucfirst 方法来更改帖子标题。

到目前为止,我们刚刚创建了赋值器和访问器方法,但我们将在接下来的部分中测试它们。

变异器的作用

让我们在 app/Http/Controllers/MutatorController.php 创建一个控制器,以便我们可以测试我们在前面部分中创建的 mutator 方法。

<?php
// app/Http/Controllers/MutatorController.php
namespace App\Http\Controllers;
 
use App\Post;
use App\Http\Controllers\Controller;
 
class MutatorController extends Controller
{
    public function index()
    {
        // create a new post object
        $post = new Post;
        $post->name = 'Post Title';
        $post->save();
    }
}

此外,您还需要在 routes/web.php 文件中创建关联的路由才能访问 mutator 控制器。

Route::get('mutator/index', 'MutatorController@index');

index 方法中,我们使用 Post 模型创建一个新帖子。它应该将 name 列的值设置为 post title 值,因为我们在相应的 mutator 方法中使用了 strtolower 函数。

操作中的访问器

要查看操作中的访问器,让我们继续创建一个包含以下内容的控制器文件 app/Http/Controllers/AccessorController.php

<?php
namespace App\Http\Controllers;
 
use App\Post;
use App\Http\Controllers\Controller;
 
class AccessorController extends Controller
{
    public function index()
    {
        // load post
        $post = Post::find(1);
         
        // check the name property, it should be output of the ucfirst function
        echo $post->name;
        exit;
    }
}

同样,您需要在 routes/web.php 文件中使用关联的路由来访问访问器控制器。

Route::get('accessor/index', 'AccessorController@index');

index 方法中,我们首先使用 Post 模型来加载示例帖子。

接下来,我们检查 name 列的值,它应该以大写字母开头,因为我们已经为该列定义了访问器方法。

这就是 Eloquent 变异器和访问器的工作原理!

结论

今天,我们探讨了 Laravel 中 Eloquent ORM 的修改器和访问器的概念。它提供了一种在将数据保存到数据库和从数据库中提取数据之前更改数据的好方法。

对于那些刚刚开始使用 Laravel 或希望通过扩展来扩展您的知识、网站或应用程序的人,我们在 Envato Market 上提供了多种可供您学习的内容。

卓越飞翔博客
上一篇: 创建可测试和可维护的 PHP 代码
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏