使用相同的方法进行SAVE和UPDATE是不好的做法吗?

max*_*max 8 php laravel eloquent

我正在使用laravel,但这并不重要,当你使用laravel命令行工具创建一个控制器时,它会在其中放置4个默认函数进行创建和更新.

createstoresave

editupdateupdate!

这就是laravel为Shop控制器提出的建议.

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
    }

}
Run Code Online (Sandbox Code Playgroud)

但我喜欢使用相同的方法来显示视图并存储/更新我的行,并避免编写大量额外的代码.

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();
     }

}
Run Code Online (Sandbox Code Playgroud)

当然,我选择了我喜欢的东西(第二种选择),但是由于laravel提出了第一种方式,出于好奇,我有什么理由不这样做吗?这在任何方面都被认为是不好的做法吗?

Eli*_*res 5

没错,但是恕我直言,您的代码将更难以理解。

例如

  • 这种方法有什么作用?称为create,但它也可以编辑吗?
  • 该视图被调用,shop-create但它也可以编辑吗?
  • 不需要传递0参数作为id的默认值,并且find每次都尝试输入它。

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

尽管您认为自己正在简化代码,但是由于违反了SOLIDSingle Responsibility原理,因此使代码变得更加复杂。

如果您有类似Laravel的建议,就更容易理解。

此外,您还保留了任何Laravel开发人员都可以理解的非常常见的模式,因此您可以雇用某人来照顾您的代码,而不用担心他是否会理解。