{"id":18513732,"url":"https://github.com/proklung/wp.core.symfony","last_synced_at":"2026-05-07T13:37:14.770Z","repository":{"id":57045139,"uuid":"368416327","full_name":"ProklUng/wp.core.symfony","owner":"ProklUng","description":"Symfony для Wordpress","archived":false,"fork":false,"pushed_at":"2022-11-22T06:24:58.000Z","size":107,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-07-02T09:47:53.658Z","etag":null,"topics":["php7","symfony","symfony-wordpress","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":null,"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":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-05-18T05:54:28.000Z","updated_at":"2022-11-26T18:10:29.000Z","dependencies_parsed_at":"2022-08-24T04:11:23.987Z","dependency_job_id":null,"html_url":"https://github.com/ProklUng/wp.core.symfony","commit_stats":null,"previous_names":[],"tags_count":53,"template":false,"template_full_name":null,"purl":"pkg:github/ProklUng/wp.core.symfony","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ProklUng%2Fwp.core.symfony","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ProklUng%2Fwp.core.symfony/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ProklUng%2Fwp.core.symfony/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ProklUng%2Fwp.core.symfony/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ProklUng","download_url":"https://codeload.github.com/ProklUng/wp.core.symfony/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ProklUng%2Fwp.core.symfony/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266552692,"owners_count":23947183,"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","status":"online","status_checked_at":"2025-07-22T02:00:09.085Z","response_time":66,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["php7","symfony","symfony-wordpress","wordpress","wordpress-symfony"],"created_at":"2024-11-06T15:40:26.006Z","updated_at":"2026-05-07T13:37:14.741Z","avatar_url":"https://github.com/ProklUng.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Базовый функционал для внедрения Symfony в Wordpress\n\n## Установка\n\ncomposer.json:\n\n```json\n    \"repositories\": [\n        {\n            \"type\": \"git\",\n            \"url\": \"https://github.com/proklung/wp.core.symfony\"\n        }\n    ]\n```\n\n```bash\ncomposer require proklung/wp-core-symfony\n```\n\n## Инициализация\n\nВ `wp-config.php`:\n\n```php\nuse Prokl\\ServiceProvider\\LoadEnvironment;\n\n/** Загрузить окружение. Параметр конструктора - путь к .env файлам */\n$environment = new LoadEnvironment($_SERVER['DOCUMENT_ROOT']);\n$environment-\u003eload();\n\n$environment-\u003eprocess();\n```\n\nВ `functions.php` темы:\n\n```php\nuse Prokl\\ServiceProvider\\ServiceProvider;\n\n$serviceProvider = new ServiceProvider(\n    'app/symfony/services.yaml',\n    $_ENV['APP_ENV'],\n    (bool)$_ENV['APP_DEBUG'],\n    '/config/bundles.php'\n);\n```\n\nДля обеспечения \"преемственности\" (похожести) с оригиналом можно задать путь к файлу конфигурации\n (скажем, `bundles.php`) бандлов четвертым (необязательным) параметром конструктора.\n\n#### Значимые переменные окружения\n\n- `APP_ENV` - код окружения (dev, prod, test и т.д.)\n- `APP_DEBUG` - режим отладки\n\n## Конфигурирование\n\n1) Опция `compile.container` в подтягиваемом конфиге - компилировать ли контейнер в файл. Если не задана, то \"нет, не компилировать\".\nИмеет смысл для окружения, не равного \"dev\". Т.е. опция управляет дампированием контейнера на проде.\n\nМесто, где хранятся дампы контейнеров: `\u003cзначение переменной контейнера kernel.cache_dir\u003e/symfony-app/containers` \n\n#### Пути к кэшу и логам\n\nОпределяются классом `AppKernel`. По умолчанию:\n\n- путь к кэшу (`kernel.cache_dir`) - `/wp-content/cache`\n- путь к логам (`kernel.logs_dir`) - `'/../../logs'` (два уровня выше DOCUMENT_ROOT - особенности используемой\nсборки Битрикс)\n\nЧтобы это изменить нужно отнаследоваться от класса `AppKernel` и переопределить несколько переменных:\n\n```php\nuse Prokl\\ServiceProvider\\Services\\AppKernel;\n\nclass MyKernel extends AppKernel\n{\n   protected $cacheDir = '/bitrix/cache/mycache';\n    \n   protected $logDir = '/logs-saver';\n}\n```\n(второй вариант - отнаследоваться от `AppKernel` и переопределить методы `getCacheDir` и `getLogDir`).\n\nИзменить через наследование класс ядра:\n\n```php\nclass MyServiceProvider extends ServiceProvider\n{\n    protected $kernelServiceClass = MyKernel::class;\n    \n    protected $cacheDir = '/wp-content/my-cache';\n\n}\n```\n\nВторой вариант - отнаследоваться от `ServiceProvider` и заменить метод `getPathCacheDirectory` своей логикой.\n\n## Поддержка бандлов\n\nФайл конфигурации - `/config/standalone_bundles.php`. Этот путь можно изменить через конструктор.\n\nПапка, где лежат конфигурации - `/config`. Конфигурации бандлов - `/config/packages`.\n\n#### Проблема с приватными сервисами\n\nСогласно концепции Symfony все сервисы (в идеале) должны быть приватными и инжектиться. Но в кастомном случае \nчасто нужно получать их через хелпер-сервис-локатор. Для превращения нужных сервисов в публичные предлагается\nтакое решение. В общем разделе параметров контейнера появилась опция `publicable_services`:\n\n```yaml\nparameters:\n  publicable_services:\n    - 'snc_redis.default'\n```\n\nПосле компиляции контейнера приватный сервис `snc_redis.default` станет публичным. \n\n## Сепаратные микро-контейнеры\n\nОтдельные контейнеры - со своим конфигом, полностью изолированные (для модулей, плагинов и т.п.).\n\n```php\nuse Symfony\\Component\\DependencyInjection\\ContainerBuilder;\nuse Prokl\\ServiceProvider\\Micro\\AbstractStandaloneServiceProvider;\nuse Prokl\\ServiceProvider\\Micro\\ExampleAppKernel;\n\nclass ExampleMicroServiceProvider extends AbstractStandaloneServiceProvider\n{\n    /**\n     * @var ContainerBuilder $containerBuilder Контейнер.\n     */\n    protected static $containerBuilder;\n\n    /**\n     * @var string $pathBundlesConfig Путь к конфигурации бандлов.\n     */\n    protected $pathBundlesConfig = '/src/Micro/example.config/standalone_bundles.php';\n\n    /**\n     * @var string $configDir Папка, где лежат конфиги.\n     */\n    protected $configDir = '/src/Micro/example.config/example.config/example.yaml';\n    \n     /**\n     * @var string $kernelServiceClass Класс, реализующий сервис kernel.\n     * Нужен для того, чтобы экземпляры контейнеров в kernel сервисе не перемешивались.\n     */\n    protected $kernelServiceClass = ExampleAppKernel::class;\n\n}\n```\n\nПример класса `ExampleAppKernel`:\n\n```php\n/**\n * Class ExampleAppKernel\n * @package Prokl\\ServiceProvider\\Micro\n */\nuse Prokl\\ServiceProvider\\Micro\\AbstractKernel;\n\nclass ExampleAppKernel extends AbstractKernel\n{\n    protected static $kernelContainer;\n}\n```\n\nГде надо - инициализация:\n\n```php\n$micro = new ExampleMicroServiceProvider(\n    'src/SymfonyDI/Micro/example.config/example.yaml',\n    $_ENV['APP_ENV'],\n    (bool)$_ENV['APP_DEBUG']\n);\n```\n\nХэлпер `container` заточен под работу с микро-сервис-провайдерами:\n\n```php\nvar_dump(container($micro)-\u003egetParameter('example'));\n```\n\n## Автозапуск сервисов\n\nЧтобы сервис запустился автоматически после инициализации контейнера, он должен быть помечен тэгом `service.bootstrap`.\n\n```yaml\n  app.options:\n    class: Local\\Services\\AppOptions\n    arguments: ['%kernel.environment%', '@parameter_bag']\n    tags: ['service.bootstrap']\n```\n\nПоддерживается приоритет запуска. Тогда надо так:\n\n```yaml\n  app.options:\n    class: Local\\Services\\AppOptions\n    arguments: ['%kernel.environment%', '@parameter_bag']\n    tags: \n      - { name: 'service.bootstrap', priority: 100 }\n```\n\nСервис с приоритетом 100 запустится раньше сервиса с приоритетом 200.\n\n## Автоматическая подвязка на хуки Wordpress\n\nТэг: `custom.events.init`.\n\n1) `type` - add_action, add_filter \u0026 etc По умолчанию: `add_action`.\n2) `event` - название хука.\n3) `method` - метод-обработчик в сервисе\n4) `priority` - приоритет\n\n```yaml\nLocal\\Events\\CometCacheClearMemcachedEvent:\n    tags:\n      - { name: 'custom.events.init', event: 'post_class', method: 'handler', type: 'add_filter',  priority: 100 }\n```\n\n## Автоматическая регистрация типов постов\n\nТэг: `post.type`.\n\nРеализует интерфейс `PostTypeDataInterface` с двумя методами:\n\n- `getNameTypePost` - название типа поста\n- `getRegistrationData` - массив с традиционными для объявления типа поста данными. Типа такого:\n\n```php\nreturn [\n            'labels' =\u003e [\n                'name' =\u003e __('Instagram'),\n                'singular_name' =\u003e __('Instagram'),\n            ],\n\n            'public' =\u003e true,\n            'publicly_queryable' =\u003e true,\n            'show_ui' =\u003e true,\n            'show_in_menu' =\u003e true,\n            'query_var' =\u003e true,\n            'rewrite' =\u003e 'instagram',\n            'capability_type' =\u003e 'post',\n            'has_archive' =\u003e 'instagram',\n            'hierarchical' =\u003e false,\n            'menu_position' =\u003e null,\n            'supports' =\u003e ['title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments'],\n        ];\n```\n\n```yaml\nLocal\\PostTypes\\InstagramPostType:\n    tags:\n      - { name: 'post.type' }\n```\n## Сервисы по умолчанию\n\nАвтоматом регистрируются несколько сервисов:\n\n- `service_container` (и alias) - сервис-контейнер целиком\n- `app.request` - конвертор глобалов в Request\n- `custom.post.type.registrator` - регистратор кастомных типов постов в Wordpress\n- синонимы сервиса `kernel`.\n- `delegated_container_manipulator` - манипулятор делегированными контейнерами.\n \n\n## Хэлперы\n\n1) `container()` - отдает экземпляр контейнера (выступает в роли сервис-локатора):\n\n```php\n$kernel = container()-\u003eget('kernel');\n```\n\n2) `delegatedContainer()` - отдает экземпляр манипулятора (реализующего интерфейс `Symfony\\Component\\DependencyInjection\\ContainerInterface`) \nделегированными контейнерами.\n\n```php\n$moduleService = delegatedContainer()-\u003eget('my_module_id.service');\n```\n\nДелегированный контейнер - автономный контейнер, сформированные в модуле, плагине и тому подобных местах.\n\nВ контейнере он помечается тэгом `delegated.container` (их может быть сколь угодно много):\n\n```yaml\n  module_notifier_container:\n    class: Symfony\\Component\\DependencyInjection\\ContainerInterface\n    factory: ['Proklung\\Notifier\\DI\\Services', 'getInstance']\n    tags:\n      - { name: 'delegated.container' }\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fproklung%2Fwp.core.symfony","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fproklung%2Fwp.core.symfony","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fproklung%2Fwp.core.symfony/lists"}