Laravel: обработка исключения привязки модели маршрута в запросе ajax - PullRequest
0 голосов
/ 07 апреля 2020

Laravel версия 7.x

Я отправляю методы create и edit через запрос ajax и он работает нормально. Но в моем приложении есть модуль, который зависит от родительского модуля, например: Employee и EmployeeEmergency. Поэтому я добавил параметр Employee $Employee в метод create и route для обработки этого запроса.

Однако, если идентификатор Employee правильный, он работает нормально. Но, если идентификатор недействителен, он генерирует исключение.

{
    "message": "No query results for model [App\\Employee] $arrayModel->token",
    "exception": "Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException",
    ...
}

Я могу обработать это исключение, удалив route model binding и аутентифицировав Employee вручную. Но это просто излишне увеличит код.

Я хочу обработать это исключение с правильным ответом, что-то вроде Employee identifier is invalid или что-то подобное, чтобы уведомить пользователя и предотвратить ошибку.

Сотрудник. php

class Employee extends Model
{
    ...

    public function getRouteKeyName()
    {
        return 'token';
    }

    ...
}

EmployeeEmergencyController. php

use App\Employee;
use App\EmployeeEmergency;

class EmployeeEmergencyController extends Controller
{
    public function create(Employee $employee)
    {
        ...
    }
}

Веб. php

Route::get('employee-emergency/create/{employee}', 'EmployeeEmergencyController@create')
    ->name('admin.employee-emergency.create');

Есть ли какое-то решение для этого из коробки ..?

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Благодаря @Rob, вот мой окончательный код.

RouteServiceProvider. php

public function boot()
{
    parent::boot();

    Route::bind('employee', function ($token) {
        return \App\Employee::where('token', $token)->first() ?? false;
    });
}

В контроллере

public function create($employee)
{
  if($employee == false)
  {
    # setting success message
    session()->flash('warning', 'Could not find the reference for the given `Employee`');

    # redirecting
    return response()->json([
      'success' => false
    ], Response::HTTP_BAD_REQUEST);
  }

  ...
}

Однако этот код работает для меня. Но можно ли его еще улучшить ..?

0 голосов
/ 07 апреля 2020

Во-первых, позвольте мне заметить, что полученная вами ошибка намного больше, чем обычно, потому что вы установили APP_DEBUG на true и APP_ENV на local в .env, если APP_DEBUG is false и APP_ENV = production, ошибка должна быть уменьшена до простого 404.

Во-вторых, если вы посмотрите в документах: https://laravel.com/docs/6.x/routing#explicit -binding

Вы можете видеть, что можете настроить поведение следующим образом:

//App\Providers\RouteServiceProvider.php
public function boot()
{
    parent::boot();

    Route::bind('employee', function ($id) {
        $employee = App\Employee::where('id', $id)->first();
        if (empty($employee)) {
            throw new \Exception('Employee not found');
        }
        return $employee
    });
}

РЕДАКТИРОВАТЬ:

  • Обновлено laravel ссылка
  • Обновлен сам ответ
...