Laravel 集合/模型的类型提示闭包

Posted

技术标签:

【中文标题】Laravel 集合/模型的类型提示闭包【英文标题】:Type hinting closures for Laravel collections/models 【发布时间】:2021-06-21 02:23:24 【问题描述】:

我一直在研究提示我的 php 代码以符合 PSR 指导的类型,但对于将模型的实例传递给函数方面该怎么做有点困惑。请参阅下面的随机示例...

public function interactWithOrder($order, $basket)

    return;

对于上面的代码,$order 将是从模型中提取的单个订单的数据集合,而购物篮是一个数组。输入提示的正确方法是什么?我的建议如下...

public function interactWithOrder(mixed $order, array $basket)

    return;

任何帮助将不胜感激:)

【问题讨论】:

【参考方案1】:

在将模型实例传递给函数方面该怎么做

$order 将是从模型中提取的单个订单的数据集合

这取决于它是哪一个。

$orderOrder 模型吗? ($order = Order::where(...)->first();) 是CollectionOrder 模型吗? ($order = Order::where(...)->get();)

如果$order 始终是Order 模型,则只需输入提示即可。

public function interactWithOrder(\App\Models\Order $order, array $basket)

\Illuminate\Database\Eloquent\Model $order 也应该可以工作。

如果$order 始终是Order Collection,(即使是单个订单),那么只需输入提示即可。

public function interactWithOrder(Collection $order, array $basket)

Collection 可以是Illuminate\Database\Eloquent\Collection(特定)或Illuminate\Support\Collection(两者都可以使用,因为Eloquent\Collection 是从它扩展而来的)

您打算如何使用该功能?

【讨论】:

这正是我需要的,谢谢!当我尝试传递 Auth::user() 的实例并在更近距离使用 (User $user) 时,它会引发错误 - 预期 \App\Models\User,得到 \Illuminate\Contracts\Auth\Authenticatable 是有一种方法可以解决这个问题,只需使用模型实例,或者最好将其保留为 ($user) TIA :) 很奇怪。它适用于我。 dump(get_class(Auth::user())) 是否返回 'App\Models\User' 是的,它可能只是我的 IDE 显示的视觉效果。那么probs会好起来的!感谢您的帮助 也许您的 IDE 正在读取 Auth::user() 函数的返回类型,即 \Illuminate\Contracts\Auth\Authenticatable|null。应该没问题,因为Authenticatable是默认App\Models\Usermodel实现的接口。

以上是关于Laravel 集合/模型的类型提示闭包的主要内容,如果未能解决你的问题,请参考以下文章

Larave使用composer安装无反应,提示“Changed current directory to C:/Users/Administrator/AppData/Roaming/Compose

Larave使用composer安装无反应,提示“Changed current directory to C:/Users/Administrator/AppData/Roaming/Compose

Laravel Redis分布式锁的使用

Laravel 类型提示,模型保存时 id 返回 null

如何将对象(模型类型对象)插入到 Laravel 中特定索引号的集合对象中?

PHPStorm - Laravel Eloquent 没有代码提示 [重复]