• Время чтения ~1 мин
  • 28.01.2025

В статье “Обзор атрибутов 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-ключей, флагов и т.п. Попробуйте применить подход в своём проекте и поэкспериментировать – скорее всего, вы найдете несколько мест, где такой подход будет полезен.

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Об авторе CrazyBoy49z
WORK EXPERIENCE
Контакты
Ukraine, Lutsk
+380979856297

Мы сбиваем «шахеды» каждый день. Каждое сбитие — спасённые жизни. Нам нужна мобильность: бус или прицеп. Каждый донат = ещё одна ночь под защитой.

🚐 Сбор на микроавтобус для моего экипажа, полк 1020 🎯 Цель: 500 000 ₴
🔗 Ссылка на банку 💳 4441 1111 2546 4663