{"id":457805,"date":"2025-04-28T21:00:36","date_gmt":"2025-04-28T21:00:36","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=457805"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=457805","title":{"rendered":"<span>\u0423\u0447\u0438\u043c\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Dependency Injection Containers (DI \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b) \u0432 Joomla 5<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0423 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0410\u041f\u0418 \u0421\u0434\u044d\u043a\u0430. \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0435\u0439 \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 <code>WishboxCdekSDK2\\CdekClientV2<\/code> \u0438 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434.<\/p>\n<pre><code class=\"php\">$apiClient = new CdekClientV2($account, $secure, $timeout); $apiClient-&gt;getCities();<\/code><\/pre>\n<p>\u0426\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0410\u041f\u0418-\u043a\u043b\u0438\u0435\u043d\u0442 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 \u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u0445 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"php\">$apiClient = $this-&gt;getCdekClientV2();<\/code><\/pre>\n<p>\u0438\u043b\u0438 \u0432 \u043b\u044e\u0431\u043e\u043c \u0434\u0440\u0443\u0433\u043e\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0438:<\/p>\n<pre><code class=\"php\">$apiClient = Joomla\\CMS\\Factory::getApplication()   -&gt;bootComponent('com_wishboxcdek')-&gt;getCdekClientV2(); $apiClient = Joomla\\CMS\\Factory::getApplication()   -&gt;bootPlugin('wishboxcdek', 'console')-&gt;getCdekClientV2();<\/code><\/pre>\n<p>\u0418 \u0432 \u044d\u0442\u043e\u043c \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0433\u0443\u0442 DI \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0439\u0434\u0451\u043c \u043e\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e.<\/p>\n<h3>\u0428\u0430\u0433 1: \u0442\u0440\u0435\u0439\u0442 WishboxCdekSDK2\\Trait\\CdekClientV2ServiceTrait<\/h3>\n<blockquote>\n<p><strong>\u0422\u0440\u0435\u0439\u0442<\/strong>\u00a0\u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b <code>getCdekClientV2<\/code> \u0438 <code>setCdekClientV2<\/code>.<\/p>\n<\/blockquote>\n<p><code>Root\/libraries\/wishboxcdek\/src\/Trait\/CdekClientV2ServiceTrait.php:<\/code><\/p>\n<pre><code class=\"php\">&lt;?php \/**  * @copyright   (c) 2013-2025 Nekrasov Vitaliy &lt;nekrasov_vitaliy@list.ru&gt;  * @license     GNU General Public License version 2 or later;  *\/ namespace WishboxCdekSDK2\\Trait;  use UnexpectedValueException; use WishboxCdekSDK2\\CdekClientV2; use WishboxCdekSDK2\\CdekClientV2Interface; use function defined;  \/\/ phpcs:disable PSR1.Files.SideEffects defined('_JEXEC') or die; \/\/ phpcs:enable PSR1.Files.SideEffects  \/**  * Defines the trait for the CdekClientV2 service class.  *  * @since  1.0.0  *\/ trait CdekClientV2ServiceTrait { \/**  * The API client.  *  * @var CdekClientV2|null  *  * @since 1.0.0  *\/ private ?CdekClientV2Interface $cdekClientV2 = null;  \/**  * Get the API client.  *  * @return  CdekClientV2Interface  *  * @since   1.0.0  *\/ public function getCdekClientV2(): CdekClientV2Interface { if (!$this-&gt;cdekClientV2) { throw new UnexpectedValueException('CdekClientV2 not set in ' . __CLASS__); }  return $this-&gt;cdekClientV2; }  \/**  * The API client.  *  * @param   CdekClientV2Interface  $cdekClientV2  CdekClientV2  *  * @return  void  *  * @since  1.0.0  *\/ public function setCdekClientV2(CdekClientV2Interface $cdekClientV2): void { $this-&gt;cdekClientV2 = $cdekClientV2; } } <\/code><\/pre>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u0435\u0433\u043e \u043a \u043a\u043b\u0430\u0441\u0441\u0430\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 <code>Root\/administrator\/components\/com_wishboxcdek\/src\/Extension\/WishboxcdekComponent.php<\/code> \u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 <code>Root\/plugins\/console\/wishboxcdek\/src\/Extension\/Wishboxcdek.php<\/code> .<\/p>\n<h3>\u0428\u0430\u0433 2: \u043a\u043b\u0430\u0441\u0441 \u0441\u0435\u0440\u0432\u0438\u0441-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 WishboxCdekSDK2\\Service\\ProviderCdekClientV2<\/h3>\n<blockquote>\n<p><strong>\u0421\u0435\u0440\u0432\u0438\u0441-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 <\/strong>\u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>Joomla\\DI\\ServiceProviderInterface<\/code>, \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 register \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0410\u041f\u0418-\u043a\u043b\u0438\u0435\u043d\u0442\u0430.  <\/p>\n<\/blockquote>\n<p>\u0412 \u043a\u0430\u0436\u0434\u043e\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 \u0438\u043b\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0435 \u0435\u0441\u0442\u044c \u0444\u0430\u0439\u043b <code>provider.php<\/code> \u0441 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>Joomla\\DI\\ServiceProviderInterface<\/code>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0434\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u0432\u0438\u0441-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u0432.<\/p>\n<p>\u0417\u043d\u0430\u0447\u0438\u0442 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0441\u0435\u0440\u0432\u0438\u0441-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <code>WishboxCdekSDK2\\CdekClientV2<\/code>.<\/p>\n<p>\u041f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 \u0441\u0435\u0440\u0432\u0438\u0441-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u044f\u0434\u0440\u0430 Joomla \u043d\u0430\u0437\u043e\u0432\u0451\u043c \u043a\u043b\u0430\u0441\u0441 \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u043a\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u2014  <code>WishboxCdekSDK2\\Service\\ProviderCdekClientV2<\/code>.<\/p>\n<p><code>Root\/libraries\/wishboxcdek\/src\/Service\/Provider\/CdekClientV2.php<\/code><\/p>\n<pre><code class=\"php\">&lt;?php \/**  * @copyright   (c) 2013-2025 Nekrasov Vitaliy &lt;nekrasov_vitaliy@list.ru&gt;  * @license     GNU General Public License version 2 or later  *\/ namespace WishboxCdekSDK2\\Service\\Provider;  use Joomla\\DI\\Container; use Joomla\\DI\\ServiceProviderInterface; use function defined;  \/\/ phpcs:disable PSR1.Files.SideEffects defined('_JEXEC') or die; \/\/ phpcs:enable PSR1.Files.SideEffects  \/**  * Service provider for the service MVC factory.  *  * @since  1.0.0  *\/ class CdekClientV2 implements ServiceProviderInterface { \/**  * \u0410\u043a\u043a\u0430\u0443\u043d\u0442 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438.  *  * @var string  *  * @since 1.0.0  *\/ private string $account;  \/**  * \u0421\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438.  *  * @var string  *  * @since 1.0.0  *\/ private string $secure;  \/**  * Timeout  *  * @var float|null  *  * @since 1.0.0  *\/ private ?float $timeout;  \/**  * @param   string       $account  Account  * @param   string|null  $secure   Secure  * @param   float|null   $timeout  Timeout  *  * @since   1.0.0  *\/ public function __construct(string $account, ?string $secure = null, ?float $timeout = 10.0) { $this-&gt;account = $account; $this-&gt;secure = $secure; $this-&gt;timeout = $timeout; }  \/**  * Registers the service provider with a DI container.  *  * @param   Container  $container  The DI container.  *  * @return  void  *  * @since   1.0.0  *  * @noinspection PhpUnusedParameterInspection  *\/ public function register(Container $container): void { $container-&gt;set( \\WishboxCdekSDK2\\CdekClientV2Interface::class, function (Container $container) { return new \\WishboxCdekSDK2\\CdekClientV2( $this-&gt;account, $this-&gt;secure, $this-&gt;timeout ); } ); } } <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u0432 \u0441\u0435\u0440\u0432\u0438\u0441-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 49-59 \u0438 71.<\/p>\n<p><code>Root\/administrator\/components\/com_wishboxcdek\/services\/provider.php<\/code><\/p>\n<pre><code class=\"php\">&lt;?php \/**  * @copyright   (c) 2013-2025 Nekrasov Vitaliy &lt;nekrasov_vitaliy@list.ru&gt;  * @license     GNU General Public License version 2 or later;  *\/  use Joomla\\CMS\\Component\\ComponentHelper; use Joomla\\CMS\\Component\\Router\\RouterFactoryInterface; use Joomla\\CMS\\Dispatcher\\ComponentDispatcherFactoryInterface; use Joomla\\CMS\\Extension\\ComponentInterface; use Joomla\\CMS\\Extension\\Service\\Provider\\ComponentDispatcherFactory; use Joomla\\CMS\\Extension\\Service\\Provider\\RouterFactory; use Joomla\\CMS\\HTML\\Registry; use Joomla\\CMS\\MVC\\Factory\\MVCFactoryInterface; use Joomla\\Component\\Wishboxcdek\\Administrator\\Extension\\WishboxcdekComponent; use Joomla\\Component\\Wishboxcdek\\Site\\CMS\\Extension\\Service\\Provider\\MVCFactory; use Joomla\\DI\\Container; use Joomla\\DI\\ServiceProviderInterface; use WishboxCdekSDK2\\Service\\Provider\\CdekClientV2;  \/\/ phpcs:disable PSR1.Files.SideEffects defined('_JEXEC') or die; \/\/ phpcs:enable PSR1.Files.SideEffects  \/**  * The Wishboxcdek service provider.  *  * @since  1.0.0  *\/ return new class implements ServiceProviderInterface { \/**  * Registers the service provider with a DI container.  *  * @param   Container  $container  The DI container.  *  * @return  void  *  * @since   1.0.0  *  * @noinspection PhpMissingReturnTypeInspection  *\/ public function register(Container $container) { $container-&gt;registerServiceProvider(new MVCFactory('\\\\Joomla\\\\Component\\\\Wishboxcdek')); $container-&gt;registerServiceProvider(new ComponentDispatcherFactory('\\\\Joomla\\\\Component\\\\Wishboxcdek')); $container-&gt;registerServiceProvider(new RouterFactory('\\\\Joomla\\\\Component\\\\Wishboxcdek'));          \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 $componentParams = ComponentHelper::getParams('com_wishboxcdek');          \/\/ \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u0441\u0435\u0440\u0432\u0438\u0441-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \u0410\u041f\u0418 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 $container-&gt;registerServiceProvider( new CdekClientV2( $componentParams-&gt;get('account', ''), $componentParams-&gt;get('secure', ''), 60.0 ) );  $container-&gt;set( ComponentInterface::class, function (Container $container) { $component = new WishboxcdekComponent($container-&gt;get(ComponentDispatcherFactoryInterface::class)); $component-&gt;setRegistry($container-&gt;get(Registry::class)); $component-&gt;setMVCFactory($container-&gt;get(MVCFactoryInterface::class)); $component-&gt;setRouterFactory($container-&gt;get(RouterFactoryInterface::class));                  \/\/ \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0410\u041f\u0418-\u043a\u043b\u0438\u0435\u043d\u0442 \u0432 \u043a\u043b\u0430\u0441\u0441 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430                 $component-&gt;setCdekClientV2($container-&gt;get(\\WishboxCdekSDK2\\CdekClientV2Interface::class));  return $component; } ); } }; <\/code><\/pre>\n<p>\u0418 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u0435 <code>Root\/plugins\/console\/wishboxcdek\/services\/provider.php<\/code>.<\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0410\u041f\u0418-\u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0443\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<pre><code class=\"php\">$apiClient = Joomla\\CMS\\Factory::getApplication()  -&gt;bootComponent('com_wishboxcdek')-&gt;getCdekClientV2();  $apiClient = Joomla\\CMS\\Factory::getApplication()  -&gt;bootPlugin('wishboxcdek', 'console')-&gt;getCdekClientV2();<\/code><\/pre>\n<p>\u041d\u043e \u043d\u0430\u0448\u0430 \u0446\u0435\u043b\u044c <code>$apiClient = $this-&gt;getCdekClientV2();<\/code> \u0432 \u043c\u043e\u0434\u0435\u043b\u044f\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.<\/p>\n<h4>\u0428\u0430\u0433 3: \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 WishboxCdekSDK2\\Interface\\CdekClientV2AwareInterface \u0438 \u0442\u0440\u0435\u0439\u0442 WishboxCdekSDK2\\TraitCdekClientV2AwareTrait<\/h4>\n<p>\u0422\u0430\u043a \u0436\u0435 \u043f\u043e\u0439\u0434\u0451\u043c \u043e\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e, \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0410\u041f\u0418-\u043a\u043b\u0438\u0435\u043d\u0442\u0430 <code>setCdekClientV2<\/code>.<\/p>\n<p><code>Root\/libraries\/wishboxcdek\/src\/Interface\/CdekClientV2AwareInterface.php<\/code><\/p>\n<pre><code class=\"php\">&lt;?php \/**  * @copyright   (c) 2013-2025 Nekrasov Vitaliy &lt;nekrasov_vitaliy@list.ru&gt;  * @license     GNU General Public License version 2 or later  *\/ namespace WishboxCdekSDK2\\Interface;  \/\/ phpcs:disable PSR1.Files.SideEffects use WishboxCdekSDK2\\CdekClientV2Interface; use function defined;  defined('_JEXEC') or die; \/\/ phpcs:enable PSR1.Files.SideEffects  \/**  * Interface to be implemented by classes depending on a form factory.  *  * @since  1.0.0  *\/ interface CdekClientV2AwareInterface { \/**  * Set the form factory to use.  *  * @param   CdekClientV2  $cdekClientV2  The API client to use.  *  * @return  CdekClientV2AwareInterface  This method is chainable.  *  * @since   1.0.0  *\/ public function setCdekClientV2(CdekClientV2Interface $cdekClientV2): CdekClientV2AwareInterface; } <\/code><\/pre>\n<p>\u0418 \u0442\u0440\u0435\u0439\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b <code>setCdekClientV2<\/code> \u0438 <code>getCdekClientV2<\/code>.<\/p>\n<p><code>Root\/libraries\/wishboxcdek\/src\/Trait\/CdekClientV2AwareTrait.php<\/code><\/p>\n<pre><code class=\"php\">&lt;?php \/**  * @copyright   (c) 2013-2025 Nekrasov Vitaliy &lt;nekrasov_vitaliy@list.ru&gt;  * @license     GNU General Public License version 2 or later;  *\/ namespace WishboxCdekSDK2\\Trait;  use UnexpectedValueException; use WishboxCdekSDK2\\CdekClientV2; use WishboxCdekSDK2\\Interface\\CdekClientV2AwareInterface; use function defined;  \/\/ phpcs:disable PSR1.Files.SideEffects defined('_JEXEC') or die; \/\/ phpcs:enable PSR1.Files.SideEffects  \/**  * Defines the trait for the CdekClientV2 service class.  *  * @since  1.0.0  *\/ trait CdekClientV2AwareTrait { \/**  * The API client.  *  * @var CdekClientV2|null  *  * @since 1.0.0  *\/ private ?CdekClientV2 $cdekClientV2 = null;  \/**  * Get the API client.  *  * @return  CdekClientV2  *  * @throws  UnexpectedValueException May be thrown if the factory has not been set.  *  * @since   1.0.0  *\/ public function getCdekClientV2(): CdekClientV2Interface { if (!$this-&gt;cdekClientV2) { throw new UnexpectedValueException('CdekClientV2 not set in ' . __CLASS__); }  return $this-&gt;cdekClientV2; }  \/**  * The API client.  *  * @param   CdekClientV2  $cdekClientV2  CdekClientV2  *  * @return  CdekClientV2AwareInterface  *  * @since  1.0.0  *\/ public function setCdekClientV2(CdekClientV2Interface $cdekClientV2): CdekClientV2AwareInterface { $this-&gt;cdekClientV2 = $cdekClientV2;  return $this; } } <\/code><\/pre>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438 \u0442\u0440\u0435\u0439\u0442 \u043a \u043a\u043b\u0430\u0441\u0441\u0443 \u043c\u043e\u0434\u0435\u043b\u0438, \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b <code>setCdekClientV2<\/code> \u0438 <code>getCdekClientV2<\/code>.<\/p>\n<p>\u041d\u043e \u043a\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0410\u041f\u0418-\u043a\u043b\u0438\u0435\u043d\u0442 \u0432 \u043c\u043e\u0434\u0435\u043b\u044c?. &#8212; \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, MVC-\u0444\u0430\u0431\u0440\u0438\u043a\u0430. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u043f\u043e\u0441\u0442 <a href=\"https:\/\/habr.com\/ru\/posts\/895762\/\" rel=\"noopener noreferrer nofollow\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u043e\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 MVC \u0444\u0430\u0431\u0440\u0438\u043a\u0438 \u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 Joomla 5\u200b<\/a>.<\/p>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 MVC-\u0444\u0430\u0431\u0440\u0438\u043a\u0438, \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043c\u0435\u0442\u043e\u0434 <code>createModel<\/code> \u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0434\u043e\u0431\u0432\u043b\u044f\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438:<\/p>\n<pre><code class=\"php\">if ($model instanceof CdekClientV2AwareInterface) {     try     {         $model-&gt;setCdekClientV2($this-&gt;getCdekClientV2());     }     catch (UnexpectedValueException $e)     {         \/\/ Ignore it     } }<\/code><\/pre>\n<p>\u041c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0443 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0438 \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u044f\u0432\u0430\u0435\u043c \u0441\u0432\u043e\u0439 \u0410\u041f\u0418-\u043a\u043b\u0438\u0435\u043d\u0442.<\/p>\n<p>\u0417\u043d\u0430\u0447\u0438\u0442 \u0438 \u0441\u0430\u043c \u043a\u043b\u0430\u0441\u0441 MVC-\u0444\u0430\u0431\u0440\u0438\u043a\u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438 \u0442\u0440\u0435\u0439\u0442.<\/p>\n<p>\u0410 \u0432 \u0444\u0430\u0431\u0440\u0438\u043a\u0443 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0410\u041f\u0418-\u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0435\u0451 \u0441\u0435\u0440\u0432\u0438\u0441-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440.<\/p>\n<p><code>Root\/administrator\/components\/com_wishboxcdek\/src\/Extension\/Service\/Provider\/MVCFactory.php<\/code><\/p>\n<pre><code class=\"php\">&lt;?php \/**  * @copyright   (c) 2013-2025 Nekrasov Vitaliy &lt;nekrasov_vitaliy@list.ru&gt;  * @license     GNU General Public License version 2 or later; see LICENSE.txt  *\/ namespace Joomla\\Component\\Wishboxcdek\\Administrator\\Extension\\Service\\Provider;  use Joomla\\CMS\\Cache\\CacheControllerFactoryInterface; use Joomla\\CMS\\Factory; use Joomla\\CMS\\Form\\FormFactoryInterface; use Joomla\\CMS\\Mail\\MailerFactoryInterface; use Joomla\\CMS\\MVC\\Factory\\ApiMVCFactory; use Joomla\\CMS\\MVC\\Factory\\MVCFactoryInterface; use Joomla\\CMS\\Router\\SiteRouter; use Joomla\\CMS\\User\\UserFactoryInterface; use Joomla\\Database\\DatabaseInterface; use Joomla\\DI\\Container; use Joomla\\DI\\ServiceProviderInterface; use Joomla\\Event\\DispatcherInterface; use WishboxCdekSDK2\\CdekClientV2Interface; use function defined;  \/\/ phpcs:disable PSR1.Files.SideEffects defined('_JEXEC') or die; \/\/ phpcs:enable PSR1.Files.SideEffects  \/**  * Service provider for the service MVC factory.  *  * @since  1.0.0  *\/ class MVCFactory extends \\Joomla\\CMS\\Extension\\Service\\Provider\\MVCFactory implements ServiceProviderInterface { \/**  * The extension namespace  *  * @var  string  *  * @since   1.0.0  *\/ private $namespace;  \/**  * MVCFactory constructor.  *  * @param   string  $namespace  The namespace  *  * @since   1.0.0  *\/ public function __construct(string $namespace) { parent::__construct($namespace);  $this-&gt;namespace = $namespace; }  \/**  * Registers the service provider with a DI container.  *  * @param   Container  $container  The DI container.  *  * @return  void  *  * @since   1.0.0  *\/ public function register(Container $container): void { $container-&gt;set( MVCFactoryInterface::class, function (Container $container) { if (Factory::getApplication()-&gt;isClient('api')) { $factory = new ApiMVCFactory($this-&gt;namespace); } else { $factory = new \\Joomla\\Component\\Wishboxcdek\\Administrator\\MVC\\Factory\\MVCFactory($this-&gt;namespace); }  $factory-&gt;setFormFactory($container-&gt;get(FormFactoryInterface::class)); $factory-&gt;setDispatcher($container-&gt;get(DispatcherInterface::class)); $factory-&gt;setDatabase($container-&gt;get(DatabaseInterface::class)); $factory-&gt;setSiteRouter($container-&gt;get(SiteRouter::class)); $factory-&gt;setCacheControllerFactory($container-&gt;get(CacheControllerFactoryInterface::class)); $factory-&gt;setUserFactory($container-&gt;get(UserFactoryInterface::class)); $factory-&gt;setMailerFactory($container-&gt;get(MailerFactoryInterface::class)); $factory-&gt;setCdekClientV2($container-&gt;get(CdekClientV2Interface::class));  return $factory; } ); } } <\/code><\/pre>\n<p>\u0413\u043e\u0442\u043e\u0432\u043e! \u0422\u0435\u043f\u0435\u0440\u044c \u0432 \u043c\u043e\u0434\u0435\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043e\u0434 <code>$apiClient = $this-&gt;getCdekClientV2();<\/code>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/905258\/\"> https:\/\/habr.com\/ru\/articles\/905258\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0423 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0410\u041f\u0418 \u0421\u0434\u044d\u043a\u0430. \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0435\u0439 \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 <code>WishboxCdekSDK2\\CdekClientV2<\/code> \u0438 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434.<\/p>\n<pre><code class=\"php\">$apiClient = new CdekClientV2($account, $secure, $timeout); $apiClient-&gt;getCities();<\/code><\/pre>\n<p>\u0426\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0410\u041f\u0418-\u043a\u043b\u0438\u0435\u043d\u0442 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 \u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u0445 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"php\">$apiClient = $this-&gt;getCdekClientV2();<\/code><\/pre>\n<p>\u0438\u043b\u0438 \u0432 \u043b\u044e\u0431\u043e\u043c \u0434\u0440\u0443\u0433\u043e\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0438:<\/p>\n<pre><code class=\"php\">$apiClient = Joomla\\CMS\\Factory::getApplication()   -&gt;bootComponent('com_wishboxcdek')-&gt;getCdekClientV2(); $apiClient = Joomla\\CMS\\Factory::getApplication()   -&gt;bootPlugin('wishboxcdek', 'console')-&gt;getCdekClientV2();<\/code><\/pre>\n<p>\u0418 \u0432 \u044d\u0442\u043e\u043c \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0433\u0443\u0442 DI \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0439\u0434\u0451\u043c \u043e\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e.<\/p>\n<h3>\u0428\u0430\u0433 1: \u0442\u0440\u0435\u0439\u0442 WishboxCdekSDK2\\Trait\\CdekClientV2ServiceTrait<\/h3>\n<blockquote>\n<p><strong>\u0422\u0440\u0435\u0439\u0442<\/strong>\u00a0\u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b <code>getCdekClientV2<\/code> \u0438 <code>setCdekClientV2<\/code>.<\/p>\n<\/blockquote>\n<p><code>Root\/libraries\/wishboxcdek\/src\/Trait\/CdekClientV2ServiceTrait.php:<\/code><\/p>\n<pre><code class=\"php\">&lt;?php \/**  * @copyright   (c) 2013-2025 Nekrasov Vitaliy &lt;nekrasov_vitaliy@list.ru&gt;  * @license     GNU General Public License version 2 or later;  *\/ namespace WishboxCdekSDK2\\Trait;  use UnexpectedValueException; use WishboxCdekSDK2\\CdekClientV2; use WishboxCdekSDK2\\CdekClientV2Interface; use function defined;  \/\/ phpcs:disable PSR1.Files.SideEffects defined('_JEXEC') or die; \/\/ phpcs:enable PSR1.Files.SideEffects  \/**  * Defines the trait for the CdekClientV2 service class.  *  * @since  1.0.0  *\/ trait CdekClientV2ServiceTrait { \/**  * The API client.  *  * @var CdekClientV2|null  *  * @since 1.0.0  *\/ private ?CdekClientV2Interface $cdekClientV2 = null;  \/**  * Get the API client.  *  * @return  CdekClientV2Interface  *  * @since   1.0.0  *\/ public function getCdekClientV2(): CdekClientV2Interface { if (!$this-&gt;cdekClientV2) { throw new UnexpectedValueException('CdekClientV2 not set in ' . __CLASS__); }  return $this-&gt;cdekClientV2; }  \/**  * The API client.  *  * @param   CdekClientV2Interface  $cdekClientV2  CdekClientV2  *  * @return  void  *  * @since  1.0.0  *\/ public function setCdekClientV2(CdekClientV2Interface $cdekClientV2): void { $this-&gt;cdekClientV2 = $cdekClientV2; } } <\/code><\/pre>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u0435\u0433\u043e \u043a \u043a\u043b\u0430\u0441\u0441\u0430\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 <code>Root\/administrator\/components\/com_wishboxcdek\/src\/Extension\/WishboxcdekComponent.php<\/code> \u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 <code>Root\/plugins\/console\/wishboxcdek\/src\/Extension\/Wishboxcdek.php<\/code> .<\/p>\n<h3>\u0428\u0430\u0433 2: \u043a\u043b\u0430\u0441\u0441 \u0441\u0435\u0440\u0432\u0438\u0441-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 WishboxCdekSDK2\\Service\\ProviderCdekClientV2<\/h3>\n<blockquote>\n<p><strong>\u0421\u0435\u0440\u0432\u0438\u0441-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 <\/strong>\u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>Joomla\\DI\\ServiceProviderInterface<\/code>, \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 register \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0410\u041f\u0418-\u043a\u043b\u0438\u0435\u043d\u0442\u0430.  <\/p>\n<\/blockquote>\n<p>\u0412 \u043a\u0430\u0436\u0434\u043e\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 \u0438\u043b\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0435 \u0435\u0441\u0442\u044c \u0444\u0430\u0439\u043b <code>provider.php<\/code> \u0441 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>Joomla\\DI\\ServiceProviderInterface<\/code>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0434\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u0432\u0438\u0441-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u0432.<\/p>\n<p>\u0417\u043d\u0430\u0447\u0438\u0442 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0441\u0435\u0440\u0432\u0438\u0441-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <code>WishboxCdekSDK2\\CdekClientV2<\/code>.<\/p>\n<p>\u041f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 \u0441\u0435\u0440\u0432\u0438\u0441-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u044f\u0434\u0440\u0430 Joomla \u043d\u0430\u0437\u043e\u0432\u0451\u043c \u043a\u043b\u0430\u0441\u0441 \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u043a\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u2014  <code>WishboxCdekSDK2\\Service\\ProviderCdekClientV2<\/code>.<\/p>\n<p><code>Root\/libraries\/wishboxcdek\/src\/Service\/Provider\/CdekClientV2.php<\/code><\/p>\n<pre><code class=\"php\">&lt;?php \/**  * @copyright   (c) 2013-2025 Nekrasov Vitaliy &lt;nekrasov_vitaliy@list.ru&gt;  * @license     GNU General Public License version 2 or later  *\/ namespace WishboxCdekSDK2\\Service\\Provider;  use Joomla\\DI\\Container; use Joomla\\DI\\ServiceProviderInterface; use function defined;  \/\/ phpcs:disable PSR1.Files.SideEffects defined('_JEXEC') or die; \/\/ phpcs:enable PSR1.Files.SideEffects  \/**  * Service provider for the service MVC factory.  *  * @since  1.0.0  *\/ class CdekClientV2 implements ServiceProviderInterface { \/**  * \u0410\u043a\u043a\u0430\u0443\u043d\u0442 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438.  *  * @var string  *  * @since 1.0.0  *\/ private string $account;  \/**  * \u0421\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438.  *  * @var string  *  * @since 1.0.0  *\/ private string $secure;  \/**  * Timeout  *  * @var float|null  *  * @since 1.0.0  *\/ private ?float $timeout;  \/**  * @param   string       $account  Account  * @param   string|null  $secure   Secure  * @param   float|null   $timeout  Timeout  *  * @since   1.0.0  *\/ public function __construct(string $account, ?string $secure = null, ?float $timeout = 10.0) { $this-&gt;account = $account; $this-&gt;secure = $secure; $this-&gt;timeout = $timeout; }  \/**  * Registers the service provider with a DI container.  *  * @param   Container  $container  The DI container.  *  * @return  void  *  * @since   1.0.0  *  * @noinspection PhpUnusedParameterInspection  *\/ public function register(Container $container): void { $container-&gt;set( \\WishboxCdekSDK2\\CdekClientV2Interface::class, function (Container $container) { return new \\WishboxCdekSDK2\\CdekClientV2( $this-&gt;account, $this-&gt;secure, $this-&gt;timeout ); } ); } } <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u0432 \u0441\u0435\u0440\u0432\u0438\u0441-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 49-59 \u0438 71.<\/p>\n<p><code>Root\/administrator\/components\/com_wishboxcdek\/services\/provider.php<\/code><\/p>\n<pre><code class=\"php\">&lt;?php \/**  * @copyright   (c) 2013-2025 Nekrasov Vitaliy &lt;nekrasov_vitaliy@list.ru&gt;  * @license     GNU General Public License version 2 or later;  *\/  use Joomla\\CMS\\Component\\ComponentHelper; use Joomla\\CMS\\Component\\Router\\RouterFactoryInterface; use Joomla\\CMS\\Dispatcher\\ComponentDispatcherFactoryInterface; use Joomla\\CMS\\Extension\\ComponentInterface; use Joomla\\CMS\\Extension\\Service\\Provider\\ComponentDispatcherFactory; use Joomla\\CMS\\Extension\\Service\\Provider\\RouterFactory; use Joomla\\CMS\\HTML\\Registry; use Joomla\\CMS\\MVC\\Factory\\MVCFactoryInterface; use Joomla\\Component\\Wishboxcdek\\Administrator\\Extension\\WishboxcdekComponent; use Joomla\\Component\\Wishboxcdek\\Site\\CMS\\Extension\\Service\\Provider\\MVCFactory; use Joomla\\DI\\Container; use Joomla\\DI\\ServiceProviderInterface; use WishboxCdekSDK2\\Service\\Provider\\CdekClientV2;  \/\/ phpcs:disable PSR1.Files.SideEffects defined('_JEXEC') or die; \/\/ phpcs:enable PSR1.Files.SideEffects  \/**  * The Wishboxcdek service provider.  *  * @since  1.0.0  *\/ return new class implements ServiceProviderInterface { \/**  * Registers the service provider with a DI container.  *  * @param   Container  $container  The DI container.  *  * @return  void  *  * @since   1.0.0  *  * @noinspection PhpMissingReturnTypeInspection  *\/ public function register(Container $container) { $container-&gt;registerServiceProvider(new MVCFactory('\\\\Joomla\\\\Component\\\\Wishboxcdek')); $container-&gt;registerServiceProvider(new ComponentDispatcherFactory('\\\\Joomla\\\\Component\\\\Wishboxcdek')); $container-&gt;registerServiceProvider(new RouterFactory('\\\\Joomla\\\\Component\\\\Wishboxcdek'));          \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 $componentParams = ComponentHelper::getParams('com_wishboxcdek');          \/\/ \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u0441\u0435\u0440\u0432\u0438\u0441-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \u0410\u041f\u0418 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 $container-&gt;registerServiceProvider( new CdekClientV2( $componentParams-&gt;get('account', ''), $componentParams-&gt;get('secure', ''), 60.0 ) );  $container-&gt;set( ComponentInterface::class, function (Container $container) { $component = new WishboxcdekComponent($container-&gt;get(ComponentDispatcherFactoryInterface::class)); $component-&gt;setRegistry($container-&gt;get(Registry::class)); $component-&gt;setMVCFactory($container-&gt;get(MVCFactoryInterface::class)); $component-&gt;setRouterFactory($container-&gt;get(RouterFactoryInterface::class));                  \/\/ \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0410\u041f\u0418-\u043a\u043b\u0438\u0435\u043d\u0442 \u0432 \u043a\u043b\u0430\u0441\u0441 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430                 $component-&gt;setCdekClientV2($container-&gt;get(\\WishboxCdekSDK2\\CdekClientV2Interface::class));  return $component; } ); } }; <\/code><\/pre>\n<p>\u0418 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u0435 <code>Root\/plugins\/console\/wishboxcdek\/services\/provider.php<\/code>.<\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0410\u041f\u0418-\u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0443\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<pre><code class=\"php\">$apiClient = Joomla\\CMS\\Factory::getApplication()  -&gt;bootComponent('com_wishboxcdek')-&gt;getCdekClientV2();  $apiClient = Joomla\\CMS\\Factory::getApplication()  -&gt;bootPlugin('wishboxcdek', 'console')-&gt;getCdekClientV2();<\/code><\/pre>\n<p>\u041d\u043e \u043d\u0430\u0448\u0430 \u0446\u0435\u043b\u044c <code>$apiClient = $this-&gt;getCdekClientV2();<\/code> \u0432 \u043c\u043e\u0434\u0435\u043b\u044f\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.<\/p>\n<h4>\u0428\u0430\u0433 3: \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 WishboxCdekSDK2\\Interface\\CdekClientV2AwareInterface \u0438 \u0442\u0440\u0435\u0439\u0442 WishboxCdekSDK2\\TraitCdekClientV2AwareTrait<\/h4>\n<p>\u0422\u0430\u043a \u0436\u0435 \u043f\u043e\u0439\u0434\u0451\u043c \u043e\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e, \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0410\u041f\u0418-\u043a\u043b\u0438\u0435\u043d\u0442\u0430 <code>setCdekClientV2<\/code>.<\/p>\n<p><code>Root\/libraries\/wishboxcdek\/src\/Interface\/CdekClientV2AwareInterface.php<\/code><\/p>\n<pre><code class=\"php\">&lt;?php \/**  * @copyright   (c) 2013-2025 Nekrasov Vitaliy &lt;nekrasov_vitaliy@list.ru&gt;  * @license     GNU General Public License version 2 or later  *\/ namespace WishboxCdekSDK2\\Interface;  \/\/ phpcs:disable PSR1.Files.SideEffects use WishboxCdekSDK2\\CdekClientV2Interface; use function defined;  defined('_JEXEC') or die; \/\/ phpcs:enable PSR1.Files.SideEffects  \/**  * Interface to be implemented by classes depending on a form factory.  *  * @since  1.0.0  *\/ interface CdekClientV2AwareInterface { \/**  * Set the form factory to use.  *  * @param   CdekClientV2  $cdekClientV2  The API client to use.  *  * @return  CdekClientV2AwareInterface  This method is chainable.  *  * @since   1.0.0  *\/ public function setCdekClientV2(CdekClientV2Interface $cdekClientV2): CdekClientV2AwareInterface; } <\/code><\/pre>\n<p>\u0418 \u0442\u0440\u0435\u0439\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b <code>setCdekClientV2<\/code> \u0438 <code>getCdekClientV2<\/code>.<\/p>\n<p><code>Root\/libraries\/wishboxcdek\/src\/Trait\/CdekClientV2AwareTrait.php<\/code><\/p>\n<pre><code class=\"php\">&lt;?php \/**  * @copyright   (c) 2013-2025 Nekrasov Vitaliy &lt;nekrasov_vitaliy@list.ru&gt;  * @license     GNU General Public License version 2 or later;  *\/ namespace WishboxCdekSDK2\\Trait;  use UnexpectedValueException; use WishboxCdekSDK2\\CdekClientV2; use WishboxCdekSDK2\\Interface\\CdekClientV2AwareInterface; use function defined;  \/\/ phpcs:disable PSR1.Files.SideEffects defined('_JEXEC') or die; \/\/ phpcs:enable PSR1.Files.SideEffects  \/**  * Defines the trait for the CdekClientV2 service class.  *  * @since  1.0.0  *\/ trait CdekClientV2AwareTrait { \/**  * The API client.  *  * @var CdekClientV2|null  *  * @since 1.0.0  *\/ private ?CdekClientV2 $cdekClientV2 = null;  \/**  * Get the API client.  *  * @return  CdekClientV2  *  * @throws  UnexpectedValueException May be thrown if the factory has not been set.  *  * @since   1.0.0  *\/ public function getCdekClientV2(): CdekClientV2Interface { if (!$this-&gt;cdekClientV2) { throw new UnexpectedValueException('CdekClientV2 not set in ' .<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-457805","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/457805","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=457805"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/457805\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=457805"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=457805"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=457805"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}