如何在Laravel 5.2中使用服务提供商?

时间:2018-01-17 22:19:13

标签: php laravel laravel-5.2

为在线商店创建购物车。现在我有:

我的服务提供商:

<?php

namespace Alexxosipov\Cart;

use Illuminate\Support\ServiceProvider;


class CartServiceProvider extends ServiceProvider {
    public function boot() {

    }

    public function register() {
        $this->app->singleton('cart', function() {
            return new \Alexxosipov\Cart\Cart;
        });
    }
}

主推车类:

<?php

namespace Alexxosipov\Cart;

use Illuminate\Support\Facades\Cookie;
use App\Cart as CartModel;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class Cart
{
   public function __construct(Request $request) 
   {
      ...
   }
   ...
}

关于这个的2个问题:

  1. 如何通过服务提供商将Request变量传递给__construct方法?
  2. 如何在任何应用程序文件中准备(初始化)类的实例?

2 个答案:

答案 0 :(得分:1)

1。 singleton函数中的回调采用$ app参数,您可以从该参数发出请求:

$this->app->singleton('cart', function($app) {
    return new \Alexxosipov\Cart\Cart($app['request']);
});

2。 为此,我会使用您班级的名称来调用单身人士:

$this->app->singleton(\Alexxosipov\Cart\Cart::class, function($app) {
    return new \Alexxosipov\Cart\Cart($app['request']);
});

然后你可以输入提示并获得它。例如,在控制器中,您可能有:

public function show(\Alexxosipov\Cart\Cart $cart) {

}

注意: 您不应该在注册方法中使用其他服务。 也许你可以这样做:

在注册中,您只需在没有请求的情况下绑定它 在启动时,您将使用请求填充购物车。

答案 1 :(得分:1)

要解释此案例,我们需要了解有关Laravel服务容器的更多信息。服务容器是一个功能强大的Laravel工具,用于管理classe依赖项和执行依赖项注入。

对于这种情况,对于在register方法中传递的闭包,也会传递参数。他收到了Illuminate \ Foundation \ Application的一个实例。使用此实例,您可以调用服务容器中的任何可用实例。

然后,您的解决方案是将app参数传递给您的闭包,获取请求的实例并将其传递给您的类:

 public function register() {
    $this->app->singleton('cart', function($app) {
        $request = $app->make('Request');
        return new \Alexxosipov\Cart\Cart($request);
    });
}

通过这种方式,您可以将Request对象传递给Cart构造函数,但是根据Cart的职责,尽管它有效,但这可能代表架构错误。