Laravel 访问器中的值对象及性能提升

Laravel 的 Eloquent ORM 通过内置缓存和值对象支持增强了访问器功能。这些特性能够有效地处理复杂的计算和结构化数据,同时保持干净、可维护的代码。

当处理计算成本高昂的操作或需要将复杂的数据结构表示为适当的对象而不是普通数组时,这种方法被证明特别有价值。

1
2
3
4
5
6
protected function complexStats(): Attribute
{
return Attribute::make(
get: fn () => $this->calculateStats()
)->shouldCache();
}

下面是一个使用值对象实现位置处理的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php

namespace App\Models;

use App\ValueObjects\Location;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Casts\Attribute;

class Store extends Model
{
protected function location(): Attribute
{
return Attribute::make(
get: fn ($value) => new Location(
latitude: $this->latitude,
longitude: $this->longitude,
address: $this->address,
timezone: $this->timezone
),
set: function (Location $location) {
return [
'latitude' => $location->latitude,
'longitude' => $location->longitude,
'address' => $location->address,
'timezone' => $location->timezone
];
}
)->shouldCache();
}

protected function operatingHours(): Attribute
{
return Attribute::make(
get: fn () => $this->calculateHours()
)->withoutObjectCaching();
}

private function calculateHours()
{
// Dynamic calculation based on timezone and current time
return $this->location->getLocalHours();
}
}
1
2
3
4
5
6
$store = Store::find(1);
$store->location->address = '123 New Street';
$store->save();

// Access operating hours (recalculated each time)
$hours = $store->operatingHours;

Laravel 的访问器特性为处理复杂的数据结构和通过智能缓存优化性能提供了强大的工具

Laravel 访问器中的值对象及性能提升 | 日思录