2016-07-30 61 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

相关问题