{"id":18513775,"url":"https://github.com/proklung/framework-tools-bundle","last_synced_at":"2026-04-18T02:32:13.968Z","repository":{"id":57045122,"uuid":"365442839","full_name":"ProklUng/framework-tools-bundle","owner":"ProklUng","description":"Различные дополнительные инструменты для кастомных вариантов Symfony","archived":false,"fork":false,"pushed_at":"2021-08-24T14:29:10.000Z","size":114,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-12-25T21:24:23.737Z","etag":null,"topics":["bitrix","bitrix-symfony","php7","symfony-bundle","wordpress","wordpress-symfony"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ProklUng.png","metadata":{"files":{"readme":"readme.MD","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-05-08T06:57:48.000Z","updated_at":"2021-08-24T14:28:51.000Z","dependencies_parsed_at":"2022-08-24T04:11:20.751Z","dependency_job_id":null,"html_url":"https://github.com/ProklUng/framework-tools-bundle","commit_stats":null,"previous_names":[],"tags_count":43,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ProklUng%2Fframework-tools-bundle","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ProklUng%2Fframework-tools-bundle/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ProklUng%2Fframework-tools-bundle/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ProklUng%2Fframework-tools-bundle/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ProklUng","download_url":"https://codeload.github.com/ProklUng/framework-tools-bundle/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239230948,"owners_count":19603987,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bitrix","bitrix-symfony","php7","symfony-bundle","wordpress","wordpress-symfony"],"created_at":"2024-11-06T15:40:34.899Z","updated_at":"2026-04-18T02:32:13.939Z","avatar_url":"https://github.com/ProklUng.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Различные дополнительные инструменты для кастомных вариантов Symfony\n\n## Установка\n\n1) composer.json:\n\n```json\n  \"repositories\": [\n    {\n      \"type\": \"git\",\n      \"url\": \"https://github.com/proklung/framework-tools-bundle\"\n    }\n  ]\n```\n\n2) `composer require proklung/framework-tools-bundle`\n\n## Детали\n\n### Delayed event dispatcher\n\n[Основа](https://github.com/olvlvl/delayed-event-dispatcher/blob/master/README.md)\n\nИз особо интересного: \"Flushing delayed events with a custom flusher\".\n\nЕсли запускается из под Битрикс, то подвязывается слушатель на событие `OnEpilog`.\n\nЕсли запускается из под Wordpress, то подвязывается слушатель на хук `shutdown`.\n\n### Command runner\n\nФорк [пакета](https://github.com/Fichtme/symfony-command-runner). Запуск команд пакетом в разных процессах.\n\n#### Пример использования\n\n```php\n(new CommandRunner([\n            new Process(\"my:command -q\"),\n            new Process(\"my:command2 -q\"),\n            new Process(\"my:command3 -q\").\n            new Process(\"my:command4 -q\"),\n            new Process(\"my:command5 -q\"),\n            new Process(\"my:command6 -q --env=$env\"),\n        ]))\n            -\u003econtinueOnError(true)\n            -\u003esetIO($this-\u003eio)\n            -\u003esetLimit(3)\n            -\u003erun();\n            \n```\n\nКак-то так:\n\n```php\nclass ExampleRunner extends Command\n{\n    /** @var SymfonyStyle */\n    protected $io;\n\n    /**\n     * @inheritDoc\n     */\n    protected function configure()\n    {\n        $this-\u003esetName('runner:example')\n             -\u003esetDescription('runner example');\n    }\n\n    /**\n     * @inheritDoc\n     */\n    protected function execute(InputInterface $input, OutputInterface $output): int\n    {\n        $this-\u003eio = new SymfonyStyle($input, $output);\n\n        $this-\u003eio-\u003ewriteln('Running runner example');\n\n        sleep(5); # Sleep so user can abort update\n\n        (new CommandRunner([\n            new Process(['cache:clear', 'cache:clear --cache-type menu']),\n        ]))\n            -\u003econtinueOnError(true)\n            -\u003esetIO($this-\u003eio)\n            -\u003esetLimit(3)\n            -\u003erun();\n\n        return 0;\n    }\n}\n```\n\n### Lockable консольные команды\n\nКоманды, запускающиеся одновременно только в одном экземпляре.\n\n```php\nuse Prokl\\FrameworkExtensionBundle\\Services\\Command\\Lockable\\AbstractLockableCommand;\n\nclass SomeCommand extends AbstractLockableCommand\n{\n   protected function configure()\n   {\n       $this-\u003esetName('lock:command')\n            -\u003esetDescription('Lock command')\n    \n       ;\n    \n       parent::configure();\n   }\n\n   protected function execute(InputInterface $input, OutputInterface $output) : int\n   {\n        $output-\u003ewriteln('Start');\n        sleep(100);\n        $output-\u003ewriteln('End');\n\n        return 0;\n   }\n}\n```\n\nМожно отнаследовать метод `getLockTtl()`, чтобы переопределить время блокировки (по умолчанию - 60 секунд).\n\nЗависимости такого сорта команд подцепляются через сеттеры посредством механизма autowiring.\n\n### Консольные команды\n\n#### Очистка кэша (Битрикс и Wordpress)\n\n```bash\nphp bin/console cache:clear \n```\n\n### Простой битриксовый PSR-16 кэш\n\n```yaml\n  bitrix.simple.cacher.configured:\n    class: Prokl\\FrameworkExtensionBundle\\Services\\Bitrix\\Psr16Cache\\BitrixCacher\n    arguments: ['@Bitrix\\Main\\Data\\Cache']\n    calls:\n      - setBaseDir: ['/guzzle_request']\n      - setTtl: [3600]\n```\n\nМетоды:\n\n- **get**\n- **getMultiple**\n- **has**\n- **delete**\n- **deleteMultiple**\n- **clear**\n- **setMultiple**\n- **set** - `set($key, $value, $ttl = null)`\n- **getOrSet** - `getOrSet(string $key, callable $callable, $ttl = null)`\n\n### Кастомные валидаторы для Symfony Validator\n\n- **Email** - при помощи `Egulias\\EmailValidator`\n- **Phone** - при помощи `giggsey/libphonenumber-for-php`\n\n### Вспомогательное для контроллеров\n\n- `BinaryFileResponseTrait` - метод `returnFile(string $file)` отдаст в браузер BinaryFileResponse файл $file,\nавтоматом определив contentType.\n\n### Отправка информации о фатальных ошибках через Symfony Notifier для Wordpress\n\n- Должна быть определена переменная среды `ADMIN_EMAIL`\n- Должен быть установлен пакет `symfony/notifier` и [бандл](https://github.com/ProklUng/core.framework.extension.bundle).\nЕсли нет, то соответствующие сервисы удаляются из контейнера при компиляции.\n- В корневом проекте должен быть класс-сервис, реализующий `Prokl\\FrameworkExtensionBundle\\Services\\Wordpress\\ErrorHandler\\Contract\\ErrorDbOperatorInterface`\n для работы с записями в БД (в моем случае сохраняется md5 от сериализованного исключения).\n \n - `save` - сохранить сведения об ошибке в базу (или куда там еще).\n - `has` -  есть ли запись об этой ошибке в базе или нет.\n - `clearTable` - очистить таблицу с данными об ошибках.\n \n- По умолчанию сообщения засылаются в каналы, отмеченные как `urgent`.\n\n- Декорированный логгер.\n\nКонфиг основного проекта:\n\n```yaml\n  logger_notify_decorated:\n    class: Prokl\\FrameworkExtensionBundle\\Services\\Wordpress\\Notifier\\LoggerDecorator\n    decorates: 'logger'\n    arguments: ['@.inner', '@wp_notificator']\n```\n\n### Логгирование SQL запросов для Wordpress посредством Monolog\n\nСервис `sql.logger.monolog`. Если в контейнере нет сервисов `wpdb` (экземпляр wpdb) и `logger` - логгер удаляется.\n\nВ `wp-config.php`:\n\n```php\ndefine('SAVEQUERIES', true);\n```\n\nНо я сделал так (`SAVEQUERIES` в `.env` =\u003e 0 или 1):\n\n```php\ndefine('SAVEQUERIES', (bool)$_ENV['SAVEQUERIES'] ?? false);\n```\n\nГде-нибудь:\n\n```php\n$sql = container()-\u003eget('sql.logger.monolog');\n$sql-\u003einit();\n```\n\nЛог запросов упадет в обычный лог Монолога.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fproklung%2Fframework-tools-bundle","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fproklung%2Fframework-tools-bundle","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fproklung%2Fframework-tools-bundle/lists"}