EC-CUBE /
ec-cube
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
| 1 | <?php |
||
| 2 | |||
| 3 | /* |
||
| 4 | * This file is part of EC-CUBE |
||
| 5 | * |
||
| 6 | * Copyright(c) LOCKON CO.,LTD. All Rights Reserved. |
||
| 7 | * |
||
| 8 | * http://www.lockon.co.jp/ |
||
| 9 | * |
||
| 10 | * For the full copyright and license information, please view the LICENSE |
||
| 11 | * file that was distributed with this source code. |
||
| 12 | */ |
||
| 13 | |||
| 14 | namespace Eccube; |
||
| 15 | |||
| 16 | use Doctrine\Bundle\DoctrineBundle\DependencyInjection\Compiler\DoctrineOrmMappingsPass; |
||
| 17 | use Eccube\Common\EccubeNav; |
||
| 18 | use Eccube\Common\EccubeTwigBlock; |
||
| 19 | use Eccube\DependencyInjection\Compiler\AutoConfigurationTagPass; |
||
| 20 | use Eccube\DependencyInjection\Compiler\NavCompilerPass; |
||
| 21 | use Eccube\DependencyInjection\Compiler\PaymentMethodPass; |
||
| 22 | use Eccube\DependencyInjection\Compiler\PluginPass; |
||
| 23 | use Eccube\DependencyInjection\Compiler\PurchaseFlowPass; |
||
| 24 | use Eccube\DependencyInjection\Compiler\QueryCustomizerPass; |
||
| 25 | use Eccube\DependencyInjection\Compiler\TemplateListenerPass; |
||
| 26 | use Eccube\DependencyInjection\Compiler\TwigBlockPass; |
||
| 27 | use Eccube\DependencyInjection\Compiler\TwigExtensionPass; |
||
| 28 | use Eccube\DependencyInjection\Compiler\WebServerDocumentRootPass; |
||
| 29 | use Eccube\DependencyInjection\EccubeExtension; |
||
| 30 | use Eccube\Doctrine\DBAL\Types\UTCDateTimeType; |
||
| 31 | use Eccube\Doctrine\DBAL\Types\UTCDateTimeTzType; |
||
| 32 | use Eccube\Doctrine\ORM\Mapping\Driver\AnnotationDriver; |
||
| 33 | use Eccube\Doctrine\Query\QueryCustomizer; |
||
| 34 | use Eccube\Service\Payment\PaymentMethodInterface; |
||
| 35 | use Eccube\Service\PurchaseFlow\DiscountProcessor; |
||
| 36 | use Eccube\Service\PurchaseFlow\ItemHolderPostValidator; |
||
| 37 | use Eccube\Service\PurchaseFlow\ItemHolderPreprocessor; |
||
| 38 | use Eccube\Service\PurchaseFlow\ItemHolderValidator; |
||
| 39 | use Eccube\Service\PurchaseFlow\ItemPreprocessor; |
||
| 40 | use Eccube\Service\PurchaseFlow\ItemValidator; |
||
| 41 | use Eccube\Service\PurchaseFlow\PurchaseProcessor; |
||
| 42 | use Eccube\Validator\EmailValidator\NoRFCEmailValidator; |
||
| 43 | use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait; |
||
| 44 | use Symfony\Component\Config\Loader\LoaderInterface; |
||
| 45 | use Symfony\Component\DependencyInjection\Compiler\PassConfig; |
||
| 46 | use Symfony\Component\DependencyInjection\ContainerBuilder; |
||
| 47 | use Symfony\Component\DependencyInjection\Definition; |
||
| 48 | use Symfony\Component\DependencyInjection\Reference; |
||
| 49 | use Symfony\Component\Finder\Finder; |
||
| 50 | use Symfony\Component\HttpKernel\Kernel as BaseKernel; |
||
| 51 | use Symfony\Component\Routing\RouteCollectionBuilder; |
||
| 52 | |||
| 53 | class Kernel extends BaseKernel |
||
| 54 | { |
||
| 55 | use MicroKernelTrait; |
||
| 56 | 1332 | ||
| 57 | const CONFIG_EXTS = '.{php,xml,yaml,yml}'; |
||
| 58 | 1332 | ||
| 59 | public function getCacheDir() |
||
| 60 | { |
||
| 61 | 13 | return $this->getProjectDir().'/var/cache/'.$this->environment; |
|
| 62 | } |
||
| 63 | 13 | ||
| 64 | public function getLogDir() |
||
| 65 | { |
||
| 66 | 1332 | return $this->getProjectDir().'/var/log'; |
|
| 67 | } |
||
| 68 | 1332 | ||
| 69 | 1332 | public function registerBundles() |
|
| 70 | 1332 | { |
|
| 71 | 1332 | $contents = require $this->getProjectDir().'/app/config/eccube/bundles.php'; |
|
| 72 | foreach ($contents as $class => $envs) { |
||
| 73 | if (isset($envs['all']) || isset($envs[$this->environment])) { |
||
| 74 | yield new $class(); |
||
| 75 | } |
||
| 76 | } |
||
| 77 | } |
||
| 78 | |||
| 79 | /** |
||
| 80 | * {@inheritdoc} |
||
| 81 | 1332 | * |
|
| 82 | * @see \Symfony\Component\HttpKernel\Kernel::boot() |
||
| 83 | */ |
||
| 84 | 1332 | public function boot() |
|
| 85 | { |
||
| 86 | 1332 | // Symfonyがsrc/Eccube/Entity以下を読み込む前にapp/proxy/entity以下をロードする |
|
| 87 | $this->loadEntityProxies(); |
||
| 88 | |||
| 89 | 1332 | parent::boot(); |
|
| 90 | 1332 | ||
| 91 | 1332 | // DateTime/DateTimeTzのタイムゾーンを設定. |
|
| 92 | UTCDateTimeType::setTimeZone($this->container->getParameter('timezone')); |
||
| 93 | UTCDateTimeTzType::setTimeZone($this->container->getParameter('timezone')); |
||
| 94 | 1332 | date_default_timezone_set($this->container->getParameter('timezone')); |
|
| 95 | 1332 | ||
| 96 | 1332 | // RFC違反のメールを送信できるよう独自のValidationを設定 |
|
| 97 | 1332 | // 初期値はRFC準拠として設定 |
|
| 98 | $rfcCheck = true; |
||
| 99 | 1332 | if ($this->container->hasParameter('eccube_rfc_email_check')) { |
|
|
0 ignored issues
–
show
|
|||
| 100 | $rfcCheck = $this->container->getParameter('eccube_rfc_email_check'); |
||
|
0 ignored issues
–
show
|
|||
| 101 | } |
||
| 102 | 1 | if (!$rfcCheck) { |
|
| 103 | // RFC違反のメールを許容する |
||
| 104 | 1 | \Swift::init(function () { |
|
| 105 | 1 | \Swift_DependencyContainer::getInstance() |
|
| 106 | 1 | ->register('email.validator') |
|
| 107 | 1 | ->asSharedInstanceOf(NoRFCEmailValidator::class); |
|
| 108 | }); |
||
| 109 | 1 | } |
|
| 110 | 1 | ||
| 111 | // Activate to $app |
||
| 112 | $app = Application::getInstance(['debug' => $this->isDebug()]); |
||
| 113 | 1 | $app->setParentContainer($this->container); |
|
| 114 | 1 | $app->initialize(); |
|
| 115 | $app->boot(); |
||
| 116 | |||
| 117 | 57 | $this->container->set('app', $app); |
|
| 118 | } |
||
| 119 | 57 | ||
| 120 | protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader) |
||
| 121 | 57 | { |
|
| 122 | 57 | $confDir = $this->getProjectDir().'/app/config/eccube'; |
|
| 123 | 57 | $loader->load($confDir.'/packages/*'.self::CONFIG_EXTS, 'glob'); |
|
| 124 | if (is_dir($confDir.'/packages/'.$this->environment)) { |
||
| 125 | 57 | $loader->load($confDir.'/packages/'.$this->environment.'/**/*'.self::CONFIG_EXTS, 'glob'); |
|
| 126 | 57 | } |
|
| 127 | 57 | $loader->load($confDir.'/services'.self::CONFIG_EXTS, 'glob'); |
|
| 128 | 57 | $loader->load($confDir.'/services_'.$this->environment.self::CONFIG_EXTS, 'glob'); |
|
| 129 | |||
| 130 | 57 | // プラグインのservices.phpをロードする. |
|
| 131 | $dir = dirname(__DIR__).'/../app/Plugin/*/Resource/config'; |
||
| 132 | $loader->load($dir.'/services'.self::CONFIG_EXTS, 'glob'); |
||
| 133 | } |
||
| 134 | 57 | ||
| 135 | 57 | protected function configureRoutes(RouteCollectionBuilder $routes) |
|
| 136 | 57 | { |
|
| 137 | 57 | $container = $this->getContainer(); |
|
| 138 | |||
| 139 | $forceSSL = $container->getParameter('eccube_force_ssl'); |
||
| 140 | 57 | $scheme = $forceSSL ? 'https' : 'http'; |
|
| 141 | 57 | $routes->setSchemes($scheme); |
|
| 142 | 57 | ||
| 143 | $confDir = $this->getProjectDir().'/app/config/eccube'; |
||
| 144 | if (is_dir($confDir.'/routes/')) { |
||
| 145 | $builder = $routes->import($confDir.'/routes/*'.self::CONFIG_EXTS, '/', 'glob'); |
||
| 146 | $builder->setSchemes($scheme); |
||
| 147 | } |
||
| 148 | if (is_dir($confDir.'/routes/'.$this->environment)) { |
||
| 149 | $builder = $routes->import($confDir.'/routes/'.$this->environment.'/**/*'.self::CONFIG_EXTS, '/', 'glob'); |
||
| 150 | $builder->setSchemes($scheme); |
||
| 151 | 1 | } |
|
| 152 | $builder = $routes->import($confDir.'/routes'.self::CONFIG_EXTS, '/', 'glob'); |
||
| 153 | 1 | $builder->setSchemes($scheme); |
|
| 154 | $builder = $routes->import($confDir.'/routes_'.$this->environment.self::CONFIG_EXTS, '/', 'glob'); |
||
| 155 | 1 | $builder->setSchemes($scheme); |
|
| 156 | |||
| 157 | // 有効なプラグインのルーティングをインポートする. |
||
| 158 | 1 | $plugins = $container->getParameter('eccube.plugins.enabled'); |
|
| 159 | $pluginDir = $this->getProjectDir().'/app/Plugin'; |
||
| 160 | foreach ($plugins as $plugin) { |
||
| 161 | $dir = $pluginDir.'/'.$plugin.'/Controller'; |
||
| 162 | if (file_exists($dir)) { |
||
| 163 | 1 | $builder = $routes->import($dir, '/', 'annotation'); |
|
| 164 | $builder->setSchemes($scheme); |
||
| 165 | } |
||
| 166 | 1 | } |
|
| 167 | } |
||
| 168 | 1 | ||
| 169 | protected function build(ContainerBuilder $container) |
||
| 170 | 1 | { |
|
| 171 | $this->addEntityExtensionPass($container); |
||
| 172 | |||
| 173 | $container->registerExtension(new EccubeExtension()); |
||
| 174 | 1 | ||
| 175 | // サービスタグの自動設定を行う |
||
| 176 | 1 | $container->addCompilerPass(new AutoConfigurationTagPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, 11); |
|
| 177 | 1 | ||
| 178 | 1 | // サービスタグの収集より先に実行し, 付与されているタグをクリアする. |
|
| 179 | // FormPassは優先度0で実行されているので, それより速いタイミングで実行させる. |
||
| 180 | // 自動登録されるタグやコンパイラパスの登録タイミングは, FrameworkExtension::load(), FrameworkBundle::build()を参考に. |
||
| 181 | 1 | $container->addCompilerPass(new PluginPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, 10); |
|
| 182 | 1 | ||
| 183 | 1 | // DocumentRootをルーティディレクトリに設定する. |
|
| 184 | $container->addCompilerPass(new WebServerDocumentRootPass('%kernel.project_dir%/')); |
||
| 185 | |||
| 186 | 1 | if ($this->environment !== 'install') { |
|
| 187 | 1 | // テンプレートフックポイントを動作させるように. |
|
| 188 | 1 | $container->addCompilerPass(new TemplateListenerPass()); |
|
| 189 | } |
||
| 190 | |||
| 191 | 1 | // twigのurl,path関数を差し替え |
|
| 192 | 1 | $container->addCompilerPass(new TwigExtensionPass()); |
|
| 193 | 1 | ||
| 194 | $container->register('app', Application::class) |
||
| 195 | ->setSynthetic(true) |
||
| 196 | 1 | ->setPublic(true); |
|
| 197 | 1 | ||
| 198 | 1 | // クエリカスタマイズの拡張. |
|
| 199 | $container->registerForAutoconfiguration(QueryCustomizer::class) |
||
| 200 | ->addTag(QueryCustomizerPass::QUERY_CUSTOMIZER_TAG); |
||
| 201 | 1 | $container->addCompilerPass(new QueryCustomizerPass()); |
|
| 202 | 1 | ||
| 203 | 1 | // 管理画面ナビの拡張 |
|
| 204 | 1 | $container->registerForAutoconfiguration(EccubeNav::class) |
|
| 205 | 1 | ->addTag(NavCompilerPass::NAV_TAG); |
|
| 206 | 1 | $container->addCompilerPass(new NavCompilerPass()); |
|
| 207 | 1 | ||
| 208 | 1 | // TwigBlockの拡張 |
|
| 209 | 1 | $container->registerForAutoconfiguration(EccubeTwigBlock::class) |
|
| 210 | 1 | ->addTag(TwigBlockPass::TWIG_BLOCK_TAG); |
|
| 211 | 1 | $container->addCompilerPass(new TwigBlockPass()); |
|
| 212 | |||
| 213 | // PaymentMethod の拡張 |
||
| 214 | 1 | $container->registerForAutoconfiguration(PaymentMethodInterface::class) |
|
| 215 | ->addTag(PaymentMethodPass::PAYMENT_METHOD_TAG); |
||
| 216 | 1 | $container->addCompilerPass(new PaymentMethodPass()); |
|
| 217 | |||
| 218 | // PurchaseFlow の拡張 |
||
| 219 | 1 | $container->registerForAutoconfiguration(ItemPreprocessor::class) |
|
| 220 | 1 | ->addTag(PurchaseFlowPass::ITEM_PREPROCESSOR_TAG); |
|
| 221 | 1 | $container->registerForAutoconfiguration(ItemValidator::class) |
|
| 222 | 1 | ->addTag(PurchaseFlowPass::ITEM_VALIDATOR_TAG); |
|
| 223 | 1 | $container->registerForAutoconfiguration(ItemHolderPreprocessor::class) |
|
| 224 | 1 | ->addTag(PurchaseFlowPass::ITEM_HOLDER_PREPROCESSOR_TAG); |
|
| 225 | $container->registerForAutoconfiguration(ItemHolderValidator::class) |
||
| 226 | ->addTag(PurchaseFlowPass::ITEM_HOLDER_VALIDATOR_TAG); |
||
| 227 | 1 | $container->registerForAutoconfiguration(ItemHolderPostValidator::class) |
|
| 228 | 1 | ->addTag(PurchaseFlowPass::ITEM_HOLDER_POST_VALIDATOR_TAG); |
|
| 229 | 1 | $container->registerForAutoconfiguration(DiscountProcessor::class) |
|
| 230 | ->addTag(PurchaseFlowPass::DISCOUNT_PROCESSOR_TAG); |
||
| 231 | $container->registerForAutoconfiguration(PurchaseProcessor::class) |
||
| 232 | ->addTag(PurchaseFlowPass::PURCHASE_PROCESSOR_TAG); |
||
| 233 | 1 | $container->addCompilerPass(new PurchaseFlowPass()); |
|
| 234 | 1 | } |
|
| 235 | 1 | ||
| 236 | 1 | protected function addEntityExtensionPass(ContainerBuilder $container) |
|
| 237 | 1 | { |
|
| 238 | 1 | $projectDir = $container->getParameter('kernel.project_dir'); |
|
| 239 | 1 | ||
| 240 | 1 | // Eccube |
|
| 241 | 1 | $paths = ['%kernel.project_dir%/src/Eccube/Entity']; |
|
| 242 | $namespaces = ['Eccube\\Entity']; |
||
| 243 | 1 | $reader = new Reference('annotation_reader'); |
|
| 244 | 1 | $driver = new Definition(AnnotationDriver::class, [$reader, $paths]); |
|
| 245 | 1 | $driver->addMethodCall('setTraitProxiesDirectory', [$projectDir.'/app/proxy/entity']); |
|
| 246 | 1 | $container->addCompilerPass(new DoctrineOrmMappingsPass($driver, $namespaces, [])); |
|
| 247 | 1 | ||
| 248 | // Customize |
||
| 249 | $container->addCompilerPass(DoctrineOrmMappingsPass::createAnnotationMappingDriver( |
||
| 250 | ['Customize\\Entity'], |
||
| 251 | ['%kernel.project_dir%/app/Customize/Entity'] |
||
| 252 | )); |
||
| 253 | 1332 | ||
| 254 | // Plugin |
||
| 255 | 1332 | $pluginDir = $projectDir.'/app/Plugin'; |
|
| 256 | $finder = (new Finder()) |
||
| 257 | ->in($pluginDir) |
||
| 258 | ->sortByName() |
||
| 259 | ->depth(0) |
||
| 260 | ->directories(); |
||
| 261 | $plugins = array_map(function ($dir) { |
||
| 262 | return $dir->getBaseName(); |
||
| 263 | }, iterator_to_array($finder)); |
||
| 264 | |||
| 265 | foreach ($plugins as $code) { |
||
| 266 | if (file_exists($pluginDir.'/'.$code.'/Entity')) { |
||
| 267 | $container->addCompilerPass(DoctrineOrmMappingsPass::createAnnotationMappingDriver( |
||
| 268 | ['Plugin\\'.$code.'\\Entity'], |
||
| 269 | ['%kernel.project_dir%/app/Plugin/'.$code.'/Entity'] |
||
| 270 | )); |
||
| 271 | } |
||
| 272 | } |
||
| 273 | } |
||
| 274 | |||
| 275 | protected function loadEntityProxies() |
||
| 276 | { |
||
| 277 | foreach (glob(__DIR__.'/../../app/proxy/entity/*.php') as $file) { |
||
| 278 | require_once $file; |
||
| 279 | } |
||
| 280 | } |
||
| 281 | } |
||
| 282 |
Methods can only be called on objects. This check looks for methods being called on variables that have been inferred to never be objects.