Как создать свой атрибут для внедрения зависимостей в Laravel
В статье “Обзор атрибутов Laravel: что и как использовать” осуждали возможность упрощения внедрения зависимостей с помощью атрибутов. Однако ограничиваться только стандартными атрибутами Laravel не обязательно. Можно создать собственный атрибут, который будет выполнять нужную нам задачу.
Пример создания атрибута, который автоматически подтягивает значения из конфигурации, то есть быть похожим на хелпер config()
:
Для начала создадим класс MyConfig
, который реализует интерфейс Illuminate\Contracts\Container\ContextualAttribute
. Это необходимо для того, чтобы контейнер мог с ним работать.
namespace App\Attributes;
use Attribute;
use Illuminate\Contracts\Container\Container;
use Illuminate\Contracts\Container\ContextualAttribute;
#[Attribute(Attribute::TARGET_PARAMETER)]
class MyConfig implements ContextualAttribute
{
public function __construct(
public string $key,
) {}
public static function resolve(self $attribute, Container $container)
{
return $container->make('config')->get($attribute->key);
}
}
Теперь атрибут #[MyConfig]
готов. Используем его, например, для автоматической подстановки имени приложения в контроллере:
namespace App\Http\Controllers;
use App\Attributes\MyConfig;
class ExampleController extends Controller
{
public function __construct(
#[MyConfig('app.name')] protected string $appName
) {}
public function show(): string
{
return "Имя приложения: {$this->appName}";
}
}
Конечно в Laravel уже имеется атрибут Config
, но главное, что этот пример легко адаптировать под другие задачи, такие как подстановка API-ключей, флагов и т.п.
Попробуйте применить подход в своём проекте и поэкспериментировать – скорее всего, вы найдете несколько мест, где такой подход будет полезен.