prettybx/support

Pretty Bitrix

0.0.4 2020-11-20 09:19 UTC

This package is auto-updated.

Last update: 2024-09-16 17:17:23 UTC


README

Scrutinizer Code Quality Build Status Code Intelligence Status

简化Bitrix操作的库

安装

composer require prettybx/support

开始使用

  1. 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 的示例:

  1. 在服务提供者中添加以下命令:
Manager::macro('append', function ($filename, $data) {
    $resource = fopen($filename, 'a');

    fwrite($resource, (string) $data);

    fclose($resource);
});
  1. 使用方法:
\PrettyBx\Support\Facades\FileManager::append($this->getFullPath(), $data);

项目 "Pretty Bitrix" 中的其他库: