Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

LaravelのbeforeFilterを利用して特定のControllerやActionにAjax通信の判定をかける

More than 1 year has passed since last update.

Laravelのfilterはルートだけではなく、Controller内に記載して特定のControllerやActionにだけ処理を適用することができます。
例えば、Route::resourceやRoute::controllerを利用している場合などに、ルーティングファイルでFilterをかけることはできないため、Controller側に記載し、ActionごとにFilterをかける必要があります。そんな場合の対応策を。

Filterを作成

app/filter.php
public function _filterAjax($route, $request)
{
    if (!Request::ajax())
        return Response::json('Ajax通信ではありません。');
    }
}

Controllerに適用

    public function __construct()
    {
        parent::__construct();
        $this->beforeFilter('_filterAjax');
    }

__constructのbeforeFilterでメソッドを呼ぶだけで、このControllerを実行する際に必ず実行されるようになります。
また、無名関数を作成しそこに直接記述することもできます。

    public function __construct()
    {
        parent::__construct();
        $this->beforeFilter(function()
        {
            if (!Request::ajax())
                return Response::json('Ajax通信ではありません。');
            }
        });
    }

特定のActionにだけ適用する

    public function __construct()
    {
        parent::__construct();
        $this->beforeFilter('_filterAjax', [
            'only' => [
                'update',
            ],
        ]);
    }

beforeFilterのonlyに指定すれば、指定したActionにのみにFilterがかかります。
なお、Filterをfilter.phpではなく、同一のControllerやBaseControllerに記述する場合は、メソッド名の前に@をつけて呼びだす必要があります。

    public function __construct()
    {
        parent::__construct();
        $this->beforeFilter('@_filterAjax', [
            'only' => [
                'update',
            ],
        ]);
    }

beforeFilterの指定方法あれこれ

filterのActionの指定方法は下記の指定ができます。

指定方法 内容
only 指定したActionのみ
except 指定したAction以外
on 指定したメソッドのみ[post,get,etc...]

onlyやonを組み合わせもできるので様々な状況で対応ができます。

    public function __construct()
    {
        parent::__construct();
        $this->beforeFilter('_filterAjax', [
            'on' => [
                'post',
            ],
            'only' => [
                'update',
            ],
        ]);
    }

記事はbeforeFilterのみでしたが、処理の後に行うafterFilterも同様に利用することができます。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away