You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							188 lines
						
					
					
						
							7.2 KiB
						
					
					
				
			
		
		
	
	
							188 lines
						
					
					
						
							7.2 KiB
						
					
					
				<?php | 
						|
 | 
						|
namespace common\bootstrap; | 
						|
 | 
						|
//use Elasticsearch\Client; | 
						|
//use Elasticsearch\ClientBuilder; | 
						|
//use core\components\modules\ModuleInterface; | 
						|
use common\modules\languages\entities\Language; | 
						|
use core\entities\ModuleRecord; | 
						|
 | 
						|
//use League\Flysystem\Adapter\Ftp; | 
						|
//use League\Flysystem\Filesystem; | 
						|
use common\modules\shop\cart\ShopCart; | 
						|
use common\modules\shop\cart\cost\calculator\DynamicCost; | 
						|
use common\modules\shop\cart\cost\calculator\SimpleCost; | 
						|
use common\modules\shop\cart\storage\HybridStorage; | 
						|
use core\dispatchers\AsyncEventDispatcher; | 
						|
use core\dispatchers\DeferredEventDispatcher; | 
						|
use core\dispatchers\EventDispatcher; | 
						|
use core\dispatchers\SimpleEventDispatcher; | 
						|
 | 
						|
//use core\entities\behaviors\FlySystemImageUploadBehavior; | 
						|
//use shop\entities\Shop\Product\events\ProductAppearedInStock; | 
						|
use core\jobs\AsyncEventJobHandler; | 
						|
use core\listeners\user\UserSignupConfirmedListener; | 
						|
use core\listeners\user\UserSignupRequestedListener; | 
						|
 | 
						|
//use shop\repositories\events\EntityPersisted; | 
						|
//use shop\repositories\events\EntityRemoved; | 
						|
use core\services\newsletter\FakeSubscribe; | 
						|
use core\services\newsletter\MailChimp; | 
						|
use core\services\newsletter\Newsletter; | 
						|
 | 
						|
//use shop\services\sms\LoggedSender; | 
						|
//use shop\services\sms\SmsRu; | 
						|
//use shop\services\sms\SmsSender; | 
						|
//use shop\services\yandex\ShopInfo; | 
						|
//use shop\services\yandex\YandexMarket; | 
						|
use core\events\user\UserSignUpConfirmed; | 
						|
use core\events\user\UserSignUpRequested; | 
						|
use core\services\ContactService; | 
						|
use yii\base\BootstrapInterface; | 
						|
use yii\base\ErrorHandler; | 
						|
use yii\caching\Cache; | 
						|
use yii\di\Container; | 
						|
use yii\di\Instance; | 
						|
use yii\helpers\ArrayHelper; | 
						|
use yii\mail\MailerInterface; | 
						|
use yii\rbac\ManagerInterface; | 
						|
use yii\queue\Queue; | 
						|
use Yii; | 
						|
 | 
						|
class SetUp implements BootstrapInterface | 
						|
{ | 
						|
    public function bootstrap($app): void | 
						|
    { | 
						|
        $container = \Yii::$container; | 
						|
 | 
						|
        /*$container->setSingleton(Client::class, function () { | 
						|
            return ClientBuilder::create()->build(); | 
						|
        });*/ | 
						|
 | 
						|
        $container->setSingleton(MailerInterface::class, function () use ($app) { | 
						|
            return $app->mailer; | 
						|
        }); | 
						|
 | 
						|
        $container->setSingleton(ErrorHandler::class, function () use ($app) { | 
						|
            return $app->errorHandler; | 
						|
        }); | 
						|
 | 
						|
        $container->setSingleton(Queue::class, function () use ($app) { | 
						|
            return $app->get('queue'); | 
						|
        }); | 
						|
 | 
						|
        $container->setSingleton(Cache::class, function () use ($app) { | 
						|
            return $app->cache; | 
						|
        }); | 
						|
 | 
						|
        $container->setSingleton(ManagerInterface::class, function () use ($app) { | 
						|
            return $app->authManager; | 
						|
        }); | 
						|
 | 
						|
        $container->setSingleton(ContactService::class, [], [ | 
						|
            $app->params['adminEmail'] | 
						|
        ]); | 
						|
 | 
						|
        $container->setSingleton(ShopCart::class, function () use ($app) { | 
						|
            return new ShopCart( | 
						|
                new HybridStorage($app->get('user'), 'cart', 3600 * 24, $app->db), | 
						|
                new DynamicCost(new SimpleCost()) | 
						|
            ); | 
						|
        }); | 
						|
/* | 
						|
        $container->setSingleton(YandexMarket::class, [], [ | 
						|
            new ShopInfo($app->name, $app->name, $app->params['frontendHostInfo']), | 
						|
        ]);*/ | 
						|
 | 
						|
        $container->setSingleton(Newsletter::class, function () use ($app) { | 
						|
            //return new MailChimp( | 
						|
            //    new \DrewM\MailChimp\MailChimp($app->params['mailChimpKey']), | 
						|
            //    $app->params['mailChimpListId'] | 
						|
            //); | 
						|
            return new FakeSubscribe(); | 
						|
        }); | 
						|
 | 
						|
        /*$container->setSingleton(SmsSender::class, function () use ($app) { | 
						|
            return new LoggedSender( | 
						|
                new SmsRu($app->params['smsRuKey']), | 
						|
                \Yii::getLogger() | 
						|
            ); | 
						|
        });*/ | 
						|
 | 
						|
        $container->setSingleton(EventDispatcher::class, DeferredEventDispatcher::class); | 
						|
 | 
						|
        $container->setSingleton(DeferredEventDispatcher::class, function (Container $container) { | 
						|
            return new DeferredEventDispatcher(new AsyncEventDispatcher($container->get(Queue::class))); | 
						|
        }); | 
						|
 | 
						|
        $container->setSingleton(SimpleEventDispatcher::class, function (Container $container) { | 
						|
            return new SimpleEventDispatcher($container, [ | 
						|
                UserSignUpRequested::class => [UserSignupRequestedListener::class], | 
						|
                UserSignUpConfirmed::class => [UserSignupConfirmedListener::class], | 
						|
                //ProductAppearedInStock::class => [ProductAppearedInStockListener::class], | 
						|
                //EntityPersisted::class => [ | 
						|
                //    ProductSearchPersistListener::class, | 
						|
                //    CategoryPersistenceListener::class, | 
						|
                //], | 
						|
                //EntityRemoved::class => [ | 
						|
                //    ProductSearchRemoveListener::class, | 
						|
                //    CategoryPersistenceListener::class, | 
						|
                //], | 
						|
            ]); | 
						|
        }); | 
						|
 | 
						|
        $container->setSingleton(AsyncEventJobHandler::class, [], [ | 
						|
            Instance::of(SimpleEventDispatcher::class) | 
						|
        ]); | 
						|
 | 
						|
        /* | 
						|
        $container->setSingleton(Filesystem::class, function () use ($app) { | 
						|
            return new Filesystem(new Ftp($app->params['ftp'])); | 
						|
        }); | 
						|
 | 
						|
        $container->set(ImageUploadBehavior::class, FlySystemImageUploadBehavior::class); | 
						|
        */ | 
						|
 | 
						|
        // Set frontend languages | 
						|
        if (\Yii::$app->moduleManager->isTableExist('{{%languages}}') && file_exists(Yii::getAlias('@common/modules/languages/LanguagesModule.php'))) { | 
						|
            $language                                = Language::find()->active()->default()->one(); | 
						|
            Yii::$app->params['defaultLanguage']     = $language ? $language->name : 'ru'; | 
						|
            Yii::$app->params['translatedLanguages'] = ArrayHelper::map(Language::find()->active()->all(), 'name', 'title'); | 
						|
        } else { | 
						|
            Yii::$app->params['defaultLanguage']     = 'ru'; | 
						|
            Yii::$app->params['translatedLanguages'] = ['ru']; | 
						|
        } | 
						|
 | 
						|
        // Set backend languages | 
						|
        if (basename($app->getBasePath()) === 'backend') { | 
						|
            $app->language                   = !$app->user->isGuest && $app->user->identity->user->backend_language ? $app->user->identity->user->backend_language : Yii::$app->params['defaultLanguage']; | 
						|
            $app->params['frontendLanguage'] = Yii::$app->session->get('frontendLanguage', Yii::$app->params['defaultLanguage']); | 
						|
        } | 
						|
 | 
						|
        // Connect common modules | 
						|
        if (\Yii::$app->moduleManager->isTableExist('{{%modules}}')) { | 
						|
            $modules = ModuleRecord::find()->andWhere(['type' => 'common'])->andWhere(['active' => 1])->all(); | 
						|
            foreach ($modules as $module) { | 
						|
                Yii::$app->setModule($module->name, [ | 
						|
                    'class' => $module->class, | 
						|
                ]); | 
						|
                Yii::$app->getModule($module->name)->bootstrap(Yii::$app); | 
						|
            } | 
						|
        } else { // connect all existing modules | 
						|
            $this->connectExistingModules(); | 
						|
        } | 
						|
    } | 
						|
 | 
						|
    private function connectExistingModules(): void | 
						|
    { | 
						|
        $modules = Yii::$app->moduleManager->getLocalModules(); | 
						|
        //print_r($modules); die; | 
						|
        foreach ($modules as $module) { | 
						|
            Yii::$app->setModule($module['name'], [ | 
						|
                'class' => 'common\modules\\' . $module['name'] . '\\' . $module['module'], | 
						|
            ]); | 
						|
            Yii::$app->getModule($module['name'])->bootstrap(Yii::$app); | 
						|
        } | 
						|
    } | 
						|
}
 | 
						|
 |