如何在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 个问题:
- 如何通过服务提供商将 Request 变量传递到我的
__construct
方法?
- 如何在任何应用程序文件中准备好(初始化)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 的职责,尽管它可以工作,但这可能代表架构错误。
为在线商店创建购物车。现在我有:
我的服务提供商:
<?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 个问题:
- 如何通过服务提供商将 Request 变量传递到我的
__construct
方法? - 如何在任何应用程序文件中准备好(初始化)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 的职责,尽管它可以工作,但这可能代表架构错误。