laravel 为什么larastan在资源文件中的relationLoaded方法上引发错误?

yacmzcpb  于 2023-10-22  发布在  其他
关注(0)|答案(2)|浏览(182)

在资源文件app/Http/Resources/PostResource.php中,我使用方法:

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class PostResource extends JsonResource
{
    public function toArray($request)
    {
        $data = [
            'id' => $this->id,
            ...
            'mediaProp'=> $this->when($this->relationLoaded('mediaProp'), new MediaPropResource($this->mediaProp)),
        ];

但是我在运行larastan命令时出错了:
调用未定义的方法App\Http\Resources\PostResource::relationLoaded()
我将PostResource类添加到phpstan. neon 中universalObjectCratesClasses键下:

includes:
    - ./vendor/nunomaduro/larastan/extension.neon

parameters:
    universalObjectCratesClasses:
        - Illuminate\Http\Resources\Json\JsonResource
        - App\Http\Resources\PostResource

    paths:
        - app/

    # Level 9 is the highest level
    level: 5

#    ignoreErrors:
#        - '#PHPDoc tag @var#'
#
#    excludePaths:
#        - ./*/*/FileToBeExcluded.php
#
#    checkMissingIterableValueType: false

但这并没有帮助,我仍然得到了同样的错误。我该如何解决?

"laravel/framework": "^10.8",
"nunomaduro/larastan": "^2.0",

提前感谢!

qqrboqgw

qqrboqgw1#

relationLoaded是Laravel的HasRelationships trait中定义的方法。但是PHPStan不知道资源和模型之间的关系。因此,您需要向资源类添加@mixin注解。就像这样:

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

/** @mixin Post */
class PostResource extends JsonResource
....

当然,要根据您的用例调整模型名称空间。

rbl8hiat

rbl8hiat2#

这很有趣,因为在我的代码中有一个代码片段与你的代码相似:

'kerzz_pos' => $this->when(
                 $this->relationLoaded('attributes') && $this->isKerzzAttributeExist(),
                 fn () => PanelBranchAttributeResource::collection($this->getKerzzAttributes())
             ),

我用"nunomaduro/larastan": "^2.6.4"。它也没有给予我任何错误。
也许你只需要升级包。或者,如果你想忽略它,你可以在ExcreErrors设置下写一个正则表达式,如下所示:

ignoreErrors:
     - '#Call to an undefined method (.*?)\:\:relationLoaded\(\).#'

相关问题