2016-07-30 70 views
6

我正在使用laravel,但並不重要,當您使用laravel命令行工具創建控制器時,它會將4個默認功能放置在那裏以進行創建和更新。對SAVE和UPDATE使用相同的方法是不好的做法嗎?

createstoresave

editupdateupdate

這是laravel建議的商店控制器。

class ShopController extends Controller 
{ 

    public function create() 
    { 
     // return create view 
    } 

    public function store(Request $request) 
    { 
     // save a shop 
    } 

    public function edit($id) 
    { 
     // find a shop , return edit view 
    } 

    public function update(Request $request, $id) 
    { 
     // find the shop with id , update the shop 
    } 

} 

但我喜歡使用相同的方法來顯示視圖和存儲/更新我的行,並避免寫很多額外的代碼。

class ShopController extends Controller 
{ 

    public function create($id = 0) 
    { 
     return view('shop-create' , ['edit'=> Shop::find($id)]); 
    } 

    public function store(Request $request , $id = 0) 
    { 
     $whitelist = [ 
      'title'=>'required', 
      'phone'=>'present|numeric' , 
      'address'=>'present' , 
     ]; 
     $this->validate($request, $whitelist); 
     $shop = Shop::findOrNew($id) ; 
     // find a shop with given id or create a new shop instance 
     foreach($whitelist as $k=>$v) 
     $shop->$k = $request[$k]; 

     $shop->save(); 
    } 

} 

當然,我去我喜歡的(第二個選項),但由於laravel建議第一種方式,只是出於好奇是否有任何理由爲什麼我不應該做這樣的?這是否被認爲是不好的做法?

+0

顯示您的查看源代碼。 –

+0

最好不要反對框架的慣例,它可能會在未來混淆你和其他人。擁抱Laravel的做事方式,您將獲得更容易遵循文檔的獎勵,並且更容易利用框架功能。 – ShaunUK

回答

2

沒有錯,但你的代碼將難以理解,恕我直言。

例如

  • 這種方法做什麼?它被稱爲create,但它也編輯?
  • 該視圖被稱爲shop-create,但它也編輯?
  • 將參數0作爲ID的默認參數並嘗試到find它每次都是不必要的。

public function create($id = 0) 
{ 
    return view('shop-create' , ['edit'=> Shop::find($id)]); 
} 

雖然你以爲你是簡化你的代碼,你把它更復雜,因爲你是從SOLID經紀的Single Responsability principile。

如果您有類似Laravel的建議,最容易理解。

此外,您還保留一個Laravel開發人員可以理解的非常常見的模式,因此您可以聘請某人來處理您的代碼,並且不必擔心他是否會理解。

+1

thanx,我總是可以重命名方法/視圖和'發現'如果'id'大於0 ...但我明白你的觀點,你是對的我會用單獨的方法 – max

3

這樣做沒有任何問題。你提到的「laravel」方式是當你創建一個Restful resource controller,並且只是解決它的一種方法。

我想這些控制器方法是挑選出來的,因爲它們很好地排列在一個「寧靜」型控制器上。如果你要建立一個真正的休息api,那麼從標準的角度來看,你怎麼做會變得更加嚴格(不是laravel強加的,而是更好地遵循laravel的方式)。

如果你沒有創建一個面向公衆的API,或將是由外部實體消費的東西,然後我說你設計的控制器,工作最適合你和你的團隊

1

使用相同的功能,用於保存()和update()是個好主意,但同時它會增加複雜度。一點是如果將來你想改變任何你只需要在一個地方改變的地方。 但同時你需要多加小心。

由於你的功能應該更加動態。

1)多個記錄操作:您可能需要同時更新多個原始數據,所以您的函數應該足夠靈活,可以通過相同的函數插入/更新單個/多個值。意思是,在這兩種情況下,應該爲多個記錄啓動單個查詢。

2)驗證,如果值已經存在:當你要在插入的情況下,檢查一些驗證... 你只需要檢查,如果該值在DB時更新的情況下,你需要存在或不 檢查排除當前的ID 例如

對於插入的情況下

$this->validate($request, [ 
     'email' => 'required|string|email|unique:tablename,email' 
    ]); 

的更新情況

$this->validate($request, [ 
     'email' => 'required|string|email|unique:tablename,email,'.$id.',id' 
    ]); 

,最後非常小的點,但需要考慮..

3)成功的消息:在插入消息的時間應該是「成功添加」,並在更新用時記錄「成功更新」

0

我在我的最後一個項目中使用這種方法,我們稱之爲store()update()功能manage()代替,並有getManage()這將用於創建和編輯了同樣的觀點。我很喜歡這種方法,但遇到了一些值得注意的事情。可悲的是outway的利弊利弊​​,如果你曾經不得不面對這些問題:(

優點:

  • 小碼 - 不再做你在你的store()update()功能的代碼重複的行
  • 如果你知道我的意思 ctrl+c ctrl+v ctrl+f ctrl+r
  • 容易添加/更改輸入值 - -
  • 更快地重新使用基本模型。一個額外的價值,並不意味着就吃g更改store()update()以確保它們都使用額外的輸入。
  • 統一它們的一個函數 - 只要你沒有做任何特別的事情,你甚至可以爲每件事定義一個函數。需要改變一些東西?你有一個功能,不用擔心。

缺點:

  • 代碼更難理解他人(或舊的你) - 如果有人是新的這個方法或者已經有一段時間沒有使用它,瞭解發生了什麼在你的功能內比有兩個單獨的功能要難一些。
  • 驗證是一個麻煩 - 正如在this answer驗證可能會有所不同創建和更新。意思是你有時可能需要寫兩個驗證,最終會導致混亂的代碼,我們不希望這樣做!
  • 值插入並不像我想象的那麼酷 - 如果您想使用相同的預定義數組來創建或更新,那麼您可能會遇到想要在創建時插入值但不想更新它們的問題。這最終導致醜陋的if語句或兩個預定義的數組。

最終這取決於你將要做什麼以及你想要做什麼。如果你有一個基本的網站將管理博客文章和網頁,那麼不用擔心共享store()update()函數。然而,如果你正在創建一個包含許多模型,關係和不同創建和更新輸入值的巨大CMS(這可能意味着不同的驗證),那麼我會按照Laravel的建議去做。從長遠來看,維護起來要容易得多,而且您不必處理頭痛,修復和不潔的代碼。

不管你做什麼,都不要在不同的控制器中做兩個!這會讓人困惑。順便說一下,如果你想知道我有什麼樣的項目 - 這是一個巨大的CMS。所以即使這在某些情況下非常有用也很容易,但可惜並不值得。

+0

thanx,很有洞察力... im爲客戶寫一個團購網站......它不小,但它很簡單,至少在CRUD方法中沒有任何複雜的事情發生,但我仍然認爲我會採用單獨的方法 – max

+0

@max不用擔心。在這種情況下,堅持Laravel提供的看法可能是最好的,因爲當你無法弄清楚自己有什麼問題時,其他人可以更容易地修正錯誤。這是一種恥辱,這種方式有時很無聊,可能會覺得你兩次輸入同樣的東西。但從長遠來看,值得感到厭煩而不是頭痛:P –

0

沒有錯,但在這種情況下,您必須保持正確的註釋,指定您的函數執行添加/編輯,並且您正在使用一些變量,如$ id或其他的東西。如果它可用,則可以更新記錄,否則插入它。

0

這就是我通常這樣做的方式,通過這種方式,您仍然可以通過使用請求進行不同的驗證,並且它仍然清楚(imo)函數的功能。

public function store(AdminPartnerRequest $request) 
{ 
    return $this->handleCreateOrUpdate($request); 
} 

public function update(AdminPartnerRequest $request, $id) 
{ 
    return $this->handleCreateOrUpdate($request,true, $id); 
} 


private function handleCreateOrUpdate($request, $edit = false, $id = null) 
{ 
    if ($edit){ 
     $partner = Partner::find($id); 
    } else{ 
     $partner = new Partner(); 
    } 

     $partner->name = $request->input('name'); 
     $partner->picture = $request->input('image');   
     $partner->save(); 

     return \Redirect::route('admin.partners.index'); 
} 
0

小項目,做你想做的。與其他開發人員一起,遵循約定。

編碼約定是針對特定編程語言的一組準則,針對以該語言編寫的程序的每個方面推薦編程風格,實踐和方法。這些約定通常包括文件組織,縮進,註釋,聲明,語句,空白區域,命名約定,編程實踐,編程原則,編程規則,建築最佳實踐等。這些是軟件結構質量的指導原則。強烈建議軟件程序員遵循這些指導原則,以幫助提高其源代碼的可讀性並使軟件維護更爲簡單。編碼約定僅適用於軟件項目的人員維護人員和同行評審人員。公約可以通過整套團隊或公司遵循的文件化規則來形式化,也可以像個人的習慣編碼慣例一樣非正式。編碼約定不由編譯器強制執行。 - https://en.wikipedia.org/wiki/Coding_conventions

相關問題