【问题标题】:"Service Injection" of Laravel 5.2Laravel 5.2 的“服务注入”
【发布时间】:2016-03-05 14:51:35
【问题描述】:

关于“服务注入”,文档说:https://laravel.com/docs/5.2/blade#service-injection

服务注入

@inject 指令可用于从 Laravel 服务容器中检索服务。传递给@inject 的第一个参数是服务将被放入的变量的名称,而第二个参数是您希望解析的服务的类/接口名称:

@inject('metrics', 'App\Services\MetricsService')
<div>
    Monthly Revenue: {{ $metrics->monthlyRevenue() }}.
</div>  

我的代码:

1、服务:
NameAndRole.php

class NameAndRole
{
    public function nameAndRole() {
        $user = \Auth::user();
        $username= $user->name;
        $role =$user->getRoles();
        $slug=$role[0]['slug'];
        return compact('username','slug');
    }
}

2、观点:
sidebar.blade.php

@inject('nameAndRole','App\Services\NameAndRole')
<div>
  <h4 >username:{{$username}}</h4>
  <h4>slug:{{$slug}}</h4>
</div>

错误:

Undefined variable: username (View: D:\wnmp\www\laravel-book\resources\views\partials\sidebar.blade.php) (View: D:\wnmp\www\laravel-book\resources\views\partials\sidebar.blade.php)

【问题讨论】:

  • 未定义变量是什么?错误中没有为未定义的变量指定名称?
  • 如文档中所述 "传递给@inject 的第一个参数是服务将被放入的变量的名称,而第二个参数是服务的类/接口名称您希望解决”。因此,您现在使用的@inject 语法将创建App\Services\NameAndRole 类的实例并将其分配给名为nameAndRole 的变量。如果您要调用{{ $nameAndRole-&gt;nameAndRole() }},它将返回一个包含用户名和slug 的数组,因为您从nameAndRole 方法返回它。任何地方都没有定义 usernameslug 变量。
  • 您可能对如何在视图中使用服务注入有误解,或者您可能需要一种新方法,所以请说明您要实现的目标。

标签: php laravel laravel-5.2


【解决方案1】:

我在 laracasts.com 上得到了答案,我想这就是我想要的:

class NameAndRole
{
    public $username;
    public $slug;

    public function __construct()
    {
        $user = \Auth::user();
        $this->username = $user->name;
        $role = $user->getRoles();
        $this->slug = $role[0]['slug'];
    }
}

在 Blade 视图中:

@inject('details', 'App\Services\NameAndRole')
{{ $details->username }}
{{ $details->slug }}

【讨论】:

  • 我假设这是your question on Laracasts。这个解决方案很好,因为它只在创建实例时在构造函数中查询一次数据库,并将它们存储在类属性中,因此不需要再次查询数据库。然而@Yurich 的解决方案是调用nameAndRole() 方法两次,因此它再次执行相同的代码,包括getRoles() 方法,我假设它正在查询数据库以获取角色,所以它会查询数据库两次。
【解决方案2】:

你应该从方法中获取变量

@inject('nameAndRole','App\Services\NameAndRole')
<div>
   <h4 >username:{{$nameAndRole->nameAndRole()['username']}}</h4>
   <h4>slug:{{$nameAndRole->nameAndRole()['slug']}}}</h4>
</div>

【讨论】:

  • 虽然此代码将产生用户第一次预期的效果,但它是一个糟糕的实现,因为它不必要地进行两次方法调用并查询数据库两次以获取相同的信息。
  • 我只是展示了如何用这个方法实现注入。
  • 我明白了,但在这种情况下,工作建议好建议
  • 我在 laracasts.com 上得到了答案,我想这就是我想要的。但是,它会查询数据库两次吗? @Bogdan
猜你喜欢
  • 2016-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-26
  • 2016-07-10
  • 2016-10-10
相关资源
最近更新 更多