prettybx / support
Pretty Bitrix
Requires
- illuminate/container: >=5.8
- illuminate/support: >=5.8
- illuminate/validation: >=5.8
- mockery/mockery: >=1.3
- phpunit/phpunit: >=7
This package is auto-updated.
Last update: 2024-09-16 17:17:23 UTC
README
简化Bitrix操作的库
安装
composer require prettybx/support
开始使用
- 在
local/php_interface/init.php
中初始化服务提供者
(new \PrettyBx\Support\Providers\BitrixMainProvider())->register();
DI容器
为了实现依赖注入,建议使用Illuminate/Container(Laravel框架中的DI容器)。要获取容器实例,可以使用container()
辅助函数。示例
$bar = container()->make(\Foo\Bar::class); // получим экземпляр класса \Foo\Bar
门面
为了方便测试,库将Laravel的门面连接到项目并适配其工作。要创建自己的门面,需要创建一个类,继承自PrettyBx\Support\Base\AbstractFacade
,并在其中实现getFacadeAccessor
方法,该方法应返回门面后面的类名。示例
class Foo
{
public function bar()
{
return 'Hi!';
}
}
class FooFacade extends \PrettyBx\Support\Base\AbstractFacade
{
protected static function getFacadeAccessor()
{
return Foo::class;
}
}
class Service
{
public function doAction()
{
echo FooFacade::bar(); // Hi!
}
}
在测试中可以这样使用
FooFacade::shouldReceive('bar')->andReturn('Hi!');
Bitrix全局变量
由于静态方法和全局变量很难进行测试,为了方便使用,建议使用门面,其结果可以轻松替换为测试替身。
$GLOBALS['APPLICATION']
可以使用门面PrettyBx\Support\Facades\CMain
获取放置在$GLOBALS['APPLICATION']
中的\CMain类的实例。示例
// Вместо этого
global $APPLICATION;
$contants = $APPLICATION->GetFileContent("/foo/bar.baz");
// Делаем так:
$contants = \PrettyBx\Support\Facades\CMain::GetFileContent("/foo/bar.baz");
$GLOBALS['USER']
可以使用门面PrettyBx\Support\Facades\CUser
获取\CUser类的实例。以下是如何获取当前用户ID的示例
$userId = \PrettyBx\Support\Facades\CUser::getId();
授权示例
\PrettyBx\Support\Facades\CUser::login($login, $password);
\Bitrix\Main\Application
该类是D7的基础类,但它包含静态方法。此外,它是一个代码级别的单例,这意味着只能通过getInstance方法获取其实例。这极大地阻碍了测试。为了使测试此类成为可能,建议使用其门面PrettyBx\Support\Facades\Application
。
方便加载Bitrix模块
在开发的类中,经常需要加载Bitrix模块。库为开发者提供了一个方便的模块加载工具。建议使用trait PrettyBx\Support\Traits\LoadsModules
。示例
use PrettyBx\Support\Traits\LoadsModules;
class SomeService
{
use LoadsModules;
protected $modules = ['iblock', 'catalog'];
public function __construct()
{
$this->loadModules(); // Загрузит те модули, которые указаны в $this->modules
}
public function loadOnDemand()
{
$this->loadModule('sale'); // Загрузит модуль, который был передан
}
}
如果指定的模块无法加载,将抛出\RuntimeException
异常
处理配置
库提供了一个方便的工具来处理位于bitrix/.settings.php
文件中的Bitrix配置。要获取配置元素值,可以使用辅助函数config
。
var_dump(config("connections"));
可以通过分隔数组键来获取多维数组值,例如
var_dump(config("connections.default.host")); // $config['connections]['default']['host']
数据验证
为了进行数据验证,使用Illuminate/Validation库。要使用它,建议将trait PrettyBx\Support\Traits\Validatable
连接到所需的类。示例
use PrettyBx\Support\Traits\Validatable;
class Service
{
use Validatable;
public function getValidatedRequestData(): array
{
$rules = [
'ID' => 'required|numeric',
'TYPE' => 'required|string',
];
$this->validate($_POST, $rules);
}
}
如果数据验证失败,将抛出\InvalidArgumentException
异常。所有可用的验证规则列表可以在此查看https://laravel.net.cn/docs/5.8/validation
处理事件
建议将所有事件处理工作放入一个类中 - EventServiceProvider。要注册自己的事件处理器,创建一个继承自PrettyBx\Support\Providers\AbstractEventServiceProvider
的类。在受保护的属性events
中指定需要处理的事件。示例
use PrettyBx\Support\Providers\AbstractEventServiceProvider;
class EventServiceProvider extends AbstractEventServiceProvider
{
protected array $events = [
[
'module' => 'iblock',
'event' => 'OnAfterIBlockElementAdd',
'handler' => [\App\EventListeners\IblockEventListener::class, 'afterAdd'],
'sort' => 100,
],
[
'module' => 'iblock',
'event' => 'OnAfterIBlockElementUpdate',
'handler' => [\App\EventListeners\IblockEventListener::class, 'afterUpdate'],
'sort' => 100,
],
[
'module' => 'iblock',
'event' => 'OnBeforeIBlockElementDelete',
'handler' => 'function_name_here',
'sort' => 100,
],
];
}
然后,在php_interface/init.php
中注册此类
(new EventServiceProvider())->register();
在注册EventServiceProvider时,它会将指定的处理器订阅到指定的事件。
处理文件系统
为了方便处理文件,有一个类PrettyBx\Support\Filesystem\Manager
,它是一组执行文件操作的命令。建议使用服务提供者将其注册为单例
(new \PrettyBx\Support\Providers\FileServiceProvider())->register();
现在可以执行文件操作,如重命名、检查是否存在、获取内容、删除等,如下所示
use PrettyBx\Support\Filesystem\Manager;
$manager = container()->make(Manager::class);
$file = '/foo/bar';
$contents = $manager->getContents($file);
或通过门面
use PrettyBx\Support\Facades\FileManager;
$file = '/foo/bar';
$contents = FileManager::getContants($file);
扩展文件处理功能,类 PrettyBx\Support\Filesystem\Manager
实现了宏扩展 Illuminate\Support\Traits\Macroable
,允许动态添加方法。建议在服务提供者中进行此操作。以下为添加方法 append 的示例:
- 在服务提供者中添加以下命令:
Manager::macro('append', function ($filename, $data) {
$resource = fopen($filename, 'a');
fwrite($resource, (string) $data);
fclose($resource);
});
- 使用方法:
\PrettyBx\Support\Facades\FileManager::append($this->getFullPath(), $data);