Любите загадки? Событие еще доступно на сайте.

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

0
Александр Черняев

Я здесь для тебя

Как «Тайный Санта» объединял нас

Новогодние каникулы позади и надеюсь, каждый из вас успел отдохнуть, зарядиться энергией и без проблем вспомнил рабочий пароль 😁 Но перед тем как совсем уйти в трудовые будни, хочется вспомнить одно из самых душевных событий прошлого года.

Вот так выглядит география участников. Ваш регион ещё белый? Тогда присоединяйтесь в следующем году и сделайте его красным как Laravel

Это первое такое событие и я рад, что к нему присоединились почти 30 человек из 20 городов. Отправляя и получая подарки, участники вложили в них не только время, но и частичку себя. Кто-то дарил классные IT-сувениры, игры и неожиданные мелочи, которые точно поднимали настроение.

Несколько строк из отзывов участников:

Большое спасибо моему тайному Санте, который прислушался к пожеланиям, и поднял настроение в преддверии праздников! 🤗 “Совершенный код” Макконнелла – классика, бестселлер, который должен прочесть каждый программист. У меня этот гештальт был не закрыт, несмотря на немалый опыт. Эту книгу как-то обошел стороной. После прочтения наконец вычеркну ее из списка, ведь теперь есть повод 😁 Люблю вещи с историей! Всех с наступающим, пусть код каждого участника отныне будет совершенным 🎄

С таким массажёром шею расслабишь, а вот перестать хвастаться — вряд ли! 😜

Каким-то образом мой тайный Санта узнал что на моем столе все аксессуары из дерева и подарил идеально дополнение!!!
Спасибо дорогой дедушка, без тебя я и не знал что мне это нужно, а оно правда нужно!!! Спасибо тебе и с наступающим!!!!

С такой футболкой будешь ловить не только взгляды, но и офферы! 😎

Возвращаясь немного в прошлое очень часто видел, как люди сами организовывают в своем маленьком кругу такое мероприятие и всегда мечтал поучаствовать. Год за годом это оставалось всего лишь мечтой, которую, казалось, невозможно уже было организовать, но тут появились люди из laravel.su и провели его. По итогу я получил огромное удовольствие. Этот трепет ожидания подарка, особенно с учётом, что ты не знаешь кто и что тебе подарит возродил во мне новогоднее настроение даже в такую погоду. Спасибо всем огромное ❤️

Ох, аппетит уже разыгрался, нужно срочко сделать Ичираку Рамен 🤤

Отличная игра в преддверии нового года 😎 О тайном санте слышал, но ни разу не участвовал и решил поучаствовать. Мега позитивно и классно, а вам огромное спасибо за организацию подобного мероприятия 🍷

Читая такие отзывы, понимаешь, насколько простые вещи могут объединять людей. Спасибо каждому из вас за участие! Подобные события делают нас ближе. Пусть новый год принесёт ещё больше радости и незабываемых моментов! ✨

3
Илья Лящук

Backend, Frontend, Weekend

Отправка логов в Telegram. Модуль для Laravel

Всем привет! В данной записи я хотел бы поделиться с вами модулем, который я разработал для Laravel.

https://github.com/prog-time/tg-logger

Это мой первый опыт в разработке публичных модулей для Laravel, поэтому прошу не судить строго!

Данный модуль позволяет легко и быстро настроить отправку логов и сообщений об ошибках в Telegram сообщество, где под каждый тип события вы можете выбрать отдельный топик. Таким образом вы можете отправлять сообщения о кастомных событиях, исключения и системные ошибки.

Конечно, есть более продвинутые решения для логирования, но они требуют более глубокую настройку. Я же хотел создать модуль, который будет быстро настраиваться и хорошо подойдёт для мелких и средних проектов.

Настройка модуля

Для начала вам нужно создать Telegram бота который будет отвечать за отправку оповещений. После этого создаём группу, включаем в ней «Темы» и добавляем созданного бота в группу (обязательно с правами администратора).

После создания бота, записываем токен бота и id группы в .env файл.

TG_LOGGER_TOKEN="token_bot"
TG_LOGGER_CHAT_ID="id_group"

Устанавливаем модуль через Composer.

composer require prog-time/tg-logger

После установки модуля, вам необходимо создать конфигурационный файл config/tg-logger.php и прописать в нём параметры для работы модуля.

Вы можете создать файл вручную или перенести заготовленную версию конфигурации, которая находится внутри модуля, прописал следующую команду.

php artisan vendor:publish --tag=config

Теперь давайте заполним созданный конфигурационный файл.

return [
    'token' => env('TG_LOGGER_TOKEN'),
    'chat_id' => env('TG_LOGGER_CHAT_ID'),
    'topics' => [
        [
            'name' => 'Debug messages',
            'icon_color' => '9367192',
            'level' => 'debug',
        ],
        [
            'name' => 'Cron tasks',
            'icon_color' => '9367192',
            'level' => 'crone',
        ],
        [
            'name' => 'Errors',
            'icon_color' => '9367192',
            'level' => 'error, notice, warning, emergency',
        ]
    ]
];

Конфигурация tg-logger.php включает в себя следующие параметры:

  • token — токен Telegram бота
  • chat_id — id группы куда мы будет отправлять логи
  • topics — здесь указываем названия тем, типы логов которые будет принимать тема и цвета иконок тем.

После настройки tg-logger.php, вам необходимо запустить команду которая создаст темы в группе.

php artisan tglogger:create-topics

После запуска данной команды, файл tg-logger.php будет перезаписан и в нём будут указаны id тем

На этом настройка модуля закончена, ниже рассмотрим как работать с модулем TgLogger.

Работа с модулем TgLogger

Отлов системных ошибок

Для отлова всех типов ошибок вам необходимо изменить базовый обработчик логов в конфигурационном файле config/logging.php, указав в качестве обработчиков классы модуля.

'channels' => [
    ...
    'telegram' => [
        'driver' => 'monolog',
        'handler' => ProgTime\TgLogger\TgHandler::class,
        'formatter' => ProgTime\TgLogger\TgFormatter::class,
        'level' => 'debug',
    ],
    ...
],

И в .env изменить параметр LOG_CHANNEL

LOG_CHANNEL=telegram

Отправка сообщений через класс TgLogger

Вы также можете отправлять оповещения, напрямую, используя класс TgLogger и статический метод sendLog().

TgLogger::sendLog('Your message', 'level');

Большое спасибо тем кто дочитать данную статью до конца! Буду очень рад если вы поддержите данное решение на GitHub и напишете свой комментарий под данным постом.

3