为在线商店创建购物车。现在我有:
我的服务提供商:
<?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个问题:
__construct
方法?答案 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的职责,尽管它有效,但这可能代表架构错误。