绑定不适用于用户模型

时间:2016-10-24 05:04:06

标签: php laravel oop laravel-5

我有一个名为TFA的界面和一个名为GoogleTFA的实现。但每次我尝试在我的用户模型上使用TFA时,我都会收到此错误:

  

类型错误:参数1传递给App \ Models \ User :: toggleTFA()   必须实现接口App \ Contracts \ TFA,没有给出

这是我的方法:

public function toggleTFA(TFA $tfa)
   {
        /**
         * If we're disabling TFA then we reset his secret key.
         */
        if ($this->tfa === true)
            $this->tfa_secret_key = $tfa->getSecretKey();

        $this->tfa = !$this->tfa;
        $this->save();
    }

这是我在AppServiceProvider.php上的绑定:

public function register()
    {
        /**
         * GoogleTFA as default TFA adapter.
         */
        $this->app->bind('App\Contracts\TFA', 'App\Models\GoogleTFA');
    }

知道我为什么会有这种行为?如果我在我的控制器的任何方法上键入提示TFA $ tfa它可以工作,但我试图将我的逻辑保留在模型上。提前谢谢。

1 个答案:

答案 0 :(得分:1)

DI不适用于所有方法。控制器方法将使用此方法,Laravel为您解析它们。

在模型中使用它的一种方法是手动解决它:

$tfa = app(TFA::class);

如果您在几种不同的方法中使用它,我会将上面的内容移到它自己的方法中。

或者,您可以专门为Facade实施创建TFA(以下示例假设您只是将外观放在App命名空间中):

创建文件app/Facades/Tfa.php并将以下内容添加到其中:

<?php

namespace App\Facades;

use Illuminate\Support\Facades\Facade;

class Tfa extends Facade
{
    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor()
    {
        return 'App\Contracts\TFA';
    }

}

然后在config/app.php中将以下内容添加到底部的aliases数组中:

 'Tfs' => App\Facades\Tfs::class,

这样您就可以从Facade调用getSecretKey

public function toggleTFA()
{
    /**
     * If we're disabling TFA then we reset his secret key.
     */
    if ($this->tfa === true)
        $this->tfa_secret_key = Tfa::getSecretKey();

    $this->tfa = !$this->tfa;
    $this->save();
}

希望这有帮助!