Функция action
Функция action используется для получения URL-адреса, указывающего на конкретный метод контроллера. Первым параметром передаётся имя контроллера и метода в формате строки или массив вида [Controller::class, 'method']. Вторым необязательным параметром передаются параметры маршрута в виде массива. Функция возвращает строку с полным URL-путем к экшену контроллера, что особенно удобно при формировании ссылок в шаблонах и редиректов.
Синтаксис
Функция action доступна как в PHP-коде, так и в Blade-шаблонах:
<?php
action($controllerMethod, $parameters = []);
?>
Пример
Создадим простой контроллер для работы с пользователями и сгенерируем URL-адрес для его экшена:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function index()
{
$users = ['user1', 'user2', 'user3'];
return view('users', ['users' => $users]);
}
public function show($id)
{
return view('user', ['id' => $id]);
}
}
?>
В маршрутах зарегистрируем контроллер:
<?php
use App\Http\Controllers\UserController;
use Illuminate\Support\Facades\Route;
Route::get('/users', [UserController::class, 'index'])->name('users.index');
Route::get('/users/{id}', [UserController::class, 'show'])->name('users.show');
?>
Теперь сгенерируем URL для экшена контроллера:
<?php
$url = action([UserController::class, 'index']);
echo $url;
?>
Результат выполнения кода:
"http://localhost/users"
Пример
Сгенерируем URL для экшена контроллера с параметрами. Передадим идентификатор пользователя:
<?php
$url = action([UserController::class, 'show'], ['id' => 5]);
echo $url;
?>
Результат выполнения кода:
"http://localhost/users/5"
Пример
Использование функции action со строковым форматом. В качестве параметра можно передать строку вида "Controller@method":
<?php
$url = action('App\Http\Controllers\UserController@show', ['id' => 10]);
echo $url;
?>
Результат выполнения кода:
"http://localhost/users/10"
Пример
Генерация URL в Blade-шаблоне с помощью функции action:
<html>
<body>
<h1>Users List</h1>
@foreach ($users as $user)
<p>
<a href="{{ action([App\Http\Controllers\UserController::class, 'show'], ['id' => $loop->index + 1]) }}">
View user {{ $user }}
</a>
</p>
@endforeach
</body>
</html>
При рендеринге шаблона будут сгенерированы следующие ссылки:
<html>
<body>
<h1>Users List</h1>
<p><a href="http://localhost/users/1">View user user1</a></p>
<p><a href="http://localhost/users/2">View user user2</a></p>
<p><a href="http://localhost/users/3">View user user3</a></p>
</body>
</html>
Пример
Использование функции action в контроллере для выполнения редиректа:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Redirect;
class UserController extends Controller
{
public function store(Request $request)
{
// логика сохранения пользователя
$userId = 42;
return Redirect::to(action([UserController::class, 'show'], ['id' => $userId]));
}
}
?>
Пример
Генерация URL для экшена контроллера с несколькими параметрами:
<?php
use App\Http\Controllers\PostController;
use Illuminate\Support\Facades\Route;
Route::get('/posts/{category}/{slug}', [PostController::class, 'show'])->name('posts.show');
?>
Теперь передадим параметры в функцию action:
<?php
$url = action([PostController::class, 'show'], ['category' => 'news', 'slug' => 'laravel-article']);
echo $url;
?>
Результат выполнения кода:
"http://localhost/posts/news/laravel-article"
Пример
Демонстрация работы функции action с относительными URL-адресами. Если не указан полный базовый URL, функция вернёт относительный путь:
<?php
$relativeUrl = action([UserController::class, 'show'], ['id' => 7]);
echo $relativeUrl;
?>
Результат выполнения кода (без учёта протокола и хоста):
"/users/7"