2014-10-31 93 views
1

我是Laravel和MVC開發的新手。將靜態方法放入Laravel模型是否是一種好的做法?

我有從CSV文件導入數據的方法。每一行代表一個用戶,以及一個與用戶相關的文檔。

導入功能會檢查用戶是否存在(基於CSV中的登錄字段),是否創建新用戶。然後它爲該用戶創建一個新的UserDocument。

我有一個createIfNotExists()方法在我的用戶模型:

public static function createIfNotExists($username, $password) 
{ 
    $userId= DB::table('users')->where('login', $username)->pluck('id'); 

    if(is_null($userId)) 
    { 
     $user = new User(); 
     $user->setHasher(new Cartalyst\Sentry\Hashing\NativeHasher); 
     $user->login = $username; 
     $user->email = $username; 
     $user->password = $password; 
     $user->save(); 

     return $user; 

    } 

    return User::find($userId); 
} 

我稱之爲CSV導入方法,像這樣的方法:

$user= User::createIfNotExists($userLogin, $userPassword); 

兩個問題:

  • 是不是很好的做法是createIfNotExists()方法d在用戶模型中?或者它應該在別的地方?

  • 它是一種很好的做法,它是一種靜態方法?

+0

如果你看看Eloquent Model類,有很多類似['Model :: find']的靜態方法(https://github.com/laravel/framework/blob/master/src/Illuminate/Database/Eloquent例如,/Model.php#L640)。所以我不會擔心它太多 – lukasgeiter 2014-10-31 09:14:16

+0

如果有一個靜態方法是有意義的,那麼有一個靜態方法。如果沒有意義,那麼就沒有它。沒有可用於判斷靜態是壞還是良好實踐的標準。這取決於你需要做什麼以及靜態/非靜態如何幫助你做到這一點。 – 2014-10-31 09:17:24

+0

有一篇文章我讀到關於單元可測試代碼的觀點,它主張在你的**單元中任何地方都不要使用「靜態」任何東西或「新」任何東西**。這意味着你的**單元**已經過測試,並且需要將所有依賴注入到它們中(所以你可以注入嘲弄的依賴關係,而不是真正的依賴關係)。唯一可能出現'全局'行爲(如'statics')的地方是應用程序「框架」,這意味着它不是用於加載模塊的模塊。 – 2014-10-31 09:50:29

回答

0

你可能想看看從雄辯的firstOrCreate()方法來實現你在你的示例代碼做什麼。

將靜態方法包含在模型中是很好的方法,特別是作爲簡便的方法,但請儘量少用,並且不要讓模型太胖(可能很難測試靜態方法)。

相關問題