在 Laravel 中,mutators 和 accessors 允许你在数据被保存到数据库和从数据库中获取之前改变它。具体来说,mutator 允许您在将数据保存到数据库之前对其进行更改。另一方面,访问器允许您在从数据库中获取数据后更改数据。
事实上,Laravel 模型是您可以创建 mutator 和 accessor 方法的中心位置。当然,最好将所有修改都放在一个地方,而不是分散在不同的地方。
在模型类中创建访问器和修改器
由于您现在熟悉了 mutators 和 accessors 的基本概念,我们将继续开发一个真实世界的示例来演示它。
我假设您知道 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
为了运行本文中的示例,您需要name
在表中创建列post
。无论如何,我们不会详细介绍迁移的细节,因为这超出了本文的范围。
突变器方法
首先,让我们通过 mutator 方法。
protected function name(): Attribute { return Attribute::make( #get: fn ($value) => ucfirst($value), set: fn ($value) => strtolower($value), ); }
正如我们之前所讨论的,mutator 用于在将数据保存到数据库之前对其进行更改。如您所见,mutator 方法的语法是{attribute-name}
. 当然,您需要{attribute-name}
用驼峰式的实际属性名称替换。需要注意的是,所有访问器和修改器方法都返回一个Attribute
实例,该实例定义了如何访问和修改属性。
set
在属性上调用 mutator 方法时使用该参数。为了简单起见,我们刚刚使用了这个strtolower
函数,它在将帖子标题保存到数据库之前将其转换为小写。
通过这种方式,您可以在表的所有列上创建 mutator 方法。接下来,让我们来看看访问器方法。
访问器方法
如果 mutator 用于在将数据保存到数据库之前更改数据,则访问器方法用于在从数据库获取数据后更改数据。要定义访问器方法,您需要get
在定义属性时提供参数。
让我们来看看访问器方法。
protected function name(): Attribute { return Attribute::make( get: fn ($value) => ucfirst($value), #set: fn ($value) => strtolower($value), ); }
从数据库中获取属性get
的值后,将调用该参数。name
在我们的例子中,我们刚刚使用了该ucfirst
方法来更改帖子标题。
到目前为止,我们刚刚创建了 mutator 和 accessor 方法,但我们将在下一节中测试它们。
突变体在行动
让我们在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
列的值设置为 value,post title
因为我们已经strtolower
在相应的 mutator 方法中使用了该函数。
行动中的访问者
要查看访问器的实际作用,让我们继续创建一个控制器文件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 的 mutators 和 accessors 的概念。它提供了一种在将数据保存到数据库和从数据库中获取之前更改数据的好方法。
- 突变器方法
- 访问器方法