Bitrix Best Practice Core
Published by bitrix-tools in best-practice
What this skill does
Use when designing, reviewing, or implementing any PHP code.
Add Bitrix Best Practice Core to your agent
Review the source and files first. When you are ready, copy the prompt instruction or use the CLI command supported by your environment.
Install with a prompt
Paste this into a compatible coding agent:
add this skill "bitrix-best-practice-core" from https://github.com/bitrix-tools/best-practiceInstall with the CLI
Run this command in a controlled environment after reviewing the repository:
npx skills add https://github.com/bitrix-tools/best-practice --skill bitrix-best-practice-coreSkill instructions
Bitrix Core Best Practice
Скилл помогает понять, какие нужно использовать Bitrix/PHP best practices.
Как использовать
- Определи архитектурный слой, который затрагивает задача.
- Открой только те rule-файлы, которые напрямую относятся к этому слою.
- Сначала следуй более строгим правилам репозитория и ограничениям модуля.
- Предпочитай framework-native паттерны Bitrix вместо собственных абстракций.
Выбор rule-файла
<!-- rules-dictionary:start -->Когда читать rules/controller.md
Читай rules/controller.md, если задача затрагивает хотя бы одну из этих областей:
- класс, наследующий
Bitrix\Main\Engine\Controllerили его наследника; - любой
*Action()-метод; - filters, attributes, prefilters и ответы Engine Controller.
Когда читать rules/error.md
Читай rules/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.
Когда читать rules/result.md
Читай rules/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.
Когда читать rules/request.md
Читай rules/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().
Когда читать rules/response.md
Читай rules/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.
Когда читать rules/routing.md
Читай rules/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']в маршруте.
Когда читать rules/loader.md
Читай rules/loader.md, если задача затрагивает хотя бы одну из этих областей:
Loader::includeModule()илиLoader::requireModule();CModule::IncludeModule()илиCModule::IncludeModuleEx();- optional module integration с fallback при отсутствии модуля;
- fail-fast dependency, где отсутствие модуля должно привести к ошибке, а не к тихому пропуску.
Когда читать rules/geo-ip.md
Читай rules/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. - определение геолокации
Когда читать rules/uri.md
Читай rules/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.
Когда читать rules/http-client.md
Читай rules/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.
Когда читать rules/jwt.md
Читай rules/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-ом.
Когда читать rules/date-time.md
Читай rules/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.
Когда читать rules/option.md
Читай rules/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.
Когда читать rules/logger.md
Читай rules/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.
Когда читать rules/uuid-generator.md
Читай rules/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 должен остаться единым.
Когда читать rules/validation.md
Читай rules/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.
Когда читать rules/service-locator.md
Читай rules/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.
Когда читать rules/persistent-storage.md
Читай rules/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) для хранения данных.
Когда читать rules/cache.md
Читай rules/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 и постоянной конфигурации.
Files included
- rules/cache.md
- rules/controller.md
- rules/date-time.md
- rules/error.md
- rules/geo-ip.md
- rules/http-client.md
- rules/jwt.md
- rules/loader.md
- rules/logger.md
- rules/option.md
- rules/persistent-storage.md
- rules/request.md
- rules/response.md
- rules/result.md
- rules/routing.md
- rules/service-locator.md
- rules/uri.md
- rules/uuid-generator.md
- rules/validation.md
- SKILL.md

