>

라 라벨 애플리케이션을 개발 중입니다. 미들웨어에서 경로 모델 바인딩을 수행하고 있습니다.

이런 경로가 있습니다

Route::group([ 'prefix' => 'department/{department}', 'middleware' => [ 'auth.department' ] ], function () {
    Route::post('employee/create', 'EmployeeController@store')->name('employees.store');
});

이것은 내 auth.department 미들웨어 (AuthDepartment)입니다

class AuthDepartment
{
    public function handle($request, Closure $next)
    {
        $department = Department::find($request->department);
        //do something with the department
        //I want to set the $department (Department model) in the place of {department} in the route.

        return $next($request);
    }
}

이것은 EmployeeController입니다

class EmployeeController extends Controller {
    public function store($department)
    {
    }
}

코드에서 알 수 있듯이 $department 매개 변수를 사용하여 경로에서 부서 ID를 가져옵니다. 그러나 정수를 매개 변수로 가져 오는 대신 모델을 다음과 같이 바인딩하고 싶습니다.

class EmployeeController extends Controller {
     public function store(Department $department)
     {
     }
}

현재 코드로 작동하지 않습니다. 액션의 값과 일치하도록 모델을 바인딩하기 위해 미들웨어에서 경로 매개 변수를 설정하려고했습니다.

$request->route()->setParameter('department', $department)

하지만 작동하지 않습니다. 라우트 매개 변수를 미들웨어의 모델로 설정/바꾸려면 어떻게해야합니까? 가능합니까? 더 나은 접근 방법은 무엇입니까?

사용한 경우

$request->route()->setParameter('department', $department)

매개 변수를 설정하기 위해 이와 같이 컨트롤러의 동작에 유형을 설정할 수 없습니다.

store(Department $department)

그러나 괜찮습니다

store(Department $department)

그러나 나는 이것을 원한다

store(Department $department)

  • 답변 # 1

    Laravel에는 이미 내장되어 있습니다.이를 Route Model Binding이라고합니다.

    https://laravel.com/docs/5.7/routing#route-model-binding

    미들웨어를 제거하고 대신 컨트롤러를 그대로 유지하십시오. Laravel은 요청에서 자동으로 ID를 사용하여 모델을 찾고 인스턴스를 제공합니다. 모델을 찾을 수 없으면 Laravel이 404 응답을 보냅니다.

  • 이전 excel - 명명 된 범위가있는 셀 입력을 기반으로 범위를 설정하십시오
  • 다음 entity framework - 두 번째 DbContextSavechanges가 실패하는 경우 DbContextSavechanges를 되돌립니다