4

Laravelコントローラーには、データベースレコードをフェッチすることから始まり、データが見つかったかどうかを確認した後、ビューのレンダリングを続行するか、データがない場合は404ページに移動するメソッドがいくつかあります。

次に例を示します。

<?php

function get_show_user($id)
{
    $user = static::get_user($user_id);
    if (!$user) {
        return Response::error('404', static::$some_common_error404_message);
    }
    return View::make('users.show_readonly_user_data')->with('user', $user);
}

function get_edit_user($id)
{
    $user = static::get_user($user_id);
    if (!$user) {
        return Response::error('404', static::$some_common_error404_message);
    }

    return View::make('users.display_edit_user_form')->with('user', $user);
}

if (!$user)これらのメソッドがすべて同じことをしている場合でも、これらのメソッドでステートメント全体を繰り返しています。

私はむしろこのようなことをしたいです:

function get_show_user($id)
{
    $user = Users::find($id);
    static::go404_if_null($user);
    return View::make('users.show_readonly_user_data')->with('user', $user);
}

function get_edit_user($id)
{
    $user = Users::find($id);
    static::go404_if_null($user);
    return View::make('users.display_edit_user_form')->with('user', $user);
}

そのようなDRY機能を実装するための最良の方法は何でしょうか?

明らかに、単純なreturn Response::error('404')ものは、そのメソッドからのみ返されるため、共通の存在チェッカーメソッドでは機能しません。

Event::fire('404')トリガーされたメソッドを終了しないため、anも理想的ではないようです。

ここではおそらく例外を使用する必要がありますが、これについて、またはLaravelでどのように行うべきかについてはわかりません。コントローラの404例外をどこでキャッチする必要がありますか?

4

1 に答える 1

1

これにアプローチする最善の方法は、コントローラーのビフォアフィルターだと思います。

public static $require_user = array(
    'edit_user',
    'show_user',
);

public function before()
{
    $route = Request::route();
    if ( in_array( $route->controller_action, static::$require_user ) )
    {
        $this->user = User::find( $route->parameters[0] );
        if ( is_null($this->user) ) return Response::error('404');
    }
}

コントローラが構築された後、メソッドが呼び出される前に、フィルタが呼び出される前。beforeフィルターがnull以外を返す場合、メソッドは呼び出されないため、実行は停止されます。

ここで、実行中の現在のルートを取得して、配列$require_userに対して呼び出されるメソッドを確認できるようにします。これにより、ログインなど、ユーザーIDを必要としないメソッドを使用できます。

次に、ユーザーインスタンスを取得し、メソッドに渡されたものからIDを取得します。ここにエラー処理を追加する必要があります。

最後に、返されたユーザーがnull、つまり見つからないかどうかを確認します。その場合は、404応答を返し、メソッドの実行を停止します。

これがお役に立てば幸いです。

于 2012-10-22T19:05:27.270 に答える