bitrix-best-practice-core
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseBitrix Core Best Practice
Bitrix核心最佳实践
Скилл помогает понять, какие нужно использовать Bitrix/PHP best practices.
本技能可帮助你了解应采用哪些Bitrix/PHP最佳实践。
Как использовать
使用方法
- Определи архитектурный слой, который затрагивает задача.
- Открой только те rule-файлы, которые напрямую относятся к этому слою.
- Сначала следуй более строгим правилам репозитория и ограничениям модуля.
- Предпочитай framework-native паттерны Bitrix вместо собственных абстракций.
- 确定任务涉及的架构层。
- 仅打开与该架构层直接相关的规则文件(rule-файлы)。
- 优先遵循仓库的更严格规则和模块限制。
- 优先使用Bitrix原生框架模式,而非自定义抽象。
Выбор rule-файла
规则文件选择
<!-- rules-dictionary:start -->
<!-- rules-dictionary:start -->
Когда читать rules/controller.md
rules/controller.md何时阅读 rules/controller.md
rules/controller.mdЧитай , если задача затрагивает хотя бы одну из этих областей:
rules/controller.md- класс, наследующий или его наследника;
Bitrix\Main\Engine\Controller - любой -метод;
*Action() - filters, attributes, prefilters и ответы Engine Controller.
若任务涉及以下任一领域,请阅读:
rules/controller.md- 继承自或其子类的类;
Bitrix\Main\Engine\Controller - 任意方法;
*Action() - Engine Controller的过滤器(filters)、属性(attributes)、预过滤器(prefilters)及响应。
Когда читать rules/error.md
rules/error.md何时阅读 rules/error.md
rules/error.mdЧитай , если задача затрагивает хотя бы одну из этих областей:
rules/error.md- ,
Bitrix\Main\Errorили прикладные error-классы поверх них;Bitrix\Main\ErrorCollection - ,
getErrors(),getError()илиgetErrorCollection()в service, controller или response flow;getErrorByCode() - выбор ,
codeи публичного error-contract для UI, AJAX или другого клиента;customData - перенос уже созданных ошибок между , controller lifecycle и
Result.AjaxJson
若任务涉及以下任一领域,请阅读:
rules/error.md- 、
Bitrix\Main\Error或基于它们的业务错误类;Bitrix\Main\ErrorCollection - service、controller或响应流程中的、
getErrors()、getError()或getErrorCollection()方法;getErrorByCode() - 为UI、AJAX或其他客户端选择、
code及公开错误契约;customData - 在、controller生命周期与
Result之间传递已创建的错误。AjaxJson
Когда читать rules/result.md
rules/result.md何时阅读 rules/result.md
rules/result.mdЧитай , если задача затрагивает хотя бы одну из этих областей:
rules/result.md- ,
Bitrix\Main\Result,isSuccess(),setData(),getData()илиaddError();addErrors() - возврат из service, command, handler или integration layer как outcome-contract;
Result - выбор между , самодельным
Bitrix\Main\Result-классом и неявным массивом как return DTO;*Result - состав payload в и граница между success-data и error flow.
Result::setData()
若任务涉及以下任一领域,请阅读:
rules/result.md- 、
Bitrix\Main\Result、isSuccess()、setData()、getData()或addError();addErrors() - 从service、command、handler或集成层返回作为结果契约;
Result - 在、自定义
Bitrix\Main\Result类与隐式数组之间选择返回DTO;*Result - 中的负载构成,以及成功数据与错误流程的边界。
Result::setData()
Когда читать rules/request.md
rules/request.md何时阅读 rules/request.md
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на framework-native request API;php://input - JSON body, ,
JsonPayloadилиdecodeJson().decodeJsonStrict()
若任务涉及以下任一领域,请阅读:
rules/request.md- 、
Bitrix\Main\Request、HttpRequest或$this->getRequest();Context::getCurrent()->getRequest() - 在、
get()、getQuery()、getPost()、getHeader()或getCookie()之间选择使用;getJsonList() - 使用框架原生request API替代、
$_REQUEST、$_GET、$_POST及$_COOKIE;php://input - JSON请求体、、
JsonPayload或decodeJson()。decodeJsonStrict()
Когда читать rules/response.md
rules/response.md何时阅读 rules/response.md
rules/response.mdЧитай , если задача затрагивает хотя бы одну из этих областей:
rules/response.md- ,
Bitrix\Main\Response,HttpResponse,addHeader(),setStatus()илиaddCookie();redirectTo() - ,
Bitrix\Main\Engine\Response\Json,AjaxJson,Redirect,Fileили render-response helper'ы;HtmlContent - замена ручного ,
header(),Set-Cookieилиsetcookie()на штатный response layer Bitrix;json_encode() - выбор типа HTTP-ответа для controller action или другого infrastructure endpoint.
若任务涉及以下任一领域,请阅读:
rules/response.md- 、
Bitrix\Main\Response、HttpResponse、addHeader()、setStatus()或addCookie();redirectTo() - 、
Bitrix\Main\Engine\Response\Json、AjaxJson、Redirect、File或渲染响应助手;HtmlContent - 使用Bitrix原生响应层替代手动、
header()、Set-Cookie或setcookie();json_encode() - 为controller action或其他基础设施端点选择HTTP响应类型。
Когда читать rules/routing.md
rules/routing.md何时阅读 rules/routing.md
rules/routing.mdЧитай , если задача затрагивает хотя бы одну из этих областей:
rules/routing.md- файл в или регистрация маршрутов в
<module>/install/routes/и/bitrix/routes/;/local/routes/ - ,
RoutingConfigurator,prefix, HTTP-методы маршрута,group,where,default;name - или перенос legacy URL с
PublicPageControllerна modern routing;urlrewrite.php - site-guard и маршруты для конкретного сайта в мультисайтовой установке;
- массив в маршруте.
[Controller::class, 'action']
若任务涉及以下任一领域,请阅读:
rules/routing.md- 下的文件,或在
<module>/install/routes/与/bitrix/routes/中注册路由;/local/routes/ - 、
RoutingConfigurator、prefix、路由HTTP方法、group、where、default;name - 或通过
PublicPageController将旧版URL迁移至现代路由;urlrewrite.php - 多站点安装中的站点防护与特定站点路由;
- 路由中的数组。
[Controller::class, 'action']
Когда читать rules/loader.md
rules/loader.md何时阅读 rules/loader.md
rules/loader.mdЧитай , если задача затрагивает хотя бы одну из этих областей:
rules/loader.md- или
Loader::includeModule();Loader::requireModule() - или
CModule::IncludeModule();CModule::IncludeModuleEx() - optional module integration с fallback при отсутствии модуля;
- fail-fast dependency, где отсутствие модуля должно привести к ошибке, а не к тихому пропуску.
若任务涉及以下任一领域,请阅读:
rules/loader.md- 或
Loader::includeModule();Loader::requireModule() - 或
CModule::IncludeModule();CModule::IncludeModuleEx() - 可选模块集成,模块不存在时提供降级方案;
- 快速失败依赖,模块不存在时应触发错误而非静默跳过。
Когда читать rules/geo-ip.md
rules/geo-ip.md何时阅读 rules/geo-ip.md
rules/geo-ip.mdЧитай , если задача затрагивает хотя бы одну из этих областей:
rules/geo-ip.md- ,
Bitrix\Main\Service\GeoIp\Manager,getRealIp()или convenience getters вродеgetDataResult()/getCountryCode();getCityName() - в контексте GeoIP lookup, range cache или различий между IPv4 и IPv6 для geodata;
Bitrix\Main\Web\IpAddress - custom GeoIP handler, наследник или регистрация через
Bitrix\Main\Service\GeoIp\Base;onMainGeoIpHandlersBuildList - post-processing GeoIP результата через ;
onGeoIpGetResult - выбор между простым string lookup и полным -based GeoIP lookup.
Result - определение геолокации
若任务涉及以下任一领域,请阅读:
rules/geo-ip.md- 、
Bitrix\Main\Service\GeoIp\Manager、getRealIp()或getDataResult()/getCountryCode()等便捷获取方法;getCityName() - GeoIP查询、范围缓存或IPv4与IPv6地理数据差异场景下的;
Bitrix\Main\Web\IpAddress - 继承自的自定义GeoIp处理器,或通过
Bitrix\Main\Service\GeoIp\Base注册;onMainGeoIpHandlersBuildList - 通过对GeoIP结果进行后处理;
onGeoIpGetResult - 在简单字符串查询与完整基于的GeoIP查询之间选择;
Result - 地理位置识别
Когда читать rules/uri.md
rules/uri.md何时阅读 rules/uri.md
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()для query string, host, path, fragment или absolute URL;parse_str() - query-параметры с точками или пробелами, где важен .
preserveDots
若任务涉及以下任一领域,请阅读:
rules/uri.md- 、
Bitrix\Main\Web\Uri、new Uri($url)、getQuery()、addParams()、deleteParams()或toAbsolute();resolveRelativeUri() - 在Bitrix代码中解析、修改或重构URL/URI/重定向URL;
- 在、
Uri与parse_url()之间选择用于查询字符串、主机、路径、片段或绝对URL的处理;parse_str() - 含点或空格的查询参数,需注意参数。
preserveDots
Когда читать rules/http-client.md
rules/http-client.md何时阅读 rules/http-client.md
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)для remotestream_context_create()/httpURL;https - замена ,
curl_init,curl_setoptи других rawcurl_execвызовов на framework-native transport.curl_*
若任务涉及以下任一领域,请阅读:
rules/http-client.md- 、
Bitrix\Main\Web\HttpClient、new HttpClient()、get()、post()或query();download() - 出站HTTP(S)请求、webhook发送、远程下载/上传或外部API集成;
- 使用框架原生传输层替代/
file_get_contents($url)处理远程stream_context_create()/httpURL;https - 使用框架原生传输层替代、
curl_init、curl_setopt等原生curl_exec调用。curl_*
Когда читать rules/jwt.md
rules/jwt.md何时阅读 rules/jwt.md
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/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兼容数据的签发、验证或解析;
- 在框架原生JWT/JWK API与手动构建令牌、密钥解析或Base64 URL安全助手之间选择。
Когда читать rules/date-time.md
rules/date-time.md何时阅读 rules/date-time.md
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/date-time.md- 或
Bitrix\Main\Type\Date;Bitrix\Main\Type\DateTime - 、
createFromUserTime()、tryParse()、toUserTime()、toString()或createFromTimestamp();createFromPhp() - 在Bitrix代码中解析、格式化日期时间或进行时间戳转换;
- 在Bitrix日期类型与/
\DateTime之间选择。\DateTimeImmutable
Когда читать rules/option.md
rules/option.md何时阅读 rules/option.md
rules/option.mdЧитай , если задача затрагивает хотя бы одну из этих областей:
rules/option.md- ,
Bitrix\Main\Config\Option,Option::get(),set(),getRealValue()илиgetForModule();delete() - ,
COption::GetOptionString(),SetOptionString()илиGetOptionInt()как legacy trigger;RemoveOption() - , module
default_option.php, site-specific setting или feature flag / policy в БД;options.php - выбор между постоянной конфигурацией в , deploy-time config в
Optionи временным runtime-state..settings.php
若任务涉及以下任一领域,请阅读:
rules/option.md- 、
Bitrix\Main\Config\Option、Option::get()、set()、getRealValue()或getForModule();delete() - 作为旧版触发方式的、
COption::GetOptionString()、SetOptionString()或GetOptionInt();RemoveOption() - 、模块
default_option.php、站点特定设置或数据库中的功能开关/策略;options.php - 在中的持久化配置、部署时
Option中的配置与临时运行时状态之间选择。.settings.php
Когда читать rules/logger.md
rules/logger.md何时阅读 rules/logger.md
rules/logger.mdЧитай , если задача затрагивает хотя бы одну из этих областей:
rules/logger.md- ,
Bitrix\Main\Diag\Logger,Bitrix\Main\Diag\LoggerFactory,LoggerRegistryилиFileLogger;LogFormatter - , PSR-3 levels (
Psr\Log\LoggerInterface,info,warning,error) и structureddebug;context - регистрацию logger id в через секцию
.settings.phpили DI черезloggers;constructorParams - замену ,
AddMessage2Log()или ad hocLogger::create()/file_put_contents()на framework-native logging path;error_log() - выбор между именованным logger id, default logger fallback и legacy logging boundary.
若任务涉及以下任一领域,请阅读:
rules/logger.md- 、
Bitrix\Main\Diag\Logger、Bitrix\Main\Diag\LoggerFactory、LoggerRegistry或FileLogger;LogFormatter - 、PSR-3日志级别(
Psr\Log\LoggerInterface、info、warning、error)及结构化debug;context - 通过中的
.settings.php部分注册日志ID,或通过loggers进行DI注入;constructorParams - 使用框架原生日志方案替代、
AddMessage2Log()或临时的Logger::create()/file_put_contents();error_log() - 在命名日志ID、默认日志降级方案与旧版日志边界之间选择。
Когда читать rules/uuid-generator.md
rules/uuid-generator.md何时阅读 rules/uuid-generator.md
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(), ручной сборкой UUID или локальным helper-генератором;Random::getBytes() - legacy boundary, где нужен UUID в обертке вроде , но canonical generator должен остаться единым.
{uuid}
若任务涉及以下任一领域,请阅读:
rules/uuid-generator.md- 或
Bitrix\Main\UuidGenerator;UuidGenerator::generateV4() - 为会话ID、关联ID、上传令牌、公共代理ID或其他随机不透明标识符生成UUID v4;
- 在、
UuidGenerator、uniqid()、手动构建UUID或本地助手生成器之间选择;Random::getBytes() - 旧版边界场景,需将UUID包装为格式,但标准生成器需保持统一。
{uuid}
Когда читать rules/validation.md
rules/validation.md何时阅读 rules/validation.md
rules/validation.mdЧитай , если задача затрагивает хотя бы одну из этих областей:
rules/validation.md- на параметрах
Bitrix\Main\Validation\Rule\...или свойствах input object;*Action() - ,
ValidationParameter,ValidationService,ValidationResultилиValidationError;ValidationGroup - автоматическая валидация входа до входа в action или ручная валидация DTO / command в service layer;
- выбор между validation attributes, и явным
ValidationParameter;ValidationService::validate() - custom validators и custom validation attributes поверх .
Bitrix\Main\Validation
若任务涉及以下任一领域,请阅读:
rules/validation.md- 参数或输入对象属性上的
*Action()规则;Bitrix\Main\Validation\Rule\... - 、
ValidationParameter、ValidationService、ValidationResult或ValidationError;ValidationGroup - 在进入action前自动验证输入,或在service层手动验证DTO/command;
- 在验证属性、与显式
ValidationParameter之间选择;ValidationService::validate() - 基于的自定义验证器与自定义验证属性。
Bitrix\Main\Validation
Когда читать rules/service-locator.md
rules/service-locator.md何时阅读 rules/service-locator.md
rules/service-locator.mdЧитай , если задача затрагивает хотя бы одну из этих областей:
rules/service-locator.md- ,
Bitrix\Main\DI\ServiceLocator,ServiceLocator::getInstance(),get(),has()илиaddInstance();addInstanceLazy() - , service registration, service id, FQCN binding или interface binding для DI;
{module}/.settings.php - выбор между action autowiring, explicit и ручным
ServiceLocator::get(...)для shared service;new MyService() - замена ad hoc создания service-класса на framework-native container path.
若任务涉及以下任一领域,请阅读:
rules/service-locator.md- 、
Bitrix\Main\DI\ServiceLocator、ServiceLocator::getInstance()、get()、has()或addInstance();addInstanceLazy() - 、服务注册、服务ID、FQCN绑定或DI接口绑定;
{module}/.settings.php - 在action自动注入、显式与手动
ServiceLocator::get(...)之间选择共享服务的获取方式;new MyService() - 使用框架原生容器方案替代临时创建service类。
Когда читать rules/persistent-storage.md
rules/persistent-storage.md何时阅读 rules/persistent-storage.md
rules/persistent-storage.mdЧитай , если задача затрагивает хотя бы одну из этих областей:
rules/persistent-storage.md- ,
Bitrix\Main\Data\Storage\PersistentStorageInterface,StorageInterfaceилиDeferredStorageDecorator;ServiceLocator::get(PersistentStorageInterface::class) - /
Bitrix\Main\Config\Option::get()в сценарии, где нужно понять, конфигурация это или временное runtime-state;Option::set() - TTL state, progress/checkpoint, one-time token, upload/import session, rate-limit counter или другой временный server-side state между запросами;
- выбор между , persistent storage и cache (
Option/Bitrix\Main\Data\Cache) для хранения данных.ManagedCache
若任务涉及以下任一领域,请阅读:
rules/persistent-storage.md- 、
Bitrix\Main\Data\Storage\PersistentStorageInterface、StorageInterface或DeferredStorageDecorator;ServiceLocator::get(PersistentStorageInterface::class) - 需要区分是配置还是临时运行时状态场景下的/
Bitrix\Main\Config\Option::get();Option::set() - 请求间的TTL状态、进度/检查点、一次性令牌、上传/导入会话、速率限制计数器或其他临时服务器端状态;
- 在、持久化存储与缓存(
Option/Bitrix\Main\Data\Cache)之间选择数据存储方式。ManagedCache
Когда читать rules/cache.md
rules/cache.md何时阅读 rules/cache.md
rules/cache.mdЧитай , если задача затрагивает хотя бы одну из этих областей:
rules/cache.md- ,
Bitrix\Main\Data\Cache,ManagedCache,TaggedCache,Cache::createInstance(),initCache(),startDataCache()илиendDataCache();abortDataCache() - ,
Application::getInstance()->getCache(),getManagedCache()или container binding cache-сервисов вgetTaggedCache();main/.settings.php - выбор между простым TTL-cache, managed invalidation по key/dir и tag-based invalidation;
- ,
CPHPCache,CCacheManagerили$CACHE_MANAGERкак legacy trigger;CStackCacheManager - derived read-cache, который можно потерять и пересчитать, в отличие от runtime-state и постоянной конфигурации.
若任务涉及以下任一领域,请阅读:
rules/cache.md- 、
Bitrix\Main\Data\Cache、ManagedCache、TaggedCache、Cache::createInstance()、initCache()、startDataCache()或endDataCache();abortDataCache() - 、
Application::getInstance()->getCache()、getManagedCache()或getTaggedCache()中的容器缓存服务绑定;main/.settings.php - 在简单TTL缓存、基于键/目录的托管失效与基于标签的失效之间选择;
- 作为旧版触发方式的、
CPHPCache、CCacheManager或$CACHE_MANAGER;CStackCacheManager - 派生只读缓存,可丢失并重新计算,区别于运行时状态与持久化配置。