サーチ…
基本的なルーティング
ルーティングは、一方の側の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パラメータです。この例では、 id
はProfileController
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;
});
これにより、元のバリデータが削除され、バリデータのリストに追加されます。