beta/bx.router

Routing for Bitrix app

Installs: 953

Dependents: 0

Suggesters: 0

Security: 0

Stars: 6

Watchers: 4

Forks: 4

Open Issues: 1

Type:bitrix-module

1.10.0 2024-03-22 12:47 UTC

README

Установка

composer require beta/bx.router

Пример инициализации приложения:

use BX\Router\RestApplication;
use BX\Router\Middlewares\Logger;
use BX\Router\Middlewares\UseBitrixCookies;
use BX\Router\Middlewares\HttpException;

$app = new RestApplication();
$router = $app->getRouter();

$defaultMiddleware = new UseBitrixCookies(); // подставляет куки из bitrix в запрос
$defaultMiddleware->addMiddleware(new HttpException($app->getFactory())); // добавляем обработчик ошибок

$app->registerMiddleware($defaultMiddleware); // регистрируем цепочку middleware 

$app->setResponseHandler(new CustomResponseHandler);    // Устанавливаем собственный обработчик ответа
$app->setService('jwt', new UserTokenService());        // Регистрируем внешний сервис для доступа из контроллера

$logger = new Logger();
$router->get('/api/v1/catalog/', new CatalogController)->registerMiddleware($logger);
$router->get('/api/v1/some/{test}/', new SomeController)->registerMiddleware($logger);
$router->get('/api/v1/pages/main/', new MainPageConroller)
    ->useCache(3600, 'main_page')       // Кешируем ответ, ключ не обязателен, работает только c GET методами
    ->registerMiddleware($logger);
$router->default(new DefaultController) // Контроллер по-умолчанию
    ->registerMiddleware($logger); 

$app->run();

Пример контроллера c вызовом компонента:

use BX\Router\Interfaces\BitrixServiceInterface;
use BX\Router\Interfaces\AppFactoryInterface;
use BX\Router\Interfaces\ContainerGetterInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
use BX\Router\BaseController;

class CatalogController extends BaseController
{
    /**
    * @var BitrixServiceInterface
     */
    protected $bitrixService;
    /**
    * @var AppFactoryInterface
     */
    protected $appFactory;
    /**
    * @var ContainerGetterInterface
     */
    protected $containerGetter;
    
    public function handle(ServerRequestInterface $request): ResponseInterface
    {
        $component = $this->appFactory->createComponentWrapper('api:catlog.list'); // Создаем обертку компонента
        $component->setContainer($this->containerGetter);
        $component->setAppFactory($this->appFactory);
        $component->setBitrixService($this->bitrixService);
        
        return $component->handle($request);    // Возвращаем ответ с данными из массива $arResult
    }
}

Пример простого контроллера:

use BX\Router\Interfaces\BitrixServiceInterface;
use BX\Router\Interfaces\AppFactoryInterface;
use BX\Router\Interfaces\ContainerGetterInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
use BX\Router\BaseController;

class MainPageConroller extends BaseController
{
    /**
    * @var BitrixServiceInterface
     */
    protected $bitrixService;
    /**
    * @var AppFactoryInterface
     */
    protected $appFactory;
    /**
    * @var ContainerGetterInterface
     */
    protected $containerGetter;
    
    public function handle(ServerRequestInterface $request): ResponseInterface
    {
        $this->containerGetter->has('jwt'); // проверяем внешний сервис
        $jwt = $this->containerGetter->get('jwt');
        if (!($jwt instanceof UserTokenService)) {
            throw new \Exception('Что-то пошло не так...');
        }

        $request->getAttribute('test'); // атрибут из адресной строки
        $request->getAttributes();      // список атрибутов из адресной строки
        
        $jwtToken = trim(str_replace('Bearer', $request->getHeader('Authorization')));
        $userContext = $jwt->getUserContext($jwtToken);
        $user = $userContext->getUser();
        
        $data = $user->toArray();
        $response = $this->appFactory->createResponse();
        $response->getBody()->write(json_encode($data));
        
        return $response;
    }
}

Пример контроллера с выборкой атрибутов из адресной строки:

use BX\Router\Interfaces\BitrixServiceInterface;
use BX\Router\Interfaces\AppFactoryInterface;
use BX\Router\Interfaces\ContainerGetterInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
use BX\Router\BaseController;

class SomeController extends BaseController
{
    /**
    * @var BitrixServiceInterface
     */
    protected $bitrixService;
    /**
    * @var AppFactoryInterface
     */
    protected $appFactory;
    /**
    * @var ContainerGetterInterface
     */
    protected $containerGetter;
    
    public function handle(ServerRequestInterface $request): ResponseInterface
    {
        $testAttribute = $request->getAttribute('test'); // атрибут из адресной строки
        $attributes = $request->getAttributes();         // список атрибутов из адресной строки
        
        $response = $this->appFactory->createResponse();
        $response->getBody()->write(json_encode($attributes));
        
        return $response;
    }
}