Функция app
Функция app предназначена для доступа к контейнеру сервисов
Laravel. Она может использоваться без аргументов, возвращая
глобальный экземпляр контейнера, или с переданным именем класса
или интерфейса, чтобы разрешить соответствующую зависимость.
Данная функция является удобной альтернативой использованию
фасада App или внедрению зависимостей через конструктор.
Синтаксис
<?php
app($abstract = null, $parameters = []);
?>
Пример
Давайте получим экземпляр контейнера и выведем информацию о нём:
<?php
$container = app();
echo get_class($container);
?>
Результат выполнения кода:
"Illuminate\Foundation\Application"
Пример
Давайте разрешим реализацию интерфейса Illuminate\Contracts\Routing\ResponseFactory
и создадим JSON-ответ:
<?php
use Illuminate\Contracts\Routing\ResponseFactory;
$response = app(ResponseFactory::class);
$json = $response->json(['status' => 'success']);
echo $json->getContent();
?>
Результат выполнения кода:
"{\"status\":\"success\"}"
Пример
Давайте разрешим класс с передачей параметров в конструктор. Создадим простой класс для хранения данных пользователя:
<?php
namespace App\Services;
class UserService
{
protected $name;
protected $role;
public function __construct($name, $role = 'user')
{
$this->name = $name;
$this->role = $role;
}
public function getInfo()
{
return $this->name . ' (' . $this->role . ')';
}
}
?>
Теперь разрешим класс с передачей параметров:
<?php
use App\Services\UserService;
$user = app(UserService::class, ['name' => 'John', 'role' => 'admin']);
echo $user->getInfo();
?>
Результат выполнения кода:
"John (admin)"
Пример
Давайте получим доступ к сервису через псевдоним в контейнере.
В файле конфигурации config/app.php можно зарегистрировать
псевдонимы для классов. Например, разрешим класс через строковый
псевдоним:
<?php
// Получение экземпляра класса через псевдоним
$cache = app('cache');
echo get_class($cache);
?>
Результат выполнения кода:
"Illuminate\Cache\CacheManager"