About bitrix-best-practice-core
bitrix-best-practice-core is a skill for Bitrix/PHP developers that directs them to relevant rule files based on the architectural layer involved. Its guidance spans framework-native practices for controllers, requests, responses, validation, caching, events, and more.
Key features
- 01Selects rule files by task area
- 02Covers command and controller lifecycles
- 03Guides request, response, and routing patterns
- 04Explains validation, errors, and result handling
- 05Covers caching, logging, events, and storage
Use cases
- 01Implement a Bitrix controller action
- 02Handle JSON requests and responses
- 03Choose error and result contracts for services
- 04Select a caching or persistent storage approach
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ bitrix-tools/ best-practice --skill bitrix-best-practice-coreAfter installing, type/bitrix-best-practice-corein Claude Code to confirm it loaded.
Bundled files
References and scripts installed along with SKILL.md.
rules/cache.mdcommand.mdcontroller.mddate-time.mderror.mdevent.mdgeo-ip.mdhttp-client.mdjson.mdjwt.mdloader.mdlogger.mdoption.mdpersistent-storage.mdrequest.mdresponse.mdresult.mdrouting.mdservice-locator.mduri.mduuid-generator.mdvalidation.mdDetails
From the project READMEBitrix Core Best Practice
Скилл помогает понять, какие нужно использовать Bitrix/PHP best practices.
Как использовать
- Определи архитектурный слой, который затрагивает задача.
- Открой только те rule-файлы, которые напрямую относятся к этому слою.
- Сначала следуй более строгим правилам репозитория и ограничениям модуля.
- Предпочитай framework-native паттерны Bitrix вместо собственных абстракций.
Выбор rule-файла
Когда читать command.md
Читай command.md, если задача затрагивает хотя бы одну из этих областей:
Bitrix\Main\Command\CommandInterface,AbstractCommandили создание прикладной команды;run(),execute(),beforeRun()иafterRun()в lifecycle команды;CommandValidationException,CommandExceptionили обработку результата команды;- валидацию входных данных команды или транзакционную границу её выполнения.
Когда читать controller.md
Читай controller.md, если задача затрагивает хотя бы одну из этих областей:
- класс, наследующий
Bitrix\Main\Engine\Controllerили его наследника; - любой
*Action()-метод; - filters, attributes, prefilters и ответы Engine Controller.
Когда читать error.md
Читай error.md, если задача затрагивает хотя бы одну из этих областей:
Bitrix\Main\Error,Bitrix\Main\ErrorCollectionили прикладные error-классы поверх них;getErrors(),getError(),getErrorCollection()илиgetErrorByCode()в service, controller или response flow;- выбор
code,customDataи публичного error-contract для UI, AJAX или другого клиента; - перенос уже созданных ошибок между
Result, controller lifecycle иAjaxJson.
Когда читать result.md
Читай result.md, если задача затрагивает хотя бы одну из этих областей:
Bitrix\Main\Result,isSuccess(),setData(),getData(),addError()илиaddErrors();- возврат
Resultиз service, command, handler или integration layer как outcome-contract; - выбор между
Bitrix\Main\Result, самодельным*Result-классом и неявным массивом как return DTO; - состав payload в
Result::setData()и граница между success-data и error flow.
Когда читать request.md
Читай request.md, если задача затрагивает хотя бы одну из этих областей:
Bitrix\Main\Request,HttpRequest,$this->getRequest()илиContext::getCurrent()->getRequest();- выбор между
get(),getQuery(),getPost(),getHeader(),getCookie()илиgetJsonList(); - замена
$_REQUEST,$_GET,$_POST,$_COOKIEиphp://inputна framework-native request API; - JSON body,
JsonPayload,decodeJson()илиdecodeJsonStrict().
Когда читать response.md
Читай response.md, если задача затрагивает хотя бы одну из этих областей:
Bitrix\Main\Response,HttpResponse,addHeader(),setStatus(),addCookie()илиredirectTo();Bitrix\Main\Engine\Response\Json,AjaxJson,Redirect,File,HtmlContentили render-response helper'ы;- замена ручного
header(),Set-Cookie,setcookie()илиjson_encode()на штатный response layer Bitrix; - выбор типа HTTP-ответа для controller action или другого infrastructure endpoint.
Когда читать routing.md
Читай routing.md, если задача затрагивает хотя бы одну из этих областей:
- файл в
<module>/install/routes/или регистрация маршрутов в/bitrix/routes/и/local/routes/; RoutingConfigurator,prefix,group, HTTP-методы маршрута,where,default,name;PublicPageControllerили перенос legacy URL сurlrewrite.phpна modern routing;- site-guard и маршруты для конкретного сайта в мультисайтовой установке;
- массив
[Controller::class, 'action']в маршруте.
Когда читать loader.md
Читай loader.md, если задача затрагивает хотя бы одну из этих областей:
Loader::includeModule()илиLoader::requireModule();CModule::IncludeModule()илиCModule::IncludeModuleEx();- optional module integration с fallback при отсутствии модуля;
- fail-fast dependency, где отсутствие модуля должно привести к ошибке, а не к тихому пропуску.
Когда читать geo-ip.md
Читай geo-ip.md, если задача затрагивает хотя бы одну из этих областей:
Bitrix\Main\Service\GeoIp\Manager,getRealIp(),getDataResult()или convenience getters вродеgetCountryCode()/getCityName();Bitrix\Main\Web\IpAddressв контексте GeoIP lookup, range cache или различий между IPv4 и IPv6 для geodata;- custom GeoIP handler, наследник
Bitrix\Main\Service\GeoIp\Baseили регистрация черезonMainGeoIpHandlersBuildList; - post-processing GeoIP результата через
onGeoIpGetResult; - выбор между простым string lookup и полным
Result-based GeoIP lookup; - определение геолокации по IP-адресу.
Когда читать uri.md
Читай uri.md, если задача затрагивает хотя бы одну из этих областей:
Bitrix\Main\Web\Uri,new Uri($url),getQuery(),addParams(),deleteParams(),toAbsolute()илиresolveRelativeUri();- разбор, изменение или пересборка URL / URI / redirect URL в Bitrix-коде;
- выбор между
Uri,parse_url()иparse_str()для query string, host, path, fragment или absolute URL; - query-параметры с точками или пробелами, где важен
preserveDots.
Когда читать http-client.md
Читай http-client.md, если задача затрагивает хотя бы одну из этих областей:
Bitrix\Main\Web\HttpClient,new HttpClient(),get(),post(),query()илиdownload();- outbound HTTP(S)-запросы, webhook sender, remote download/upload или external API integration;
- замена
file_get_contents($url)/stream_context_create()для remotehttp/httpsURL; - замена
curl_init,curl_setopt,curl_execи других rawcurl_*вызовов на framework-native transport.
Когда читать json.md
Читай json.md, если задача затрагивает хотя бы одну из этих областей:
Bitrix\\Main\\Web\\Json,Json::encode(),Json::decode()илиJson::validate();- замену прямых
json_encode()/json_decode()или локальных JSON codec-helper-ов; Json::DEFAULT_OPTIONS, encoding flags,ArgumentExceptionпри encode/decode или проверку decoded структуры;- JSON-строку внутри HTML-атрибута или выбор между сериализацией строки и готовым JSON response.
Когда читать jwt.md
Читай jwt.md, если задача затрагивает хотя бы одну из этих областей:
Bitrix\Main\Web\JWT,JWT::encode(),JWT::decode(),JWT::urlsafeB64Encode()илиJWT::urlsafeB64Decode();Bitrix\Main\Web\JWK,JWK::parseKeySet()илиJWK::parseKey();- выпуск, проверка или разбор JWT / JWK / JWKS / JOSE-compatible данных;
- выбор между framework-native JWT/JWK API и ручной сборкой токена, key parsing или Base64 URL-safe helper-ом.
Когда читать date-time.md
Читай date-time.md, если задача затрагивает хотя бы одну из этих областей:
Bitrix\Main\Type\DateилиBitrix\Main\Type\DateTime;createFromUserTime(),tryParse(),toUserTime(),toString(),createFromTimestamp()илиcreateFromPhp();- parsing, formatting или timestamp conversion для даты и времени в Bitrix-коде;
- выбор между Bitrix date types и
\DateTime/\DateTimeImmutable.
Когда читать option.md
Читай option.md, если задача затрагивает хотя бы одну из этих областей:
Bitrix\Main\Config\Option,Option::get(),set(),getRealValue(),getForModule()илиdelete();COption::GetOptionString(),SetOptionString(),GetOptionInt()илиRemoveOption()как legacy trigger;default_option.php, moduleoptions.php, site-specific setting или feature flag / policy в БД;- выбор между постоянной конфигурацией в
Option, deploy-time config в.settings.phpи временным runtime-state.
Когда читать logger.md
Читай logger.md, если задача затрагивает хотя бы одну из этих областей:
Bitrix\Main\Diag\Logger,Bitrix\Main\Diag\LoggerFactory,LoggerRegistry,FileLoggerилиLogFormatter;Psr\Log\LoggerInterface, PSR-3 levels (info,warning,error,debug) и structuredcontext;- регистрацию logger id в
.settings.phpчерез секциюloggersили DI черезconstructorParams; - замену
AddMessage2Log(),Logger::create()или ad hocfile_put_contents()/error_log()на framework-native logging path; - выбор между именованным logger id, default logger fallback и legacy logging boundary.
Когда читать uuid-generator.md
Читай uuid-generator.md, если задача затрагивает хотя бы одну из этих областей:
Bitrix\Main\UuidGeneratorилиUuidGenerator::generateV4();- генерацию UUID v4 для session id, correlation id, upload token, public proxy id или другого random opaque identifier;
- выбор между
UuidGenerator,uniqid(),Random::getBytes(), ручной сборкой UUID или локальным helper-генератором; - legacy boundary, где нужен UUID в обертке вроде
{uuid}, но canonical generator должен остаться единым.
Когда читать validation.md
Читай validation.md, если задача затрагивает хотя бы одну из этих областей:
Bitrix\Main\Validation\Rule\...на параметрах*Action()или свойствах input object;ValidationParameter,ValidationService,ValidationResult,ValidationErrorилиValidationGroup;- автоматическая валидация входа до входа в action или ручная валидация DTO / command в service layer;
- выбор между validation attributes,
ValidationParameterи явнымValidationService::validate(); - custom validators и custom validation attributes поверх
Bitrix\Main\Validation.
Когда читать service-locator.md
Читай service-locator.md, если задача затрагивает хотя бы одну из этих областей:
Bitrix\Main\DI\ServiceLocator,ServiceLocator::getInstance(),get(),has(),addInstance()илиaddInstanceLazy();{module}/.settings.php, service registration, service id, FQCN binding или interface binding для DI;- выбор между action autowiring, explicit
ServiceLocator::get(...)и ручнымnew MyService()для shared service; - замена ad hoc создания service-класса на framework-native container path.
Когда читать persistent-storage.md
Читай persistent-storage.md, если задача затрагивает хотя бы одну из этих областей:
Bitrix\Main\Data\Storage\PersistentStorageInterface,StorageInterface,DeferredStorageDecoratorилиServiceLocator::get(PersistentStorageInterface::class);Bitrix\Main\Config\Option::get()/Option::set()в сценарии, где нужно понять, конфигурация это или временное runtime-state;- TTL state, progress/checkpoint, one-time token, upload/import session, rate-limit counter или другой временный server-side state между запросами;
- выбор между
Option, persistent storage и cache (Bitrix\Main\Data\Cache/ManagedCache) для хранения данных.
Когда читать cache.md
Читай cache.md, если задача затрагивает хотя бы одну из этих областей:
Bitrix\Main\Data\Cache,ManagedCache,TaggedCache,Cache::createInstance(),initCache(),startDataCache(),endDataCache()илиabortDataCache();Application::getInstance()->getCache(),getManagedCache(),getTaggedCache()или container binding cache-сервисов вmain/.settings.php;- выбор между простым TTL-cache, managed invalidation по key/dir и tag-based invalidation;
CPHPCache,CCacheManager,$CACHE_MANAGERилиCStackCacheManagerкак legacy trigger;- derived read-cache, который можно потерять и пересчитать, в отличие от runtime-state и постоянной конфигурации.
Когда читать event.md
Читай event.md, если задача затрагивает хотя бы одну из этих областей:
Bitrix\Main\Event,EventResult,EventManager,send()илиgetResults();- генерацию классов событий и обработчиков через Bitrix CLI;
- создание собственного события, контракт параметров и ответов обработчиков или отмену операции по результатам события;
addEventHandler(),registerEventHandler(), compatible-варианты, порядок вызова и снятие подписок;AddEventHandler()илиRegisterModuleDependences()как legacy trigger и перенос позиционных обработчиков на D7.