2017-10-16 16 views
0

私はLaravel 5モデルアカウントを実装しています。Interfaceを実装しています。モデルのインタフェースをLaravelで実装する

私はコードを実行すると、Interfaceのすべてのメソッドを実装しましたが、Laravelはモデルがインターフェイスを実装していないと不平を言っています。

エラー

以下Account.php(モデル)私のコントローラー

<?php 

namespace Abc\Accounts\Models; 

use Abc\Accounts\Contracts\Accountlnterface; 
use Illuminate\Database\Eloquent\Model; 

class Account extends Model implements Accountlnterface { 
.... 

私はこの

$account = Account::where('something', 'value')->first(); 

をしていますこれは、モデルだけで罰金を返します。

私は別のクラスのコントローラ

$result = new Transaction($account, 5.00); 

トランザクションファイル

public function __construct(Accountlnterface $account, float $value = 0.00) 
{ 
    $this->account = $account; 

取引コンストラクタしかしlaravelアカウントが実装されていないことに不平を言っているインターフェイスを探しているにそれを渡したときに問題がありますそれ。

このコードでは何が間違っているのか分かりません。モデルがロードされた直後Laravel

Type error: Argument 1 passed to Abc....\Transaction::__construct() must be an instance of Abc\Accounts\Components\Accountlnterface, instance of Tymr\Plugins\Accounts\Models\Account given.

から

エラーが、私はこのコード

 if($account instanceof AccountInterface) 
      echo "working"; 
     else 
      echo "fails"; 

を実行し、それは確かに失敗しました。

+0

サービスコンテナ内のアカウントにAccountInterfaceをバインドしましたか?インターフェイスのインスタンスを解決する方法についてLaravelに指示する必要があります;) –

答えて

1

サービスプロバイダのバインディングをサービスプロバイダの1つに登録するか、新しいサービスプロバイダを作成する必要があります。

これはLaravelがあなたのインターフェイスに使用する実装を知るのに役立ちます。

use Illuminate\Support\ServiceProvider; 

class ModelsServiceProvider extends ServiceProvider { 
     public function register() 
     { 
     $this->app->bind(
      'Abc\Accounts\Contracts\Accountlnterface', 
      'Abc\Accounts\Models\Account' 
     ); 
     } 
} 

app/config/app.phpには、利用可能なプロバイダの下にサービスプロバイダを登録してください。

'providers' => [ 
    ... 
    'ModelsServiceProvider', 
] 
+0

これはちょうどlaravelものですか? –

+0

ほとんどのDIフレームワークはそのように動作すると思います –

+0

ありがとうございました。しかし、 'if($ account instanceof AccountInterface)'と書くと、それでも解決しません。それは期待されていますか?しかし、コンストラクタ経由で渡すための作品 –

関連する問題