Laravel 10如今正在成为头条新闻。但是,许多应用程序被卡在较旧版本中,或者至少仍使用旧版本的语法和方法。 Laravel 9中引入的最重要的变化之一是访问者和突变器的语法。
旧的语法使用了一个简单的约定,只需将'get'或set''''get''属性'和诸如getFullNameAttribute
和setFullNameAttribute
之类的单词之间包裹起来。在新的语法中,您可以通过键入返回类型的Illuminate\Database\Eloquent\Casts\Attribute
(docs)来定义登录器和突变器:
use Illuminate\Database\Eloquent\Casts\Attribute;
public function name(): Attribute
{
return new Attribute(
get: fn ($value) => strtoupper($value),
set: fn ($value) => $value,
);
}
虽然旧的语法仍然可用,但将来可能会被删除,或者可能会使Laravel Newcomers感到困惑,因此最好尽快更快而不是稍后更新它。您可以手动修改这些方法,也可以使用自动化工具,例如Rector。这是一种开源工具,可以升级PHP项目并为您自动化无聊的东西。
您可以使用composer require rector/rector --dev
安装校长。除了核心包装外,我们还需要另一个专门针对Laravel应用程序量身定制的package。您可以使用composer require driftingly/rector-laravel:dev-main --dev
安装它,并使用vendor/bin/rector init
启动配置文件。
您只需要应用一个校长规则即可自动迁移到新的语法。只需在您的rector.php
文件中写下这个:
<?php
declare(strict_types=1);
use Rector\Config\RectorConfig;
use RectorLaravel\Rector\ClassMethod\MigrateToSimplifiedAttributeRector;
return static function (RectorConfig $rectorConfig): void {
$rectorConfig->paths([
__DIR__ . '/app',
]);
$rectorConfig->rule(MigrateToSimplifiedAttributeRector::class);
};
它将照顾迁移所有雄辩的模型以使用新的语法。如果您发现一个错误或出了点问题,请告诉我。该校长规则由您的图书馆贡献。
有一个陷阱
旧的语法使您可以根据需要使用登录器和突变器。因此,如果您有getFullNameAttribute()
,则可以使用它,例如$user->full_name
或$user->fullName
。两者都可以工作。 Laravel 9中的新属性仍然使您可以使用两种情况,但是,如果您使用Camel Case将属性附加到模型中,那么您会有些运气。假设您有protected $appends = ['firstName'];
,您将看到此错误:Call to undefined method App\Models\User::getFirstNameAttribute()
。
问题在于Laravel正在尝试使用Snake Case名称确定您的属性,但找不到它(我们正在执行protected function firstName(): Attribute
),因此默认为搜索旧语法中的属性并且失败。
要克服这一点,您需要仔细检查雄辩的$appends
属性或将您应用于使用camelCase
名称的登录器或突变器的任何其他手动附加。将它们更改为蛇案。另外,如果您在前端使用模型,请检查前端逻辑是否仍在工作。更好的是,在您迁移到新语法之前进行这些更改并事先检查它们。我知道,现在看起来并不有趣,但是无论如何您要在一个周末做什么?
我发现的另一个黑客解决方案是通过在模型中使用此方法来禁用属性蛇外壳:public static $snakeAttributes = false;
。这将使您的所有错误都消失,无论其套管如何,都会正确找到属性。但是,我认为这也习惯于determine the names of model relationships,它也可能对它们产生影响。我认为您不应该采用这种方法,您最安全的选择是不要立即升级引起此问题的突变器/登录器。
总的来说,Laravel 9中针对登录和突变器的新语法提供了一种更直观和可读性的方式,可与雄辩的模型合作。通过将现有代码升级到新的语法,您可以利用最新功能和增强功能,并确保您的代码更加可维护和易于阅读。