2014-03-28 61 views
0

有沒有辦法在Laravel 4中獲取所有現有模型?文檔中沒有提到這一點,並且使用Google搜索這個問題沒有導致任何相關的問題。獲取Laravel 4中的所有現有模型?

我正在研究當前項目中的一項功能,該功能需要能夠創建報告哪些資產存在或哪些客戶已在公司購買了哪些資產。爲此,我創建了一個允許用戶指定哪些工作表(導出到Excel)的信息的模塊。

比方說,我有以下型號(它們都繼承雄辯):

  • 資產
  • 客戶
  • 國家
  • 用戶

我只想資產和客戶模型在報告中可用。我的想法是給那些常數並檢查這個常數。

我唯一碰到的就是一個獲取我的Laravel應用程序中定義的所有模型的方法。

我知道我可以遍歷app/models目錄或創建一個數組,但我正在尋找一個更好的方法來做到這一點。有沒有人碰巧知道如何實現這一目標?

+0

看看[這個答案](http://stackoverflow.com/a/6671567/2629998),顯示有辦法讓擴展父類(在你的情況下,它的'Eloquent')所有類。 – 2014-03-28 16:00:26

+0

我會創建一個存儲庫或服務提供程序類來處理您描述的功能。然後使用Laravel的內置IoC類簡單地獲取這些類。 – Dave

+0

@André'get_declared_classes()'沒有列出之前沒有調用過的任何模型。 – MisterBla

回答

1

經過一番研究,並要求在PHP聊天室圍繞我想出了以下解決方案:

首先,我檢索所有車型從/應用/型號目錄,刪除..並從文件名和任何剩餘的空白處裁剪擴展名。
在我的情況下,這將工作,因爲我在類之後命名文件。

private function getModels() 
{ 
    return array_filter(scandir(app_path('models/')), function(&$val) 
    { 
     if($val != '.' && $val != '..') 
     { 
      $val = trim(str_replace('.php', '', $val)); 
      return class_exists($val); 
     } 
    }); 
} 

現在我有我想要的所有模型,我需要過濾哪些我想報告的模型。在我想要報告的模型上,我實現了一個名爲IReportable的接口。我想使用抽象類,但由於PHP不允許多重繼承,我使用這種方法。

class MyModel extends Eloquent implements IReportable

或者對於我來說:

Class Asset extends BaseModel implements IReportable

有了這個,我可以過濾模型。

private function getReportableModels() 
{ 
    return array_filter($this->getModels(), function($model) 
    { 
     return in_array('IReportable', class_implements($model, false)); 
    }); 
}