2014-12-02 66 views
0

剛開始使用Laravel,但希望確保正確使用它。Laravel 4數據庫操作 - 控制器或模型

我的大部分工作都是基於CMS的讀取/寫入/更新等數據庫。

的是我迄今所做的一個例子是插入到DB:

在我有「AddNewUser函數」的URL形式的看法。

在我的路線我然後執行:

Route::post('addnewuser', array('uses' => '[email protected]')); 

我的用戶控制器 'AddNewUser函數' 法(簡體):

public function addNewUser() { 
    $data = Input::all(); 
    $rules = array(
     'username' => 'required|alpha_dash|max:16|unique:users,username', 
     ); 

    $validator = Validator::make($data, $rules, $messages); 

    if ($validator->fails()) 
    { 
     Input::flash(); 
     $errors = $validator->messages(); 
     return Redirect::to('/register')->withErrors($validator)->withInput(); 
    } 

    $user = new User; 
    $user->save(); 

    return Redirect::to('/login')->with('successLogin', '1'); 
} 

這是正確的嗎?我曾經在某處讀過所有數據庫交互應該在模型中的地方?

同樣從DB讀取以顯示例如一個foreach時,我直接在視圖以下:

$builds = DB::table('blogs')->orderBy('id', 'desc')->get(); 

if ($builds) { 

    foreach ($builds as $build) 
    { 
     $safeURLSlug = stringHelpers::safeURLSlug($build->blogtitle); 
     echo " 
     // stuff 
     "; 
    } 

} else { 
    // no stuff 
} 

我應該直接在視圖做這些排序的查詢和表示數據?或在模型/控制器功能等?

希望檢查即時通訊服務100%正確/做事情的標準方式,在我參與之前。

+0

不,如果您希望代碼可重用,則不應在控制器中完成。試想一下,你有另一個添加用戶的理由,例如。 '/ users/add_batch',那麼你需要爲這個新控制器重寫所有這些東西。或者你希望在命令行(artisan cron job或其他)中執行 - 你需要重新編寫這些東西。相反,更好地創建一個服務,模型上的一個方法(無論適合你),將處理這個任務,並在控制器/ cli中重用它。 – 2014-12-02 16:27:21

回答

1

我可以看到一些我個人會做得不同的事情。

例如,我通常會將$rules作爲類變量,因此它可以用於與用戶相關的不同功能。

你測試過你的代碼了嗎?任何錯誤?

在您的addNewUser函數中是否保存任何數據?我知道你已經在代碼片段上面「簡化了」,但是在創建你的$user變量和運行$user->save();之間應該有$user->username = $data['username'];等,所以如果你故意排除這個,那麼我沒有看到你的模型。

在您看來的代碼,$builds = DB::table('blogs')->orderBy('id', 'desc')->get();應該在你的控制器來完成,並傳遞給你的看法,像這樣return View::make('example', array('builds' => $builds))

我也改變

$builds = DB::table('blogs')->orderBy('id', 'desc')->get();

$builds = Blog::orderby('id','desc')->get();如果您有一個Blog模型,否則你的代碼是好的。

1

您可以移動:

$rules = array(
     'username' => 'required|alpha_dash|max:16|unique:users,username', 
     ); 

以用戶模型作爲靜態變量,而是組成:

$validator = Validator::make($data, $rules, $messages); 

你可以使用:

$validator = Validator::make($data, User::$rules, $messages); 

但可以肯定你不應該在你的View中從數據庫中獲取數據,這段代碼應該在控制器中,例如:

$builds = DB::table('blogs')->orderBy('id', 'desc')->get(); 
return View::make('someview')->with('builds', $builds); 

當然,如果你有Blog模型,您應該使用這裏:

$builds = Blog::orderBy('id', 'desc')->get(); 
return View::make('someview')->with('builds', $builds); 

它也不清楚下面的代碼做什麼:

$safeURLSlug = stringHelpers::safeURLSlug($build->blogtitle); 

但也許你可以把它移動到您的Blog型號和使用accessor進行更改:

public function getSafeSlugAttribute($value) { 
    return stringHelpers::safeURLSlug($this->blogtitle); 
} 

,現在你的觀點看起來是這樣的:

@foreach ($builds as $build) 
     {{{ $build->title }}} {{{ $build->safeSlug }}} 
@endforeach 
+0

好吧,我慢慢地得到這張照片。我仍然應該在控制器中進行保存/驗證等,但在模型中定義規則? – Lovelock 2014-12-02 17:08:18

+0

@ user2921557那麼,您不需要在控制器中進行驗證,您可以使用'Validator'模型並在此模型中進行驗證,您只需要在控制器中執行一些操作。您當然也可以在您的模型中創建單獨的方法進行驗證 - 例如,在我當前的項目中,我有validateEdit,validateAdd方法,因爲我需要根據操作或其他數據使用不同的驗證規則 – 2014-12-02 17:12:02

0

我建議你採取Laravel發電機看看。

https://github.com/JeffreyWay/Laravel-4-Generators

安裝,然後運行:

php artisan generate:scaffold customer 

Laravel行命令生成器創建一個基本的CRUD爲你的控制器,模型,視圖和數據庫遷移。這對於安全的時間是很好的,並且讓你的項目保留一些默認的組織。