我已经注册了 Paypal 服务提供商:
App\Providers\PaypalHelperServiceProvider::class,
并且,当我在控制器中输入提示时,它会正确解析:
public function refund(Request $request, PaypalHelper $paypal) {...
这是我的提供者类:
class PaypalHelperServiceProvider extends ServiceProvider
{
protected $defer = true;
public function register()
{
$this->app->bind('App\Helpers\PaypalHelper', function() {
$test = 'test';
return new PaypalHelper();
});
}
public function provides()
{
$test = 'test';
return [App\Helpers\PaypalHelper::class];
}
}
一切都按预期工作。现在我希望能够修改控制器以采用 PayPal 接口。然后,我将更新我的服务提供者,以有条件地传入真实类或模拟类以进行测试,使用 APP_ENV 变量来确定要使用哪一个。我将一些调试器放入服务提供者类中,但无法让它进入。我想也许它只在需要时加载它们,所以我在我的控制器中放置了一个断点。类确实解析了,但它仍然没有进入服务提供者类!有人可以向我解释为什么会这样吗?即使我修改了代码以传入不同的类类型,它也没有回升。
编辑:
这是我调试时看到的代码流:ControllerDispatcher -> resolveClassMethodDependencies -> resolveMethodDependencies -> transformDependency。此时我们在 RouteDependencyResolveerTrait 中有以下 Laravel 代码:
protected function transformDependency(ReflectionParameter $parameter, $parameters, $originalParameters)
{
$class = $parameter->getClass();
// If the parameter has a type-hinted class, we will check to see if it is already in
// the list of parameters. If it is we will just skip it as it is probably a model
// binding and we do not want to mess with those; otherwise, we resolve it here.
if ($class && ! $this->alreadyInParameters($class->name, $parameters)) {
return $this->container->make($class->name);
}
}
由于 getClass() 总是解析为接口名称,当我们调用 container->make() 时,它总是失败
Target [App\Helpers\PaypalHelperInterface] is not instantiable.
我终于发现了这个问题。我的问题是我的提供者根本没有被接受。这是解决方案
composer dumpautoload
php artisan cache:clear
https://laravel.io/forum/02-08-2015-laravel-5-service-provider-not-working
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句