【问题标题】:Laravel Type Hint Eloquent CollectionLaravel Type Hint Eloquent 合集
【发布时间】:2022-01-13 15:13:46
【问题描述】:

这可能是微不足道的。但我被困住了。

我需要将参数传递给函数,但需要像这样输入提示:

    private function printUsers(Collection<User> users) {
     foreach($users as $user) {
       print($user->fullName)
     }
    }

我如何键入提示这个集合,因为我想要一个特定模型的集合?

【问题讨论】:

标签: php laravel


【解决方案1】:

PHP 不支持泛型。但是,如果您使用某些 IDE(至少 PhpStorm 会这样做),您可以将 generic in the docblock:

   /**
    * @param Collection<User> $users
    */
   private function printUsers(Collection $users) {
     foreach($users as $user) {
       print($user->fullName)
     }
    }

但是这仍然行不通,因为 Laravel 没有将集合类型提示为泛型(至少现在还没有,这将在 Laravel 9 中出现)。

解决此问题的一般方法(再次使用 docblock)是执行以下“hacky”类型提示:

   /**
    * @param Collection|User[] $users
    */
   private function printUsers(Collection $users) {
     foreach($users as $user) {
       print($user->fullName)
     }
    }

这会将$users 类型提示为具有User 成员的数组可访问变量,这可能足以满足您的需求,但是:

(a) 补全仅适用于支持 User[] 语法的 IDE

(b) 它只在迭代时有效,即它不是真正的泛型

【讨论】:

    【解决方案2】:

    你不能,除非你创建一个 UserCollection 类型。似乎您正在尝试应用一些其他 OOP 语言概念(例如 Java)。

    一个简单的方法是维护 Collection 参数类型,并评估函数内部的参数,例如:

    private function printUsers(Collection $users) {
    
        foreach($users as $user) {
            try {
                $user = (User) $user; // Not strictly necessary.
                print($user->fullName);
                
            } catch (Exception $e) {
                // Resolve exception
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-04-29
      • 1970-01-01
      • 2015-06-06
      • 2019-10-13
      • 2018-11-11
      • 2019-09-08
      • 2017-04-12
      • 2014-01-22
      • 2020-01-04
      相关资源
      最近更新 更多