【问题标题】:Laravel Service provider not workingLaravel 服务提供商不工作
【发布时间】:2016-04-02 10:42:40
【问题描述】:

我已将名为CustomerRepository 的接口绑定到EloquentCustomerRepository。这是我的CustomerServiceProvider

public function register()
    {
        $this->app->bind(CustomerRepository::class,EloquentCustomerRepository::class);
        $this->app->bind(PackageRepository::class,EloquentPackageRepository::class);
    }

当我尝试像这样在我的控制器中实例化它时:

<?php

namespace App\Http\Controllers\api\v1;

use Lsupport\repositories\api\v1\customer\CustomerRepository;
use App\Http\Controllers\Controller;
use Lsupport\customer\Customer;
use App\Http\Requests;

class CustomerController extends Controller
{
    protected $CustomerRepository;

    public function __construct(CustomerRepository $CustomerRepository)
    {
        $this->CustomerRepository = $CustomerRepository;
    }

它会抛出以下错误:

在构建 [App\Http\Controllers\api\v1\CustomerController] 时,目标 [Lsupport\repositories\api\v1\Customer\CustomerRepository] ​​不可实例化。

我也在app.config注册了:

App\Providers\CustomerServiceProvider::class,

我做错了什么?

客户服务提供者

<?php

namespace App\Providers;

use Lsupport\repositories\api\v1\customer\EloquentCustomerRepository;
use Lsupport\repositories\api\v1\customer\EloquentPackageRepository;
use Lsupport\repositories\api\v1\customer\CustomerRepository;
use Lsupport\repositories\api\v1\customer\PackageRepository;
use Illuminate\Support\ServiceProvider;

class CustomerServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind(CustomerRepository::class,EloquentCustomerRepository::class);
        $this->app->bind(PackageRepository::class,EloquentPackageRepository::class);
    }
}

客户存储库

    <?php

    namespace Lsupport\repositories\api\v1\Customer;

    interface CustomerRepository
    {
        public function create($request);
    }

**EloquentCustomerRepository**

<?php

namespace Lsupport\repositories\api\v1\customer;

use Lsupport\repositories\api\v1\customer\CusteromRepositoryTrait;
use Lsupport\repositories\api\v1\remain\RightTrait;
use Lsupport\repositories\api\v1\remain\JsonTrait;
use Lsupport\customer\Customer;

class EloquentCustomerRepository implements CustomerRepository
{
    use JsonTrait;
    use RightTrait;
    use CustomerRepositoryTrait;

    code.....

【问题讨论】:

  • 我的理解是bind()的第二个参数应该是一个闭包https://laravel.com/docs/5.2/container#binding
  • 尝试使用$this-&gt;app-&gt;bind('CustomerRepository', 'EloquentCustomerRepository');。如果你在控制器上使用EloquentCustomerRepository而不是CustomerRepository,这样可以吗?
  • @milz 是的!当我使用 EloquentCustomerRepository 时,它可以工作。我做错了什么?
  • 您可能需要将-&gt;bind() 与字符串一起使用,其中字符串是包括命名空间在内的类的名称。请发布CustomerServiceProviderCustomerRepositoryEloquentCustomerRepository 的完整代码(或至少是声明)。谢谢
  • @milz 请看我的编辑

标签: php laravel


【解决方案1】:

好的,我注意到的第一件事是您可能希望在接口和类上使用相同的命名空间。所以,EloquentCustomerRepository 的命名空间应该是

namespace Lsupport\repositories\api\v1\Customer;

而不是

namespace Lsupport\repositories\api\v1\customer;

(与较低的客户)。

现在,在您的 CustomerServiceProvider 上,您应该使用:

public function register()
{
    $this->app->bind('Lsupport\repositories\api\v1\Customer\CustomerRepository', 'Lsupport\repositories\api\v1\Customer\EloquentCustomerRepository');
}

确保在命令行上运行 composer dumpautoload -o

【讨论】:

  • 非常感谢您的帮助!
猜你喜欢
  • 2016-08-23
  • 2016-01-08
  • 2017-07-26
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-06
  • 2017-12-26
相关资源
最近更新 更多