Laravel将sentry用户注入模型

Laravel将sentry用户注入模型,laravel,testing,dependency-injection,Laravel,Testing,Dependency Injection,我渴望使我的代码解耦并准备好进行测试 我有一个雄辩的模型getBudgetConvertedAttribute取决于sentry用户属性 public function getBudgetConvertedAttribute() { return Sentry::getUser()->currency * $this->budget; } 测试时出现此抛出错误,因为Sentry::getUser返回null 我的问题是,我应该如何编写代码将用户从控制器或服务提供商绑定或测试

我渴望使我的代码解耦并准备好进行测试

我有一个雄辩的模型getBudgetConvertedAttribute取决于sentry用户属性

public function getBudgetConvertedAttribute()
{
    return Sentry::getUser()->currency * $this->budget;
}
测试时出现此抛出错误,因为Sentry::getUser返回null


我的问题是,我应该如何编写代码将用户从控制器或服务提供商绑定或测试注入到模型中?

将$sentry对象作为依赖项注入构造函数中,而不是使用sentry Facade

范例

 use Path\To\Sentry;
 class ClassName
 {
   protected $sentry
   public function __construct(Sentry $sentry)
   {
      $this->sentry = $sentry;
   }

   public function methodName() 
   {

    $this->sentry->sentryMethod();

   }
 }

为什么不在模型上创建一个方法,然后将Sentry用户对象作为参数

public function getBudgetConverted(SentryUser $user)
{
    return $user->currency * $this->budget;
}
您需要将类型提示SentryUser更改为用户类的实际名称


如果这是为了帮助测试,您可以更进一步,在一个界面上键入提示,这样您就可以使用模拟用户对象来测试您的方法,而不是像有说服力的模型那样,使用其他依赖项(如数据库连接)负载的对象来测试您的方法。

,我使用的是Laravel 4,它不支持方法注入。对于雄辩的属性,我不直接调用这个函数。但是使用$model->budget转换;这将解决这个函数。我也在一些项目中使用Laravel5,我知道代码到接口的概念,但是如何在测试环境中模拟用户?正如我所说的,我不会自己调用该方法并传入$user。它是通过某种绑定方法解决的。我也这么认为。但雄辩的模型使用类似于门面的静态方法。例如:ClassName::with->where->get->limit;在本例中,它抛出一个错误,表示构造预期Sentry,但它传入null。我仍在进一步研究如何使其工作。查询可能有问题。您是否尝试过ddSentry::getUser->currency*$this->budget;要查看输出?如果您得到任何错误/异常,您会得到什么?