0

在 laravel 中,我正在创建一个记录,即添加一个新总线。我正在尝试 Laravel Observer 来检查编写逻辑。在这里,我检查了具有相同注册号的总线是否已经存在,如果没有,它应该插入总线。但如果总线已经创建或存在,则不应创建新记录并应发送错误消息。

这是我的总线控制器

public function store(Request $request)
{
    $request->validate([
        'bus_type_id' => 'required',
        'route_id' => 'required',
        'reg_num' => 'required',
        'seat_capacity' => 'required',
    ]);

    Bus::create($request->all());

    return redirect()
        ->route('bus')
        ->with('success','New Bus Added successfully.');
}

这是我的 BusObserver,它检查 reg_num 是否存在

public function creating(Bus $bus)
{
    $count = Bus::where('reg_num', '=' ,$bus->reg_num)->count();

    // dd($count);
    if($count == 1) {
        // avoid inserting and show error message
    }
}

当我这样做dd($count);时,它会显示具有相同 reg_num 的总线数量,这正是我想要的。但我不想create()在控制器中执行方法。我也知道我们不能从 Observer 重定向。那么,我应该如何执行此操作?

4

1 回答 1

1

异常处理程序的工作方式是捕获所有异常并将其转换为您想要的错误。因此,您可以从应用程序中的任何位置抛出异常(重定向仅在 http 调用的上下文中起作用),它将由异常处理程序处理。

创建自己的例外。

class DuplicateBusException extends Exception {
    public function __construct() {
    }
}

public function creating(Bus $bus)
{
    $count = Bus::where('reg_num', '=' ,$bus->reg_num)->count();
    // dd($count);
    if($count == 1) {
        throw new DuplicateBusException();
    }
}

现在您可以在 中app/Exceptions/Handler.php,制作应该适当处理它的逻辑。

public function render($request, Exception $exception)
{
    if ($exception instanceof DuplicateBusException) {
        //your logic for an example an redirect
        return redirect()->back();
    }

    return parent::render($request, $exception);
}
于 2021-02-22T11:00:21.317 回答