컨트롤러에서 필터 등록하기

Submitted by river - 등록 4 years ago - 수정 4 years ago
class MyController extends \Controller
{
    public function __construct()
    {
        $this->beforeFilter('auth');
    }
}
class MyController extends \Controller
{
    public function __construct()
    {
        $this->beforeFilter('auth', ['except' => 'login']);
        $this->beforeFilter('csrf', ['on' => 'post']);
    }
}
class MyController extends \Controller
{
    public function __construct()
    {
        $this->beforeFilter(function()
        {
            if (date('G') < 6)
            {
                return "This website doesn't work before 6am";
            }
        }
    }
}
class MyController extends \Controller
{
    public function __construct()
    {
        # the @ makes it look for this function inside the controller instance.
        $this->beforeFilter('@foofunc', ['only' => ['edit', 'delete', 'update']]);
    }

    public function foofunc(\Illuminate\Routing\Route $route, \Illuminate\Http\Request $request = null, $value = null)
    {
        dd([$route->parameters(), $request->all(), get_class($value)]);
    }
}

reource route에서 필터 등록

resource route 설정에서 다음의 형태로 brefore filter로 등록가능할 것 같지만, 불가능하다. resouce 메써드가 이를 지원하지 않는다. 참고3

Route::resource('my', 'MyController', ['before' => 'auth']);

이의 해결 방법은 route group을 사용하는 것이다.

Route::group(['before' => 'auth'], function()
{
   Route::resource('my', 'MyController');
});

하지만 이렇게 정의한 경우에는 컨트롤러에서 forgetBeforeFilter가 동작하지 않는다. 아직 이 상황에 대한 원인 및 해결책은 모르곘다.

class MyController extends \Controller
{
    public function __construct()
    {
        if (date('G') < 6)
        {
            # 다음 구문이 실행되도 auth 필터는 동작한다.
            $this->forgetBeforeFilter('auth');
        }
    }
}

참고

comments powered by Disqus