Плагин регистрирует нужный мне роутер без меню

This commit is contained in:
Artem Vasilev 2024-03-04 01:15:47 +03:00
parent 23a1d42c8c
commit 9f8feabd3d
2 changed files with 58 additions and 35 deletions

View File

@ -1,13 +1,36 @@
<?php <?php
use Joomla\CMS\Extension\PluginInterface;
use Joomla\CMS\Factory;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface; use Joomla\DI\ServiceProviderInterface;
use Joomla\Event\DispatcherInterface;
use Webmasterskaya\Plugin\System\OauthServer\Extension\Plugin;
\defined('_JEXEC') or die; \defined('_JEXEC') or die;
return new class implements ServiceProviderInterface { return new class implements ServiceProviderInterface {
public function register(\Joomla\DI\Container $container) /**
* @param \Joomla\DI\Container $container
* @return void
* @since version
*/
public function register(Container $container)
{ {
// TODO: Implement register() method. $container->set(
PluginInterface::class,
function (Container $container) {
$dispatcher = $container->get(DispatcherInterface::class);
$plugin = new Plugin(
$dispatcher,
(array) PluginHelper::getPlugin('system', 'oauthserver')
);
$plugin->setApplication(Factory::getApplication());
return $plugin;
}
);
} }
}; };

View File

@ -2,60 +2,60 @@
namespace Webmasterskaya\Plugin\System\OauthServer\Extension; namespace Webmasterskaya\Plugin\System\OauthServer\Extension;
use Joomla\CMS\Application\CMSApplicationInterface; use Joomla\CMS\Factory;
use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\CMS\Router\SiteRouter;
use Joomla\CMS\Uri\Uri; use Joomla\CMS\Uri\Uri;
use Joomla\Event\SubscriberInterface; use Joomla\Event\SubscriberInterface;
class Plugin extends CMSPlugin implements SubscriberInterface class Plugin extends CMSPlugin implements SubscriberInterface
{ {
/**
* Affects constructor behavior. If true, language files will be loaded automatically.
*
* @var boolean
* @since 3.1
*/
protected $autoloadLanguage = false;
/**
* The application object
*
* @var CMSApplicationInterface
*
* @since 4.2.0
*/
private $application;
public static function getSubscribedEvents(): array public static function getSubscribedEvents(): array
{ {
return ['onAfterInitialise' => 'onAfterInitialise']; return ['onAfterInitialise' => 'attachOauthRouter'];
} }
public function onAfterInitialise(): void public function attachOauthRouter(): void
{ {
if (!$this->app->isClient('site')) { /** @var \Joomla\CMS\Application\SiteApplication $app */
$app = $this->getApplication();
if (!$app->isClient('site')) {
return; return;
} }
$uri = Uri::getInstance(); /** @var \Joomla\CMS\Router\SiteRouter $siteRouter */
$path = $uri->getPath(); $siteRouter = Factory::getContainer()->get(SiteRouter::class);
$siteRouter->attachParseRule([$this, 'parseOauthRoute'], $siteRouter::PROCESS_BEFORE);
}
// Адрес сервера аутентификации должен быть статичным, /**
// чтобы гарантировать 100% доступность сервера * @param \Joomla\CMS\Router\SiteRouter $router
if (str_starts_with($path, '/login/oauth/') === false) { * @param \Joomla\CMS\Uri\Uri $uri
* @return void
* @since version
*/
public function parseOauthRoute(SiteRouter &$router, Uri &$uri): void
{
$route = trim($uri->getPath(), '/');
if (empty($route)) {
return; return;
} }
$parts = explode('/', $path); // TODO: Переделать на ComponentRouter (пример в Joomla\CMS\Router\SiteRouterЖ::parseSefRoute())
// 1. Зарегистрировать роутер компонента $router->setComponentRouter()
if(empty($parts[2])){ // 2. Вызвать $router->getComponentRouter($component)
// TODO: Проверить, как стандартный роутер обработает этот вопрос и как отреагируют приложения на 404 от Joomla if (!str_starts_with($route, 'login/oauth')) {
return; return;
} }
$option = 'com_oauthserver'; $segments = explode('/', $route);
$task = $parts[2];
// TODO: Ставим в input option, task и view и запускаем компонент com_oauthserver $uri->setVar('option', 'com_oauthserver');
$uri->setVar('task', 'login.' . $segments[2]);
$uri->setVar('view', 'default');
$uri->setPath('');
} }
} }