【发布时间】: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->app->bind('CustomerRepository', 'EloquentCustomerRepository');。如果你在控制器上使用EloquentCustomerRepository而不是CustomerRepository,这样可以吗? -
@milz 是的!当我使用 EloquentCustomerRepository 时,它可以工作。我做错了什么?
-
您可能需要将
->bind()与字符串一起使用,其中字符串是包括命名空间在内的类的名称。请发布CustomerServiceProvider、CustomerRepository和EloquentCustomerRepository的完整代码(或至少是声明)。谢谢 -
@milz 请看我的编辑