Функция resolve
Функция resolve предназначена для получения экземпляра класса или значения из сервис-контейнера Laravel. Она принимает строковый идентификатор класса или интерфейса, а также опциональный массив параметров для конструктора. Функция автоматически разрешает все зависимости и возвращает готовый экземпляр.
Если переданная строка не зарегистрирована в контейнере, функция попытается создать экземпляр класса через рефлексию, автоматически внедряя зависимости. Это делает resolve мощным инструментом для работы с инверсией управления.
Синтаксис
<?php
resolve($abstract, $parameters = []);
?>
Пример
Рассмотрим простой пример использования функции для получения экземпляра класса:
<?php
use App\Models\User;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function show()
{
$user = resolve(User::class);
$res = get_class($user);
echo $res;
}
}
?>
Результат выполнения кода:
"App\Models\User"
Пример
Функция resolve может принимать массив параметров для конструктора. Рассмотрим пример с пользовательским классом:
<?php
namespace App\Services;
class UserService
{
protected $name;
protected $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
public function getInfo()
{
return "Name: {$this->name}, Age: {$this->age}";
}
}
?>
<?php
use App\Services\UserService;
class UserController extends Controller
{
public function show()
{
$service = resolve(UserService::class, ['name' => 'John', 'age' => 25]);
$res = $service->getInfo();
echo $res;
}
}
?>
Результат выполнения кода:
"Name: John, Age: 25"
Пример
Функция resolve также умеет разрешать интерфейсы, если в контейнере зарегистрирована соответствующая реализация. Рассмотрим пример:
<?php
namespace App\Contracts;
interface LoggerInterface
{
public function log($message);
}
?>
<?php
namespace App\Services;
use App\Contracts\LoggerInterface;
class FileLogger implements LoggerInterface
{
public function log($message)
{
return "Logging to file: " . $message;
}
}
?>
<?php
namespace App\Providers;
use App\Contracts\LoggerInterface;
use App\Services\FileLogger;
class AppServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->bind(LoggerInterface::class, FileLogger::class);
}
}
?>
<?php
use App\Contracts\LoggerInterface;
class UserController extends Controller
{
public function show()
{
$logger = resolve(LoggerInterface::class);
$res = $logger->log('User logged in');
echo $res;
}
}
?>
Результат выполнения кода:
"Logging to file: User logged in"