수색…


기본 라우팅

라우팅은 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 매개 변수입니다. 이 예제에서 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 요청을 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;
});

이렇게하면 원래 유효성 검사기가 제거되고 유효성 검사기 목록에 추가됩니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow