我有一个名为"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');

然后,它就会毫无问题地启动.我快疯了,需要帮帮师傅:)

推荐答案

不要使用"my_service",而是使用完全限定的类名.

$this->app->bind(MyService::class, function ($app) {
            return new MyService(
                config('services.my_service.url'),
                config('services.my_service.secret')
            );
        });

这是因为当您在__Construction方法中时,它将try 通过类名而不是您在服务提供者中注册的‘my_service’来查找.

Php相关问答推荐

根据类别在WooCommerce中添加库存数量后缀

Laravel 9如何过滤$的项目与结果?

在WooCommerce中执行一次银行电汇确认付款代码

msgraph-sdk-php v2如何传递skiptoken到request?

PHP原始数据读取引发max_input_vars错误

当配置的URL为空时禁用Laravel Slack日志(log)记录

如何在execute语句中使用存储过程参数?

限制联系人页面仅允许在WooCommerce中登录的用户

强制客户在注册时 Select WooCommerce角色

根据页面以及是否在促销,向 WooCommerce 中显示的价格添加前缀

根据小计向 WooCommerce Checkout 添加佣金

WooCommerce:如果订单总数为零,则隐藏本地取货运输选项

在php中计算两个没有假期的日期之间的小时差

从插件更改主题功能,function_exists 不起作用

Windows 身份验证在 IIS 中验证什么?我可以在我的情况下禁用匿名身份验证吗?

批量作业(job)提交错误无法处理所有文档,uris 似乎正确?

如何使用在产品快速编辑菜单前端的自定义框中 Select 的值更新 woocommerce 产品属性值?

Shopware 6:无法在新的自定义插件中保存关联字段(媒体)

PHP/Laravel 中的自定义时区

Laravel 模型将日期保存为空