수색…
기본 라우팅
라우팅은 HTTP 메소드와 URI 사이의 맵을 한 쪽에서 정의하고 다른 쪽에서 작업을 정의합니다. 경로는 일반적으로 app/Http/routes.php
파일에 기록됩니다.
가장 단순한 형식에서 경로는 Route facade에서 해당 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
을 사용하여 특정 경로에 대한 모든 HTTP 메소드를 일치시킬 수 있습니다.
Route::all('login', 'LoginController@index');
경로 그룹
코드 반복을 피하기 위해 경로를 그룹화 할 수 있습니다.
의는의 접두사를 가진 모든 URI를 가정 해 봅시다 /admin
특정 미들웨어라고 사용 admin
하고 그들은 모두에 살고있는 App\Http\Controllers\Admin
네임 스페이스.
Route Groups를 사용하여 이것을 표현하는 명확한 방법은 다음과 같습니다.
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
배열 키
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은 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
요청을 CommentController@show
가 호출됩니다. /posts/1
대한 요청을 PostController@show
가 호출됩니다.
그러나이 예제는 같은 방식으로 작동하지 않습니다.
Route::get('/posts/{postId}', 'PostController@show'); Route::get('/posts/{postId}/comments/{commentId}', 'CommentController@show');
/posts/1/comments/1
요청을 PostController@show
가 호출됩니다. /posts/1
대한 요청을 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
대한 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를 귀하의 것으로 대체하는 데 사용되는 matchers 목록을 업데이트해야합니다.
이를 수행하기 위해 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;
});
이렇게하면 원래 유효성 검사기가 제거되고 유효성 검사기 목록에 추가됩니다.