Laravel -在方法中使用动态参数类型

jc3wubiy  于 2023-05-19  发布在  其他
关注(0)|答案(2)|浏览(116)

我在Controller内部有如下方法:

/**
     * Show the form for creating a new resource.
     * @param SkillForm|null $model
     * @return Renderable
     */
    public function form(?SkillForm $model): Renderable
    {
        return view('components.forms.index', [
            'model' => $model,
        ]);
    }

是否可以将类型(SkillForm)设置为其他地方的静态变量并使用它?例如(这不起作用):

/**
         * Show the form for creating a new resource.
         * @param SkillForm|null $model
         * @return Renderable
         */
        public function form(?self::model $model): Renderable
        {
            return view('components.forms.index', [
                'model' => $model,
            ]);
        }
fhity93d

fhity93d1#

PHP目前不支持动态定义方法的类型。
如果您的目标是验证它是正确的类型,那么有几个选项可用
1.使用公共接口

<?php

interface A {}

class B implements A {}
class C implements A {}

function foo(A $a) {}

你也可以使用一个基类来代替接口,但通常接口是首选的方法。
1.使用类型联合

<?php

function foo(A|B $a) {}

1.在函数内部执行检查

<?php

class A
{
    public static $model = 'SomeClass';

    public function foo($a)
    {
        throw_unless($a instanceof self::$model, Exception::class, "a is not an instance of " . self::$model);
    }
}

接口和联合类型检查通常更适合IDE支持和静态分析

aurhwmvo

aurhwmvo2#

简短的回答是PHP不支持在运行时动态输入方法参数。
您可以从方法签名中删除类型提示,并检查方法内部的对象类型。

/**
 * Show the form for creating a new resource.
 *
 * @param mixed $model
 * @return Renderable
 */
public function form($model): Renderable
{
    if ($model instanceof SkillForm) {
        // handle SkillForm
    } elseif ($model instanceof AnotherForm) {
        // handle AnotherForm
    }
    
    return view('components.forms.index', [
        'model' => $model,
    ]);
}

相关问题