Laravel Implict Binding没有获得模型的查询结果

时间:2016-09-29 05:30:26

标签: php laravel laravel-5 eloquent laravel-routing

我想要建议如何处理以及哪种方法最好。 隐式绑定正常绑定方法。

我使用Laravel路由隐式绑定。当我发布错误的ID时,我收到错误没有模型的查询结果如何在控制器中处理而不是异常处理程序。现在我完成了异常处理程序,但需要更好的解决方案来处理这个或避免隐式绑定。

// Web.php

Route::delete('/master/user/department/{department}/delete', ['as' => 'master.user.department.destroy', 'middleware' => 'permission:master.user.department.destroy', 'uses' => 'Master\User\DepartmentController@destroy']);

// DepartmentContrller.php

public function destroy(Department $department)
{
        try {
            $department->delete();
            return redirect(route('master.user.department.index'))->with('success', array(' Department Deleted successfully'));
        } catch (Exception $e) {
            return back()->with('criticalError', array($e->getMessage()));
        }
}

// Handler.php

if ($exception instanceof \Illuminate\Database\Eloquent\ModelNotFoundException)
{
    return redirect()->back()->with('custom_modal', ['Model Not Found Exception', $exception->getMessage()]);
}

以下代码完美无缺,我想知道哪种方法最好。 //DepartmentContrller.php

public function destroy($id)
{
        try {
            $department=Department::find($id);
            if($department){
                $department->delete();
                return redirect(route('master.user.department.index'))->with('success', array(' Department Deleted successfully'));
            }
            else{
                return back()->with('criticalError', array('Department is not found.'));
            }
        } catch (Exception $e) {
            return back()->with('criticalError', array($e->getMessage()));
        }
}

2 个答案:

答案 0 :(得分:1)

两种方法都有效。您可以选择适合您情况的方法。

隐式模型绑定可以让你更快地获得代码,但是你放弃了一些控制。

显式(正常)绑定将需要更多代码来编写,但您可以完全控制如何捕获和处理异常。

只是一个FYI,如果你坚持使用隐式绑定,ModelNotFoundException有一个getModel()方法,它将为你提供导致异常的模型的名称。这将允许您更多地自定义异常处理,但仍然没有给出与处理发生异常时相同的控制。

答案 1 :(得分:-2)

以上所有方法都适用于你,但你可以覆盖elqoent方法--find(),以防你在你的相应模型中

// Put this in any model and use
// Modelname::find($id);
public static function findOrCreate($id)
{
     $obj = static::find($id);
     return $obj ?: new static;
}

in depth description