Laravel团队发布了9.18版本

113 阅读4分钟

Laravel团队发布了9.18版本, 其中充满了令人惊叹的功能和生活质量的改善.让我们来看看Laravel 9中突出的功能的高级细节!

Laravel 9.18.0今天发布了。自然,它有一些*火*的功能,我想你会喜欢。让我们跳进去。

首先,@timacdonald87介绍了一个新的方法, 如果你在一个请求中查询数据库的累计时间超过了一个阈值, 就会调用一个闭包 ⌛pic.twitter.com/TBPA4P6Rx3

改进邮件和通知的文件附件

Tim MacDonald贡献了可附加对象,你可以用它来实现模型的附件。

namespace App\Models;
 
use Illuminate\Contracts\Mail\Attachable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Mail\Attachment;
 
class Photo extends Model implements Attachable
{
    /**
     * Get the attachable representation of the model.
     *
     * @return \Illuminate\Mail\Attachment
     */
    public function toMailAttachment()
    {
        return Attachment::fromPath('/path/to/file');
    }
}

当构建电子邮件时,你可以通过attach() 方法传递模型的一个实例。

public function build()
{
    return $this->view('photos.resized')
                ->attach($this->photo);
}

可调用的验证类

Tim MacDonald贡献了可调用的验证类。

这个PR旨在引入一个新的基于类的验证实现,通过引入一个可调用的验证规则,将基于Closure的规则的简洁性和基于类的规则的可共享性、可扩展性和可连锁性结合起来。

下面是Pull Request #42689中的一个实现示例。

class InvokableQuantity implements InvokableRule
{
    public function __invoke($attribute, $value, $fail)
    {
        if (! is_array($value)) {
            return $fail('validation.quantity.must_be_an_object')->translate();
        }
 
        if (! array_key_exists('magnitude', $value)) {
            $fail('validation.quantity.missing_magnitude')->translate();
        }
 
        if (! array_key_exists('units', $value)) {
            $fail('validation.quantity.missing_units')->translate();
        }
    }
}

通过一个嵌套数组定义嵌套的 "与 "关系

Tim MacDonald贡献了一种通过嵌套数组来定义嵌套的急于加载关系的方法。

// Using dot notation
$books = Book::with('author.contacts')->get();
 
// Nested array
$books = Book::with([
    'author' => [
        'contacts',
        'publisher',
    ],
])->get();

为Illuminate Request对象添加主机方法

Pull Request #42797在Illuminate Request实例上提供了三个便利方法,以访问底层的Symphony方法。

$request->host(); // getHost()
$request->httpHost(); // getHttpHost()
$request->schemeAndHttpHost(); // getSchemeAndHttpHost()

可调用的验证规则可以向嵌套属性推送信息

Tim MacDonald贡献了可调用的验证规则将错误推送到嵌套和其他属性的能力。

class UserRule implements InvokableRule
{
    public function __invoke($attribute, $value, $fail)
    {
        if (! is_array($attribute) || array_is_list($attribute)) {
            return $fail('Must be an object.'); // apply to $attribute
        }
 
        if (! array_key_exists('name', $attribute)) {
            return $fail("{$attribute}.name", 'Is required.'); // apply to nested attribute
        }
 
        /* ... */
    }
}

鉴于上述实现,这里有一个使用例子。

 Validator::make(
    [
        'user_1' => ['xxxx'],
        'user_2' => ['age' => 23],
    ],
    [
        'user_1' => [new UserRule()],
        'user_2' => [new UserRule()],
    ]
);
 
// errors...
[
    'user_1' => ['Must be an object.'],
    'user_2.name' => ['Is required.'],
]

引入fake()帮助器

Tim MacDonald贡献了一个全局性的fake() 辅助函数,允许你轻松地访问一个单子faker实例。在进行原型设计、测试以及生成工厂和种子数据时,使用这个帮助器是很有帮助的。

@for($i = 0; $i < 10; $i++)
    <dl>
        <dt>Name</dt>
        <dd>{{ fake()->name() }}</dd>
 
        <dt>Phone</dt>
        <dd>{{ fake()->phoneNumber() }}</dd>
 
    </dl>
@endfor

下面是一个针对本地的faker使用的例子。

fake()->name() // config('app.faker_locale') ?? 'en_US'
fake('en_AU')->name() // en_AU

累计查询时间限制回调

Tim MacDonald贡献了一个在累计查询限制时间后的回调处理程序。

DB::handleExceedingCumulativeQueryDuration(Interval::seconds(5), function (Connection $connection) {
    Log::warning("Database queries exceeded 5 seconds on {$connection->getName()}");
});

发布说明

你可以在GitHub上看到以下完整的新功能和更新列表以及9.17.0和9.18.0之间的差异。下面的发行说明直接来自更新日志

v9.18.0

新增

  • 改进邮件和通知的文件附件(#42563)
  • 引入可调用的验证类(#42689)
  • Predis v2.0(#42577)
  • 添加Illuminate/View/Compilers/Concerns/CompilesConditionals::compileReadonly() (#42717)
  • 在游标分页中应用union查询生成器的where's (#42651)
  • 增加了将 "与 "关系定义为嵌套数组的功能(#42690)
  • 增加了在广播事件中设置后退的能力(#42737)。
  • 为Request添加了host()、httpHost()、schemeAndHttpHost() (#42797)
  • 允许可调用的规则将消息推送到嵌套(或其他)属性(#42801)。
  • 在View编译器中添加了compilePushIf和compileEndpushIf函数(#42762)
  • 新增: 允许在测试中移除token(#42841)
  • Illuminate/Console/GeneratorCommand 中为 reservedNames 数组添加了 predefined_constants(#42832)
  • 处理围绕单个枚举的集合创建(#42839)
  • 在whereNotMorphedT中允许可归零的形态(#42878)
  • 引入一个fake()助手来解决faker的单体,按地区划分(#42844)
  • 允许处理每个DB连接的累计查询时间限制(#42744)。
  • 为make rule命令添加可调用选项(#42742)

修正了

  • 修复route:list命令中的废弃错误(#42704)。
  • 固定请求offsetExists而不使用routeResolver(#42754)。
  • 修正了。松散的比较导致数值不能被保存(#42793)
  • 固定了。修复数据库会话驱动程序不断重设CSRF令牌(#42782)
  • 修正了。Arr::map--修复map-by-reference w/ built-ins(#42815)
  • 修复了联赛/飞行系统建议(#42872)

更改了

  • 在TestResponse中启动会话,允许从JSON中提取错误包(#42710)。
  • 重命名Illuminate/Broadcasting/BroadcastManager 中的方法(753e9fd)
  • 避免在Illuminate/Filesystem/FilesystemAdapter::mimeType() 中抛出无效的mime-type(#42761)
  • Illuminate/Filesystem/FilesystemAdapter 中不解决已经设置的头文件(#42760)
  • 标准化可调用的规则转换功能(#42873)
  • 在使用箭头设置属性时清除缓存(#42852)