Поиск…
Основная маршрутизация
Маршрутизация определяет карту между методами 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;
});
Это удалит исходный валидатор и добавит ваш список в список валидаторов.