Поиск…


Основная маршрутизация

Маршрутизация определяет карту между методами HTTP и URI с одной стороны, а действия - с другой. Маршруты обычно записываются в файле app/Http/routes.php .

В своей простейшей форме маршрут определяется путем вызова соответствующего метода HTTP на фасаде маршрута, передавая в качестве параметров строку, которая соответствует URI (относительно корня приложения), и обратный вызов.

Например: маршрут к корневому URI сайта , который возвращает вид home выглядит следующим образом :

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::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. Вы можете определить необязательный или требуемый параметр / s маршрута при создании маршрута. Необязательные параметры имеют ? добавляется в конце имени параметра. Это имя заключено в фигурные скобки {}

Необязательный параметр

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

К этому маршруту можно обращаться по domain.com/profile/23 где 23 - это параметр id. В этом примере id передается в качестве параметра в view метода ProfileController . Поскольку это необязательный параметр, доступ к domain.com/profile работает просто отлично.

Требуемый параметр

Route::get('profile/{id}', ['as' => 'viewProfile', 'uses' => 'ProfileController@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', ...);

будет соответствовать запросу GET для /login но не будет соответствовать запросу GET в /Login .

Чтобы ваши маршруты были нечувствительны к регистру, вам необходимо создать новый класс проверки, который будет соответствовать запрошенным 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