我有一个名为"MyServiceProvider.php"的服务Provider :
<?php
namespace App\Providers;
use App\Services\MyService;
use Illuminate\Support\ServiceProvider;
class MyServiceProvider extends ServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
$this->app->bind('my_service', function ($app) {
return new MyService(
config('services.my_service.url'),
config('services.my_service.secret')
);
});
}
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
//
}
}
我已经在providers数组中的app.php文件中注册了它.我判断了app()配置,所以有一个提供程序与解决的env值,看起来一切都很好.
然后我要上我的服务课程:
<?php
namespace App\Services;
class MyService
{
protected string $url;
protected ?string $secret;
public function __construct(string $url = '', ?string $secret = '')
{
$this->url = $url;
$this->secret = $secret;
}
public function test()
{
return $this->url;
}
}
然后我想把这个类注入到我的控制器中,并调用test()方法来判断URL是否被解析.我是这样做的:
class TestingController extends Controller
{
protected MyService $myService;
public function __construct(MyService $myService)
{
$this->myService = $myService;
}
我在打针作为止痛药.现在我在一条路由内呼叫它:
public function testingRoute()
{
try {
$testResult = $this->myService->test();
dd($testResult);
我每次都只得到空字符串(初始值).如果我没有设置初始值,那么我会得到一个错误,说明:
Illuminate\Contracts\Container\BindingResolutionException
Unresolvable dependency resolving [Parameter #0 [ <required> string $url ]] in class App\Services\MyService
我try 在没有初始构造函数的情况下直接注入到TestingRouting控制器方法的参数中,但我仍然得到相同的结果--在没有提供服务Provider 应该提供的值的情况下启动的Class Get.
这是怎么回事?我认为服务提供者必须在我自己注入类之前用我的配置创建一个实例?为什么我不能让它工作?
我还想提一下,当我这样打电话的时候:
$myService = app('my_service');
然后,它就会毫无问题地启动.我快疯了,需要帮帮师傅:)