Laravel (5.7) Генерация URL
Ваше веб-приложение вращается вокруг маршрутов и URL-адресов. В конце концов, именно они направляют ваших пользователей на ваши страницы. В конце концов, обслуживание страниц - это то, что должно делать любое веб-приложение.
Ваши пользователи могут не заинтересоваться долго, если вы обслуживаете только одну страницу, и если вы намереваетесь перемещать их по своему веб-сайту или веб-приложению, тогда вам нужно будет использовать критическую функцию Интернета, называемую гиперссылками. Чтобы создать гиперссылки, нам нужно создать URL-адреса для нашего приложения. Мы могли бы сделать это вручную, но Laravel может сэкономить нам немного усилий, предоставив несколько помощников, которые помогут в создании URL-адресов. Давайте посмотрим на эти функции.
Текущий URL
Получить текущий URL в Laravel очень просто. Просто используйте помощник URL :: current (). Давайте создадим простой маршрут для его тестирования.
<?php
// app/routes.php
Route::get('/current/url', function()
{
return URL::current();
});
Теперь, если мы посетим наш / current / url url, мы получим следующий ответ.
http://myapp.dev/current/url
Давайте посмотрим на URL :: full () далее, вы видите, что он возвращает текущий URL.
Давайте попробуем этот последний маршрут еще раз, но на этот раз мы включим некоторые дополнительные данные в качестве параметров GET.
http://myapp.dev/current/url?foo=bar
Вы увидите, что результат URL :: current () удаляет лишние данные запроса, например так:
http://myapp.dev/current/url
Ну, метод URL :: full () немного отличается. Давайте изменим наш существующий маршрут, чтобы использовать его. Как это:
<?php
// app/routes.php
Route::get('/current/url', function()
{
return URL::full();
});
Теперь давайте снова попробуем URL / current / url? Foo = bar. На этот раз мы получаем следующий результат:
http://myapp.dev/current/url?foo=bar
Видите ли, метод URL :: full () также включает дополнительные данные запроса.
Этот следующий на самом деле не способ получить текущий URL, но я чувствую, что он, безусловно, имеет свое место в этом подзаголовке. Видите ли, это метод получения предыдущего URL, который обозначен заголовком запроса 'referer'.
Я придумал хитрую ловушку, использующую тип ответа Redirect для отображения вывода. Посмотрите на следующий пример.
<?php
// app/routes.php
Route::get('first', function()
{
// Redirect to the second route.
return Redirect::to('second');
});
Route::get('second', function()
{
return URL::previous();
});
Таким образом, наш первый маршрут перенаправляет на второй маршрут. Второй маршрут выведет URL предыдущего запроса, используя метод URL :: previous ().
Давайте посмотрим на / первый URI, чтобы увидеть, что происходит.
Возможно, вы видели уведомление о перенаправлении в течение доли секунды, но, надеюсь, вы получите следующий ответ:
http://demo.dev/first
Видите ли, после перенаправления, метод URL :: previous дает URL для предыдущего запроса, который в этом случае является URL для первого маршрута.
Создание URL-адресов фреймворка
Этот раздел посвящен созданию URL-адресов, которые помогут нам перемещаться по различным маршрутам или страницам нашего сайта или приложения.
Давайте начнем с создания URL-адресов для конкретных URI. Мы можем сделать это используя метод URL :: to (). Как это:
<?php
// app/routes.php
Route::get('example', function()
{
return URL::to('another/route');
});
Ответ, который мы получаем при посещении / примере, выглядит следующим образом.
http://demo.dev/another/route
Как вы можете видеть, Laravel создал URL для запрошенного нами маршрута. Вы должны заметить, что другой / маршрут не существует, но мы можем связываться с ним в любом случае. Убедитесь, что вы помните это при создании ссылок на URI.
Вы можете указать дополнительные параметры для метода URL :: to () в виде массива. Эти параметры будут добавлены в конец маршрута. Вот пример:
<?php
// app/routes.php
Route::get('example', function()
{
return URL::to('another/route', array('foo', 'bar'));
});
Результирующая строка примет следующую форму.
http://myapp.dev/another/route/foo/bar
Если вы хотите, чтобы сгенерированные URL-адреса использовали протокол HTTPS, у вас есть два варианта. Первый вариант - передать true в качестве третьего параметра методу URL :: to (), например так:
URL::to('another/route', array('foo', 'bar'), true);
Однако, если вы не хотите предоставлять параметры для своего URL, вам нужно будет передать пустой массив или null в качестве второго параметра. Вместо этого более эффективно использовать описательный метод URL :: secure (), например так:
URL::secure('another/route');
Еще раз, вы можете передать массив параметров маршрута в качестве второго параметра метода методу URL :: secure (), например так:
URL::secure('another/route', array('foo', 'bar'));
Давайте посмотрим на метод следующего поколения. Помните ли вы, что мы узнали, как назначать псевдонимы нашим маршрутам в главе о расширенной маршрутизации? Именованные маршруты выглядят так:
<?php
// app/routes.php
Route::get('the/best/avenger', array('as' => 'ironman', function()
{
return 'Tony Stark';
}));
Route::get('example', function()
{
return URL::route('ironman');
});
Если мы посетим / пример маршрута, мы получим следующий ответ.
http://myapp.dev/the/best/avenger
Laravel взял наш никнейм маршрута и нашел связанный с ним URI. Если бы мы изменили URI, выходные данные также изменились бы. Это очень полезно, чтобы избежать необходимости изменять один URI для многих представлений.
Как и метод URL :: to (), метод URL :: route () может принимать массив параметров в качестве второго параметра метода. Кроме того, он вставит их в правильном порядке в URI. Давайте посмотрим на это в действии.
<?php
// app/routes.php
Route::get('the/{first}/avenger/{second}', array(
'as' => 'ironman',
function($first, $second) {
return "Tony Stark, the {$first} avenger {$second}.";
}
));
Route::get('example', function()
{
return URL::route('ironman', array('best', 'ever'));
});
Если мы посетим следующий URL ...
http://myapp.dev/example
... Laravel заполнит пробелы в правильном порядке, с параметрами, которые мы предоставили. Следующий URL отображает ответ.
http://myapp.dev/the/best/avenger/ever
Есть один последний метод маршрутизации этого типа, который вам нужно знать, и это то, как маршрутизировать действия контроллера. На самом деле, это должно быть довольно просто, поскольку оно следует той же схеме, что и метод URL :: route (). Давайте посмотрим на пример.
<?php
// app/routes.php
// Our Controller.
class Stark extends BaseController
{
public function tony()
{
return 'You can count on me, to pleasure myself.';
}
}
// Route to the Stark controller.
Route::get('i/am/iron/man', '[email protected]');
Route::get('example', function()
{
return URL::action('[email protected]');
});
В этом примере мы создаем новый контроллер под названием «Stark» с действием «tony ()». Мы создаем новый маршрут для действия контроллера. Далее мы создаем пример маршрута, который возвращает значение метода URL :: action (). Первым параметром этого метода является комбинация класса и действия, для которой мы хотим получить URL. Формат этого параметра идентичен тому, который мы используем для маршрутизации на контроллеры.
Если мы посетим URL-адрес / example, мы получим следующий ответ.
http://myapp.dev/i/am/iron/man
Laravel идентифицировал URL для пары действий контроллера, которую мы запросили, и доставил ее в качестве ответа. Как и в случае с другими методами, мы можем предоставить массив параметров в качестве второго параметра для метода URL :: action (). Давайте посмотрим это в действии.
<?php
// app/routes.php
// Our Controller.
class Stark extends BaseController
{
public function tony($whatIsTony)
{
// ...
}
}
// Route to the Stark controller.
Route::get('tony/the/{first}/genius', '[email protected]');
Route::get('example', function()
{
return URL::action('[email protected]', array('narcissist'));
});
Как и в последнем примере, мы предоставляем массив с одним параметром в качестве параметра для метода URL :: action (), а Laravel создает URL-адрес контроллера, с параметром в правильном расположении.
URL-адрес, который мы получаем, выглядит следующим образом.
http://myapp.dev/tony/the/narcissist/genius
URL-адреса активов
URL-адреса ресурсов, таких как изображения, файлы CSS и JavaScript, должны обрабатываться немного по-другому. Большинство из вас будут использовать красивые URL с Laravel. Это действие переписать URL, чтобы удалить фронт-контроллер index.php, и сделать наши URL более удобными для SEO.
Однако в некоторых ситуациях вы можете не захотеть использовать красивые URL-адреса. Однако, если вы попытаетесь связать ресурс с помощью помощников, упомянутых в предыдущем подразделе, тогда будет включена часть URL index.php, и ссылки на ресурс разорвутся.
Даже с красивыми URL, мы не хотим ссылаться на наши активы, используя относительные URL, потому что наши сегменты маршрутизации будут перепутаны для структуры папок.
Помощники предоставляются для создания абсолютных URL-адресов для наших активов. Давайте посмотрим на некоторых из этих помощников.
Во-первых, у нас есть метод URL :: asset (), давайте посмотрим на него в действии. Первым параметром метода является относительный путь к активу.
<?php
// app/routes.php
Route::get('example', function()
{
return URL::asset('img/logo.png');
});
Теперь, если мы посетим URL / пример, нас встретит следующий ответ.
http://myapp.dev/img/logo.png
Laravel создал для нас абсолютный путь к активам. Если мы хотим использовать безопасный протокол HTTPS для ссылки на наши активы, то мы можем передать true в качестве второго параметра методу URL :: asset (), например так:
<?php
// app/routes.php
Route::get('example', function()
{
return URL::asset('img/logo.png', true);
});
Теперь мы получаем следующий ответ от / example URL.
https://demo.dev/img/logo.png
Большой! Laravel также предоставляет гораздо более информативный метод создания безопасных URL-адресов активов. Просто используйте метод URL :: secureAsset () и передайте относительный путь к вашему ресурсу.
<?php
// app/routes.php
Route::get('example', function()
{
return URL::secureAsset('img/logo.png');
});
Ответ от этого маршрута такой же, как и в предыдущем методе.
https://demo.dev/img/logo.png
Ярлыки Поколения
Тем не менее, логика ваших взглядов должна быть короткой и аккуратной. Кроме того, это снимает напряжение с ваших пальцев.
Вот почему Laravel предоставил некоторые ярлыки для некоторых методов, доступных в классе URL.
Во-первых, у нас есть функция URL (). Он принимает параметры, идентичные методу URL :: to (), поэтому я не буду описывать их снова. Вот пример этого в действии.
<!-- app/views/example.blade.php -->
<a href="{{ url('my/route', array('foo', 'bar'), true) }}">My Route</a>
Теперь, если мы посмотрим на ссылку в исходном представлении, мы увидим следующее.
<a href="https://demo.dev/my/route/foo/bar">My Route</a>
URL был создан так же, как и метод URL :: to (). Как и прежде, существует также ярлык, который можно использовать для создания защищенного URL. Это выглядит так:
<!-- app/views/example.blade.php -->
<a href="{{ secure_url('my/route', array('foo', 'bar')) }}">My Route</a>
Функция secure_url () принимает ту же сигнатуру, что и метод URL :: secure (). Первый параметр - это маршрут, а второй - массив параметров маршрута, которые необходимо добавить.
Функция route () является ярлыком для метода URL :: route () и используется для создания URL-адресов для именованных маршрутов. Это выглядит так:
<!-- app/views/example.blade.php -->
<a href="{{ route('myroute') }}">My Route</a>
Как вы уже догадались, есть и ярлык для третьего метода генерации URL маршрута. Функция action () может использоваться в качестве ярлыка для метода URL :: action () и может использоваться для генерации ссылок на действия контроллера.
<!-- app/views/example.blade.php -->
<a href="{{ action('[email protected]') }}">My Link</a>
Как и в случае с методом URL :: action (), они могут принимать второй и третий параметры для параметров маршрута и создания безопасного URL.
<!-- app/views/example.blade.php -->
<a href="{{ action('[email protected]', array('foo'), true) }}">My Link</a>
Ярлык метода URL :: asset () - это функция asset (), и, как и все другие ярлыки, он принимает идентичные параметры функции. Вот пример:
<!-- app/views/example.blade.php -->
<img src="{{ asset('img/logo.png') }}" />
Аналогично, ярлык для URL :: secureAsset () - это функция secure_asset (). Это выглядит так:
<!-- app/views/example.blade.php -->
<img src="{{ secure_asset('img/logo.png') }}" />
Предыдущая: Laravel (5.7) Просмотров
Следующая: Laravel (5.7) Сессия
Новый контент: Composer: менеджер зависимостей для PHP , R программирования