我有一个名为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它可以工作,但我试图将我的逻辑保留在模型上。提前谢谢。
答案 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();
}
希望这有帮助!