サーチ…


基本的なルーティング

ルーティングは、一方の側のHTTPメソッドとURIの間のマップと他方のアクションを定義します。経路は通常、 app/Http/routes.phpファイルに書き込まれます。

最も簡単な形式では、Routeファサードで対応するHTTPメソッドを呼び出し、パラメータとしてURI(アプリケーションルートからの相対パス)に一致する文字列とコールバックを渡すことで、ルートが定義されます。

たとえば、ビューのhomeを返すサイトのルートURIへのルートは次のようになります。

Route::get('/', function() {
    return view('home');
});

ポスト変数を単にエコーするポストリクエストのルート:

Route::post('submit', function() {
   return Input::all();
});

//or

Route::post('submit', function(\Illuminate\Http\Request $request) {
   return $request->all();
});

コントローラメソッドを指すルート

コールバックをインラインで定義する代わりに、[ControllerClassName @ Method]構文のコントローラメソッドを参照できます。

Route::get('login', 'LoginController@index');

複数の動詞のルート

matchメソッドを使用して、指定されたルートのHTTPメソッドの配列を照合することができます。

Route::match(['GET', 'POST'], '/', 'LoginController@index');

また、 allを使用allて、特定のルートのHTTPメソッドに一致させることもできます。

Route::all('login', 'LoginController@index');

ルートグループ

ルートをグループ化して、コードの繰り返しを避けることができます。

のは、の接頭辞を持つすべてのURIとしましょう/admin特定のミドルウェアと呼ばれる使用してadminし、それらはすべてに住んでいるApp\Http\Controllers\Adminのネームスペース。

ルートグループを使用してこれを表現するきれいな方法は、次のとおりです。

Route::group([
    'namespace' => 'Admin',
    'middleware' => 'admin',
    'prefix' => 'admin'
    ], function () {
        
        // something.dev/admin
        // 'App\Http\Controllers\Admin\IndexController'
        // Uses admin middleware
        Route::get('/', ['uses' => 'IndexController@index']);    
        
        // something.dev/admin/logs
        // 'App\Http\Controllers\Admin\LogsController'
        // Uses admin middleware
        Route::get('/logs', ['uses' => 'LogsController@index']);    
});

名前付きルート

名前付きルートは、URLを生成するために使用されるか、特定のルートにリダイレクトされます。名前付きルートを使用する利点は、将来ルートのURIを変更した場合、名前付きルートを使用している場合は、URLを変更したり、そのルートを指すリダイレクトを行う必要がなくなります。しかし、リンクがURLを使用して生成された場合[ url('/admin/login') ]を使用すると、どこで使用されているかを変更する必要があります。

名前付きルートはas配列キーas使用asて作成されます

Route::get('login', ['as' => 'loginPage', 'uses' => 'LoginController@index']);

またはメソッドnameを使用する

Route::get('login', 'LoginController@index')->name('loginPage');

名前付きルートを使用してURLを生成する

ルートの名前を使用してURLを生成するには

$url = route('loginPage');

リダイレクトにルート名を使用している場合

$redirect = Redirect::route('loginPage');

ルートパラメータ

ルートパラメータを使用すると、URIセグメントの一部を取得できます。ルートを作成するときにオプションの/必須のルートパラメータを定義することができます。オプションのパラメータには?パラメータ名の末尾に追加されます。この名前は中括弧{}囲まれています

オプションのパラメータ

Route::get('profile/{id?}', ['as' => 'viewProfile', 'uses' => 'ProfileController@view']);

このルートは、 domain.com/profile/23 23からアクセスできます。ここで、23はidパラメータです。この例では、 idProfileController viewメソッドのパラメータとして渡されます。これはオプションのパラメータであるため、 domain.com/profileうまく動作します。

必須パラメータ

Route::get('profile/{id}', ['as' => 'viewProfile', 'uses' => 'ProfileController@view']);

必要なパラメータの名前には?がないことに注意してください?パラメータ名の最後に。

コントローラのパラメータへのアクセス

あなたのコントローラでは、viewメソッドはroutes.php同じ名前のパラメータをとり、通常の変数のように使うことができます。 Laravelは値を注入します:

public function view($id){
    echo $id;
}

すべてのルートをキャッチ

すべてのルートをキャッチする場合は、次のように正規表現を使用できます。

Route::any('{catchall}', 'CatchAllController@handle')->where('catchall', '.*');

重要:他のルートがあり、キャッチオールが干渉したくない場合は、最後に配置する必要があります。例えば:

既に定義されている以外のルートをすべて捕捉する

Route::get('login',  'AuthController@login');
Route::get('logout', 'AuthController@logout');
Route::get('home',   'HomeController@home');

// The catch-all will match anything except the previous defined routes.
Route::any('{catchall}', 'CatchAllController@handle')->where('catchall', '.*');

ルートは宣言された順序で一致します

これはLaravelのルートによくある問題です。ルートは、宣言されている順序で一致します。最初にマッチするルートが使用されます。

この例は期待通りに動作します:

Route::get('/posts/{postId}/comments/{commentId}', 'CommentController@show');
Route::get('/posts/{postId}', 'PostController@show');

/posts/1/comments/1へのgetリクエストは、 CommentController@showを呼び出します。 /posts/1へのgetリクエストは、 PostController@showを呼び出します。

ただし、この例は同じように動作しません。

Route::get('/posts/{postId}', 'PostController@show');
Route::get('/posts/{postId}/comments/{commentId}', 'CommentController@show');

/posts/1/comments/1へのgetリクエストはPostController@showを呼び出します。 /posts/1へのgetリクエストは、 PostController@showを呼び出します。

Laravelは最初に一致したルートを使用するため、 /posts/1/comments/1へのリクエストはRoute::get('/posts/{postId}', 'PostController@show');変数$postIdを値1/comments/1代入します。これは、 CommentController@showが呼び出されないことを意味します。

大文字と小文字を区別しないルート

Laravelのルートでは、大文字と小文字が区別されます。それは、

Route::get('login', ...);

/loginへのGET要求は一致し/loginが、 /LoginへのGET要求とは一致しません。

ルートを大文字と小文字を区別しないようにするには、要求されたURLと定義されたルートを照合する新しいバリデータークラスを作成する必要があります。新しいバリデータと既存のバリデータとの唯一の違いは、コンパイルされたルートの正規表現の最後にi修飾子を追加して、大文字と小文字を区別しない一致を有効にすることです。

<?php namespace Some\Namespace;

use Illuminate\Http\Request;
use Illuminate\Routing\Route;
use Illuminate\Routing\Matching\ValidatorInterface;

class CaseInsensitiveUriValidator implements ValidatorInterface
{
  public function matches(Route $route, Request $request)
  {
    $path = $request->path() == '/' ? '/' : '/'.$request->path();
    return preg_match(preg_replace('/$/','i', $route->getCompiled()->getRegex()), rawurldecode($path));
  }
}

Laravelが新しいバリデータを使用するには、URLとルートを照合し、元のUriValidatorをあなたのものに置き換えるために使用するマッチャーのリストを更新する必要があります。

これを行うには、routes.phpファイルの最上部に次の行を追加します:

<?php
use Illuminate\Routing\Route as IlluminateRoute;
use Your\Namespace\CaseInsensitiveUriValidator;
use Illuminate\Routing\Matching\UriValidator;

$validators = IlluminateRoute::getValidators();
$validators[] = new CaseInsensitiveUriValidator;
IlluminateRoute::$validators = array_filter($validators, function($validator) { 
  return get_class($validator) != UriValidator::class;
});

これにより、元のバリデータが削除され、バリデータのリストに追加されます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow