Szukaj…


Podstawowy routing

Routing definiuje mapę między metodami HTTP i identyfikatorami URI z jednej strony, a działaniami z drugiej. Trasy są zwykle zapisywane w pliku app/Http/routes.php .

W najprostszej postaci trasa jest definiowana przez wywołanie odpowiedniej metody HTTP na elewacji trasy, przekazując jako parametry ciąg pasujący do identyfikatora URI (względem katalogu głównego aplikacji) i wywołanie zwrotne.

Na przykład: trasa do korzeni URI strony, która zwraca widok home wygląda następująco:

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

Trasa żądania postu, która po prostu odzwierciedla zmienne postu:

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

//or

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

Trasy wskazujące na metodę kontrolera

Zamiast definiować wbudowane wywołanie zwrotne, trasa może odwoływać się do metody kontrolera w składni [ControllerClassName @ Method]:

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

Trasa dla wielu czasowników

Metodę match można użyć do dopasowania tablicy metod HTTP dla danej trasy:

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

Możesz także użyć all aby dopasować dowolną metodę HTTP dla danej trasy:

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

Grupy tras

Trasy można grupować, aby uniknąć powtarzania kodu.

Załóżmy, że wszystkie identyfikatory URI z prefiksem /admin używają określonego oprogramowania pośredniego o nazwie admin i wszystkie znajdują się w przestrzeni nazw App\Http\Controllers\Admin .

Prosty sposób przedstawienia tego za pomocą grup tras jest następujący:

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']);    
});

Nazwana trasa

Nazwane trasy służą do generowania adresu URL lub przekierowań do określonej trasy. Zaletą korzystania z nazwanej trasy jest to, że jeśli zmienimy identyfikator URI trasy w przyszłości, nie będziemy musieli zmieniać adresu URL ani przekierowań wskazujących tę trasę, jeśli używamy nazwanej trasy. Ale jeśli linki zostały wygenerowane przy użyciu adresu URL [np. url('/admin/login') ], wtedy musielibyśmy zmieniać wszędzie tam, gdzie jest używany.

Nazwane trasy są tworzone przy użyciu as klucz tablicy

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

lub za pomocą name metody

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

Wygeneruj adres URL, używając nazwanej trasy

Aby wygenerować adres URL przy użyciu nazwy trasy

$url = route('loginPage');

Jeśli używasz nazwy trasy do przekierowania

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

Parametry trasy

Możesz użyć parametrów trasy, aby uzyskać część segmentu URI. Możesz zdefiniować opcjonalny lub wymagany parametr / parametry trasy podczas tworzenia trasy. Opcjonalne parametry mają ? dołączany na końcu nazwy parametru. Ta nazwa jest zamknięta w nawiasy klamrowe {}

Opcjonalny parametr

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

Dostęp do tej trasy można uzyskać przez domain.com/profile/23 gdzie 23 to parametr id. W tym przykładzie id jest przekazywany jako parametr w metodzie view ProfileController . Ponieważ jest to parametr opcjonalny, dostęp do domain.com/profile działa dobrze.

Wymagany parametr

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

Zauważ, że nazwa wymaganego parametru nie ma ? na końcu nazwy parametru.

Dostęp do parametru w kontrolerze

W kontrolerze twoja metoda widoku przyjmuje parametr o tej samej nazwie co nazwa w routes.php i może być używana jak normalna zmienna. Laravel dba o wartość:

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

Złap wszystkie trasy

Jeśli chcesz złapać wszystkie trasy, możesz użyć wyrażenia regularnego, jak pokazano:

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

Ważne: jeśli masz inne trasy i nie chcesz, aby catch-all przeszkadzał, powinieneś to zakończyć. Na przykład:

Łapanie wszystkich tras z wyjątkiem już zdefiniowanych

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', '.*');

Trasy są dopasowywane w kolejności ich zadeklarowania

Jest to powszechna gotcha z trasami Laravel. Trasy są dopasowywane w kolejności, w której zostały zadeklarowane. Pierwszą pasującą trasą jest ta, która jest używana.

Ten przykład będzie działał zgodnie z oczekiwaniami:

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

Zapytanie get do /posts/1/comments/1 wywoła CommentController@show . Żądanie get do /posts/1 wywoła PostController@show .

Jednak ten przykład nie będzie działał w ten sam sposób:

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

Zapytanie get do /posts/1/comments/1 wywoła PostController@show . Żądanie get do /posts/1 wywoła PostController@show .

Ponieważ Laravel używa pierwszej dopasowanej trasy, żądanie do /posts/1/comments/1 pasuje do Route::get('/posts/{postId}', 'PostController@show'); i przypisuje zmienną $postId do wartości 1/comments/1 . Oznacza to, że CommentController@show nigdy nie zostanie wywołany.

Trasy bez rozróżniania wielkości liter

W trasach w Laravel rozróżniana jest wielkość liter. Oznacza to, że trasa jak

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

dopasuje żądanie GET do /login ale nie będzie pasowało do żądania GET do /Login .

Aby w rozróżnianiu wielkości liter w trasach nie była rozróżniana wielkość liter, musisz utworzyć nową klasę walidatora, która będzie dopasowywać żądane adresy URL do zdefiniowanych tras. Jedyną różnicą między nowym walidatorem a istniejącym jest to, że dołącza on modyfikator i na końcu wyrażenia regularnego do skompilowanej trasy, aby przełączyć umożliwić dopasowanie bez rozróżniania wielkości liter.

<?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));
  }
}

Aby Laravel mógł używać twojego nowego walidatora, musisz zaktualizować listę dopasowań, które są używane do dopasowania adresu URL do trasy i zastąpić oryginalny UriValidator twoim.

W tym celu dodaj u góry pliku tras.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;
});

Spowoduje to usunięcie oryginalnego walidatora i dodanie go do listy walidatorów.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow