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

How to use service provider in 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;
        });
    }
}

主车class:

<?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. 如何在任何应用程序文件中准备好(初始化)class 实例?

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

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

2。 为此,我会用您的 class 名称调用单身人士:

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

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

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

}

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

在注册时无需请求即可绑定。
在启动时,您用请求填充购物车。

为了解释这个案例,我们需要更多地了解Laravel服务容器。服务容器是一个强大的 Laravel 工具,用于管理 class 依赖项和执行依赖项注入。

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

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

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

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