Laravel :: __ construct()必须实现接口

时间:2017-03-07 12:42:22

标签: php laravel

我正在使用grep '^[67]h' file 而我正在尝试将Laravel 5.4课程注入$order一个由{{1}实施的课程}}。像这样:

trait

特征的model看起来像这样:

class Forum extends Model
{
    use Orderable; 

我的服务提供商看起来像这样:

constructor

我的trait Orderable { public $orderInfo; public function __construct(OrderInterface $orderInfo) { $this->orderInfo = $orderInfo; } 类的构造函数如下所示:

public function register()
{
    $this->app->bind(OrderInterface::class, function () {
        return new Order(new OrderRepository());
    });

    $this->app->bind(OrderRepositoryInterface::class, function () {
        return new OrderRepository();
    });
}

但我收到错误:

Order

public function __construct(OrderRepositoryInterface $orderInfo) { $this->orderInfo = $orderInfo; } 班正在实施Type error: Argument 1 passed to App\Forum::__construct() must implement interface Project\name\OrderInterface, array given, called in /home/vagrant/Code/Package/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php on line 268 。 Order类正在实现OrderRepository接口。

App \ Forum是使用OrderRepositoryInterface特征的模型。

我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

您正在延长Model。此类已经有一个__construct您需要使用。这个__construct期望array $attributes = []作为第一个参数。

所以在你的__construct中你还需要将它作为第一个参数并将其传递给父类:

public function __construct(array $attributes = [], OrderRepositoryInterface $orderInfo)
{
    $this->orderInfo = $orderInfo;
    parent::__construct($attributes);
}

但是,您可以使用__construct在laravel中使用boot

例如在Model

class Forum extends Model
{
    protected static function boot()
    {
        parent::boot();
        // Do something
    }
}

Trait

trait Orderable
{
    public static function bootOrderableTrait()
    {
        static::created(function($item){
            // Do something
        });
    }
}

答案 1 :(得分:0)

在PHP中,不可能有多个构造函数。如果你想看模型:

public function __construct(array $attributes = [])

它期待数组。这就是为什么我假设Model数组中的某个地方传递给构造函数而不是'OrderInterface'。