2017-10-16 217 views
0

我有一個Laravel 5模型帳戶它實現InterfaceLaravel模型實現接口

我已經實現了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

您需要在服務提供商之一註冊服務容器綁定,或者更好地創建新的服務提供商。

它幫助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

好的,那麼這只是一件事情嗎? –

+0

我認爲大多數DI框架的工作方式 –

+0

謝謝你的工作。但是,當我寫'if($ account instanceof AccountInterface)'它仍然不能解決。這是預期的嗎?但作品通過構造函數傳遞 –