Completed
Push — master ( b3079a...082d3e )
by Ryo
29:47
created

Application::initSecurity()   B

Complexity

Conditions 3
Paths 2

Size

Total Lines 100
Code Lines 67

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 36
CRAP Score 3.1153

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 100
ccs 36
cts 47
cp 0.766
rs 8.2857
cc 3
eloc 67
nc 2
nop 0
crap 3.1153

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/*
3
 * This file is part of EC-CUBE
4
 *
5
 * Copyright(c) 2000-2015 LOCKON CO.,LTD. All Rights Reserved.
6
 *
7
 * http://www.lockon.co.jp/
8
 *
9
 * This program is free software; you can redistribute it and/or
10
 * modify it under the terms of the GNU General Public License
11
 * as published by the Free Software Foundation; either version 2
12
 * of the License, or (at your option) any later version.
13
 *
14
 * This program is distributed in the hope that it will be useful,
15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
 * GNU General Public License for more details.
18
 *
19
 * You should have received a copy of the GNU General Public License
20
 * along with this program; if not, write to the Free Software
21
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22
 */
23
24
namespace Eccube;
25
26
use Eccube\Application\ApplicationTrait;
27
use Eccube\Common\Constant;
28
use Eccube\Doctrine\ORM\Mapping\Driver\YamlDriver;
29
use Eccube\EventListener\TransactionListener;
30
use Symfony\Component\EventDispatcher\EventDispatcher;
31
use Symfony\Component\Finder\Finder;
32
use Symfony\Component\HttpFoundation\Request;
33
use Symfony\Component\HttpFoundation\Response;
34
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
35
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
36
use Symfony\Component\HttpKernel\Event\PostResponseEvent;
37
use Symfony\Component\HttpKernel\KernelEvents;
38
use Symfony\Component\Yaml\Yaml;
39
40
class Application extends ApplicationTrait
0 ignored issues
show
introduced by
Missing class doc comment
Loading history...
41
{
42
    protected static $instance;
43
44
    protected $initialized = false;
45
    protected $initializedPlugin = false;
46
    protected $testMode = false;
47
48 998
    public static function getInstance(array $values = array())
0 ignored issues
show
introduced by
Missing function doc comment
Loading history...
49
    {
50 998
        if (!is_object(self::$instance)) {
51 932
            self::$instance = new Application($values);
52
        }
53
54 998
        return self::$instance;
55
    }
56
57 933
    public static function clearInstance()
0 ignored issues
show
introduced by
Missing function doc comment
Loading history...
58
    {
59 933
        self::$instance = null;
60
    }
61
62
    final public function __clone()
0 ignored issues
show
introduced by
Missing function doc comment
Loading history...
63
    {
64
        throw new \Exception('Clone is not allowed against '.get_class($this));
65
    }
66
67 946
    public function __construct(array $values = array())
0 ignored issues
show
introduced by
Missing function doc comment
Loading history...
68
    {
69 946
        parent::__construct($values);
70
71 946
        if (is_null(self::$instance)) {
72 933
            self::$instance = $this;
73
        }
74
75
        // load config
76 946
        $this->initConfig();
77
78
        // init monolog
79 946
        $this->initLogger();
80
    }
81
82 946
    public function initConfig()
0 ignored issues
show
introduced by
Missing function doc comment
Loading history...
83
    {
84
        // load config
85
        $app = $this;
86 939
        $this['config'] = $this->share(function() use ($app) {
0 ignored issues
show
Coding Style introduced by
Expected 1 space after FUNCTION keyword; 0 found
Loading history...
87 939
            $configAll = array();
88
            $app->parseConfig('constant', $configAll)
89 939
                ->parseConfig('path', $configAll)
90 939
                ->parseConfig('config', $configAll)
91 939
                ->parseConfig('database', $configAll)
92 939
                ->parseConfig('mail', $configAll)
93
                ->parseConfig('log', $configAll)
94
                ->parseConfig('nav', $configAll, true)
95 939
                ->parseConfig('doctrine_cache', $configAll)
96 939
                ->parseConfig('http_cache', $configAll)
97 939
                ->parseConfig('session_handler', $configAll);
98 939
99
            return $configAll;
100
        });
101 939
    }
102 939
103 939
    public function initLogger()
0 ignored issues
show
introduced by
Missing function doc comment
Loading history...
104 939
    {
105
        $app = $this;
106
        $this->register(new ServiceProvider\EccubeMonologServiceProvider($app));
0 ignored issues
show
Unused Code introduced by
The call to EccubeMonologServiceProvider::__construct() has too many arguments starting with $app.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
107 939
        $this['monolog.logfile'] = __DIR__.'/../../app/log/site.log';
108 939
        $this['monolog.name'] = 'eccube';
109 939
    }
110
111
    public function initialize()
0 ignored issues
show
introduced by
Missing function doc comment
Loading history...
112
    {
113
        if ($this->initialized) {
114 939
            return;
115 939
        }
116 939
117 939
        // init locale
118
        $this->initLocale();
119
120 939
        // init session
121
        if (!$this->isSessionStarted()) {
122 939
            $this->initSession();
123 939
        }
124 939
125 939
        // init twig
126
        $this->initRendering();
127
128 939
        // init provider
129 939
        $this->register(new \Silex\Provider\HttpCacheServiceProvider(), array(
130 939
            'http_cache.cache_dir' => __DIR__.'/../../app/cache/http/',
131 939
        ));
132
        $this->register(new \Silex\Provider\HttpFragmentServiceProvider());
133 939
        $this->register(new \Silex\Provider\UrlGeneratorServiceProvider());
134
        $this->register(new \Silex\Provider\FormServiceProvider());
135 939
        $this->register(new \Silex\Provider\SerializerServiceProvider());
136 939
        $this->register(new \Eccube\ServiceProvider\ValidatorServiceProvider());
137 939
138
        $app = $this;
139
        $this->error(function (\Exception $e, $code) use ($app) {
140 939
            if ($app['debug']) {
141 939
                return;
142 939
            }
143 939
144
            switch ($code) {
145
                case 403:
146 939
                    $title = 'アクセスできません。';
147
                    $message = 'お探しのページはアクセスができない状況にあるか、移動もしくは削除された可能性があります。';
148 939
                    break;
149 939
                case 404:
150 939
                    $title = 'ページがみつかりません。';
151
                    $message = 'URLに間違いがないかご確認ください。';
152
                    break;
153 939
                default:
154 939
                    $title = 'システムエラーが発生しました。';
155 939
                    $message = '大変お手数ですが、サイト管理者までご連絡ください。';
156 939
                    break;
157
            }
158
159 939
            return $app->render('error.twig', array(
160
                'error_title' => $title,
161 939
                'error_message' => $message,
162 939
            ));
163 939
        });
164
165
        // init mailer
166 939
        $this->initMailer();
167 939
168 939
        // init doctrine orm
169 939
        $this->initDoctrine();
170
171
        // Set up the DBAL connection now to check for a proper connection to the database.
172 939
        $this->checkDatabaseConnection();
173
174 939
        // init security
175 946
        $this->initSecurity();
176
177
        // init ec-cube service provider
178 946
        $this->register(new ServiceProvider\EccubeServiceProvider());
179
180 946
        // mount controllers
181 946
        $this->register(new \Silex\Provider\ServiceControllerServiceProvider());
182 946
        $this->mount('', new ControllerProvider\FrontControllerProvider());
183 946
        $this->mount('/'.trim($this['config']['admin_route'], '/').'/', new ControllerProvider\AdminControllerProvider());
184
        Request::enableHttpMethodParameterOverride(); // PUTやDELETEできるようにする
185
186 936
        // add transaction listener
187
        $this['dispatcher']->addSubscriber(new TransactionListener($this));
188 936
189
        // init http cache
190
        $this->initCacheRequest();
191
192
        $this->initialized = true;
193 936
    }
194
195
    public function initLocale()
0 ignored issues
show
introduced by
Missing function doc comment
Loading history...
196 936
    {
197 936
198
        // timezone
199
        if (!empty($this['config']['timezone'])) {
200
            date_default_timezone_set($this['config']['timezone']);
201 936
        }
202
203
        $this->register(new \Silex\Provider\TranslationServiceProvider(), array(
204 936
            'locale' => $this['config']['locale'],
205 936
        ));
206 936
        $this['translator'] = $this->share($this->extend('translator', function ($translator, \Silex\Application $app) {
207 936
            $translator->addLoader('yaml', new \Symfony\Component\Translation\Loader\YamlFileLoader());
208 936
209
            $r = new \ReflectionClass('Symfony\Component\Validator\Validator');
210 936
            $file = dirname($r->getFilename()).'/Resources/translations/validators.'.$app['locale'].'.xlf';
211
            if (file_exists($file)) {
212 10
                $translator->addResource('xliff', $file, $app['locale'], 'validators');
213 10
            }
214
215
            $file = __DIR__.'/Resource/locale/validator.'.$app['locale'].'.yml';
216
            if (file_exists($file)) {
217
                $translator->addResource('yaml', $file, $app['locale'], 'validators');
218
            }
219
220
            $file = __DIR__.'/Resource/locale/message.'.$app['locale'].'.yml';
221
            if (file_exists($file)) {
222
                $translator->addResource('yaml', $file, $app['locale']);
223
            }
224
225
            return $translator;
226
        }));
227
    }
228
229
    public function initSession()
0 ignored issues
show
introduced by
Missing function doc comment
Loading history...
230
    {
231
        $this->register(new \Silex\Provider\SessionServiceProvider(), array(
232
            'session.storage.save_path' => $this['config']['root_dir'].'/app/cache/eccube/session',
233
            'session.storage.options' => array(
234
                'name' => 'eccube',
235 936
                'cookie_path' => $this['config']['root_urlpath'] ?: '/',
236
                'cookie_secure' => $this['config']['force_ssl'],
237
                'cookie_lifetime' => $this['config']['cookie_lifetime'],
238 936
                'cookie_httponly' => true,
239
                // cookie_domainは指定しない
240
                // http://blog.tokumaru.org/2011/10/cookiedomain.html
241 936
            ),
242
        ));
243
244 936
        $options = $this['config']['session_handler'];
245
246
        if ($options['enabled']) {
247 936
            // @see http://silex.sensiolabs.org/doc/providers/session.html#custom-session-configurations
248
            $this['session.storage.handler'] = null;
249
            ini_set('session.save_handler', $options['save_handler']);
250 936
            ini_set('session.save_path', $options['save_path']);
251
        }
252
    }
253 936
254 936
    public function initRendering()
0 ignored issues
show
introduced by
Missing function doc comment
Loading history...
255 936
    {
256 936
        $this->register(new \Silex\Provider\TwigServiceProvider(), array(
257
            'twig.form.templates' => array('Form/form_layout.twig'),
258
        ));
259 936
        $this['twig'] = $this->share($this->extend('twig', function (\Twig_Environment $twig, \Silex\Application $app) {
260
            $twig->addExtension(new \Eccube\Twig\Extension\EccubeExtension($app));
261 936
            $twig->addExtension(new \Twig_Extension_StringLoader());
262
263
            return $twig;
264 936
        }));
265
266
        $this->before(function (Request $request, \Silex\Application $app) {
267
            // フロント or 管理画面ごとにtwigの探索パスを切り替える.
268 936
            $app['twig'] = $app->share($app->extend('twig', function (\Twig_Environment $twig, \Silex\Application $app) {
269 936
                $paths = array();
270
271
                // 互換性がないのでprofiler とproduction 時のcacheを分離する
272 936
273 936
                $app['admin'] = false;
274
                $app['front'] = false;
275
276 605
                if (isset($app['profiler'])) {
277
                    $cacheBaseDir = __DIR__.'/../../app/cache/twig/profiler/';
278 605
                } else {
279 605
                    $cacheBaseDir = __DIR__.'/../../app/cache/twig/production/';
280 605
                }
281 605
                $pathinfo = rawurldecode($app['request']->getPathInfo());
282
                if (strpos($pathinfo, '/'.trim($app['config']['admin_route'], '/').'/') === 0) {
283
                    if (file_exists(__DIR__.'/../../app/template/admin')) {
284 605
                        $paths[] = __DIR__.'/../../app/template/admin';
285 605
                    }
286 605
                    $paths[] = $app['config']['template_admin_realdir'];
287
                    $paths[] = __DIR__.'/../../app/Plugin';
288
                    $cache = $cacheBaseDir.'admin';
289 605
                    $app['admin'] = true;
290 605
                } else {
291 605
                    if (file_exists($app['config']['template_realdir'])) {
292
                        $paths[] = $app['config']['template_realdir'];
293
                    }
294 605
                    $paths[] = $app['config']['template_default_realdir'];
295 936
                    $paths[] = __DIR__.'/../../app/Plugin';
296
                    $cache = $cacheBaseDir.$app['config']['template_code'];
297
                    $app['front'] = true;
298 936
                }
299
                $twig->setCache($cache);
300 936
                $app['twig.loader']->addLoader(new \Twig_Loader_Filesystem($paths));
301 936
302
                return $twig;
303 936
            }));
304 936
305 936
            // 管理画面のIP制限チェック.
306 936
            $pathinfo = rawurldecode($app['request']->getPathInfo());
307
            if (strpos($pathinfo, '/'.trim($app['config']['admin_route'], '/').'/') === 0) {
308
                // IP制限チェック
309
                $allowHost = $app['config']['admin_allow_host'];
310
                if (count($allowHost) > 0) {
311
                    if (array_search($app['request']->getClientIp(), $allowHost) === false) {
312
                        throw new \Exception();
313
                    }
314 936
                }
315
            }
316 936
        }, self::EARLY_EVENT);
317 936
318
        // twigのグローバル変数を定義.
319
        $app = $this;
320 364
        $this->on(\Symfony\Component\HttpKernel\KernelEvents::CONTROLLER, function (\Symfony\Component\HttpKernel\Event\FilterControllerEvent $event) use ($app) {
321 364
            // ショップ基本情報
322
            $BaseInfo = $app['eccube.repository.base_info']->get();
323 364
            $app['twig']->addGlobal('BaseInfo', $BaseInfo);
324 936
325
            $pathinfo = rawurldecode($app['request']->getPathInfo());
326
            if (strpos($pathinfo, '/'.trim($app['config']['admin_route'], '/').'/') === 0) {
327
                // 管理画面
328
                // 管理画面メニュー
329 351
                $menus = array('', '', '');
330
                $app['twig']->addGlobal('menus', $menus);
331
332
                $Member = $app->user();
333 351
                if (is_object($Member)) {
334 351
                    // ログインしていれば管理者のロールを取得
335
                    $AuthorityRoles = $app['eccube.repository.authority_role']->findBy(array('Authority' => $Member->getAuthority()));
336 351
337
                    $roles = array();
338
                    foreach ($AuthorityRoles as $AuthorityRole) {
339 351
                        // 管理画面でメニュー制御するため相対パス全てをセット
340
                        $roles[] = $app['request']->getBaseUrl().'/'.$app['config']['admin_route'].$AuthorityRole->getDenyUrl();
341 351
                    }
342 351
343 187
                    $app['twig']->addGlobal('AuthorityRoles', $roles);
344 187
                }
345
0 ignored issues
show
Coding Style introduced by
Blank line found at end of control structure
Loading history...
346 187
            } else {
347 187
                // フロント画面
348 187
                $request = $event->getRequest();
349 187
                $route = $request->attributes->get('_route');
350
351 165
                // ユーザ作成画面
352 165
                if ($route === trim($app['config']['user_data_route'])) {
353
                    $params = $request->attributes->get('_route_params');
354 165
                    $route = $params['route'];
355 165
                    // プレビュー画面
356 165
                } elseif ($request->get('preview')) {
357 165
                    $route = 'preview';
358
                }
359 351
360 351
                try {
361
                    $DeviceType = $app['eccube.repository.master.device_type']
362 351
                        ->find(\Eccube\Entity\Master\DeviceType::DEVICE_TYPE_PC);
363 353
                    $PageLayout = $app['eccube.repository.page_layout']->getByUrl($DeviceType, $route);
364
                } catch (\Doctrine\ORM\NoResultException $e) {
365
                    $PageLayout = $app['eccube.repository.page_layout']->newPageLayout($DeviceType);
366 353
                }
367 353
368
                $app['twig']->addGlobal('PageLayout', $PageLayout);
369 187
                $app['twig']->addGlobal('title', $PageLayout->getName());
370 187
            }
371
        });
372
    }
373
374
    public function initMailer()
0 ignored issues
show
introduced by
Missing function doc comment
Loading history...
375
    {
376 936
377
        // メール送信時の文字エンコード指定(デフォルトはUTF-8)
0 ignored issues
show
Unused Code Comprehensibility introduced by
43% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
378
        if (isset($this['config']['mail']['charset_iso_2022_jp']) && is_bool($this['config']['mail']['charset_iso_2022_jp'])) {
379 936
            if ($this['config']['mail']['charset_iso_2022_jp'] === true) {
380
                \Swift::init(function () {
381
                    \Swift_DependencyContainer::getInstance()
382 351
                        ->register('mime.qpheaderencoder')
383 351
                        ->asAliasOf('mime.base64headerencoder');
384
                    \Swift_Preferences::getInstance()->setCharset('iso-2022-jp');
385 351
                });
386 351
            }
387
        }
388
389 187
        $this->register(new \Silex\Provider\SwiftmailerServiceProvider());
390 187
        $this['swiftmailer.options'] = $this['config']['mail'];
391
392 187
        if (isset($this['config']['mail']['spool']) && is_bool($this['config']['mail']['spool'])) {
393 187
            $this['swiftmailer.use_spool'] = $this['config']['mail']['spool'];
394
        }
395 181
        // デフォルトはsmtpを使用
396
        $transport = $this['config']['mail']['transport'];
397 181
        if ($transport == 'sendmail') {
398 181
            $this['swiftmailer.transport'] = \Swift_SendmailTransport::newInstance();
399
        } elseif ($transport == 'mail') {
400 181
            $this['swiftmailer.transport'] = \Swift_MailTransport::newInstance();
401
        }
402
    }
403 187
404
    public function initDoctrine()
0 ignored issues
show
introduced by
Missing function doc comment
Loading history...
405
    {
406
        $this->register(new \Silex\Provider\DoctrineServiceProvider(), array(
0 ignored issues
show
introduced by
Add a comma after each item in a multi-line array
Loading history...
407
            'dbs.options' => array(
0 ignored issues
show
introduced by
Add a comma after each item in a multi-line array
Loading history...
408 165
                'default' => $this['config']['database']
409 165
            )));
0 ignored issues
show
Coding Style introduced by
This line of the multi-line function call does not seem to be indented correctly. Expected 8 spaces, but found 12.
Loading history...
410
        $this->register(new \Saxulum\DoctrineOrmManagerRegistry\Silex\Provider\DoctrineOrmManagerRegistryProvider());
411
412 165
        // プラグインのmetadata定義を合わせて行う.
413 2
        $pluginBasePath = __DIR__.'/../../app/Plugin';
414 2
        $finder = Finder::create()
415
            ->in($pluginBasePath)
416 163
            ->directories()
417
            ->depth(0);
418
419
        $ormMappings = array();
420
        $ormMappings[] = array(
421 165
            'type' => 'yml',
422 165
            'namespace' => 'Eccube\Entity',
423 165
            'path' => array(
424 135
                __DIR__.'/Resource/doctrine',
425 135
                __DIR__.'/Resource/doctrine/master',
426
            ),
427
        );
428 165
429 165
        foreach ($finder as $dir) {
0 ignored issues
show
Coding Style introduced by
Blank line found at start of control structure
Loading history...
430
431 936
            $file = $dir->getRealPath().'/config.yml';
432
433
            if (file_exists($file)) {
434 936
                $config = Yaml::parse(file_get_contents($file));
435
            } else {
436
                $code = $dir->getBaseName();
437
                $this['monolog']->warning("skip {$code} orm.path loading. config.yml not found.", array('path' => $file));
438 936
                continue;
439 936
            }
440
441
            // Doctrine Extend
442
            if (isset($config['orm.path']) && is_array($config['orm.path'])) {
443
                $paths = array();
444
                foreach ($config['orm.path'] as $path) {
445
                    $paths[] = $pluginBasePath.'/'.$config['code'].$path;
446
                }
447
                $ormMappings[] = array(
448
                    'type' => 'yml',
449 936
                    'namespace' => 'Plugin\\'.$config['code'].'\\Entity',
450 936
                    'path' => $paths,
451
                );
452 936
            }
453
        }
454
455
        $options = array(
0 ignored issues
show
introduced by
Add a comma after each item in a multi-line array
Loading history...
456 936
            'mappings' => $ormMappings
457 936
        );
458
459 936
        if (!$this['debug']) {
460
            $cacheDrivers = array();
461
            if (array_key_exists('doctrine_cache', $this['config'])) {
462
                $cacheDrivers = $this['config']['doctrine_cache'];
463
            }
464 936
465
            if (array_key_exists('metadata_cache', $cacheDrivers)) {
466 936
                $options['metadata_cache'] = $cacheDrivers['metadata_cache'];
467
            }
468 936
            if (array_key_exists('query_cache', $cacheDrivers)) {
469
                $options['query_cache'] = $cacheDrivers['query_cache'];
470 936
            }
471
            if (array_key_exists('result_cache', $cacheDrivers)) {
472
                $options['result_cache'] = $cacheDrivers['result_cache'];
473 936
            }
474 936
            if (array_key_exists('hydration_cache', $cacheDrivers)) {
475 936
                $options['hydration_cache'] = $cacheDrivers['hydration_cache'];
476 936
            }
477 936
        }
478
479 936
        $this->register(new \Dflydev\Silex\Provider\DoctrineOrm\DoctrineOrmServiceProvider(), array(
0 ignored issues
show
introduced by
Add a comma after each item in a multi-line array
Loading history...
480 936
            'orm.proxies_dir' => __DIR__.'/../../app/cache/doctrine/proxies',
481
            'orm.em.options' => $options
482
        ));
483
484
        /**
485
         * YamlDriverのPHP7対応. Doctrine2.4で修正されれば不要.
486
         * @see https://github.com/EC-CUBE/ec-cube/issues/1338
487
         */
488
        $config = $this['orm.em']->getConfiguration();
489 936
        /** @var $driver \Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain */
490
        $chain = $config->getMetadataDriverImpl();
491 139
        // $ormMappingsの1要素ごとにDriverが生成されている.
492
        $drivers = $chain->getDrivers();
493 139
        foreach ($drivers as $namespace => $oldDriver) {
494 139
            /** @var $newDriver \Eccube\Doctrine\ORM\Mapping\Driver\YamlDriver */
495
            $newDriver = new YamlDriver($oldDriver->getLocator());
496
            // 修正したDriverに差し替える. メソッド名はaddだけど実際はsetしてる.
497
            $chain->addDriver($newDriver, $namespace);
498
        }
499
    }
500
501
    public function initSecurity()
0 ignored issues
show
introduced by
Missing function doc comment
Loading history...
502 139
    {
503
        $this->register(new \Silex\Provider\SecurityServiceProvider());
504
        $this->register(new \Silex\Provider\RememberMeServiceProvider());
505
506
        $this['security.firewalls'] = array(
507
            'admin' => array(
508
                'pattern' => "^/{$this['config']['admin_route']}/",
509
                'form' => array(
510 936
                    'login_path' => "/{$this['config']['admin_route']}/login",
511
                    'check_path' => "/{$this['config']['admin_route']}/login_check",
512
                    'username_parameter' => 'login_id',
513
                    'password_parameter' => 'password',
514
                    'with_csrf' => true,
515
                    'use_forward' => true,
516 936
                ),
517
                'logout' => array(
518
                    'logout_path' => "/{$this['config']['admin_route']}/logout",
519 936
                    'target_url' => "/{$this['config']['admin_route']}/",
520 3
                ),
521 3
                'users' => $this['orm.em']->getRepository('Eccube\Entity\Member'),
522
                'anonymous' => true,
523
            ),
524 3
            'customer' => array(
525
                'pattern' => '^/',
526
                'form' => array(
527 3
                    'login_path' => '/mypage/login',
528
                    'check_path' => '/login_check',
529
                    'username_parameter' => 'login_email',
530 3
                    'password_parameter' => 'login_pass',
531
                    'with_csrf' => true,
532
                    'use_forward' => true,
533 3
                ),
534
                'logout' => array(
535
                    'logout_path' => '/logout',
536
                    'target_url' => '/',
537
                ),
538 936
                'remember_me' => array(
539 936
                    'key' => sha1($this['config']['auth_magic']),
540 936
                    'name' => 'eccube_rememberme',
541
                    // lifetimeはデフォルトの1年間にする
542
                    // 'lifetime' => $this['config']['cookie_lifetime'],
0 ignored issues
show
Unused Code Comprehensibility introduced by
77% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
543
                    'path' => $this['config']['root_urlpath'] ?: '/',
544 936
                    'secure' => $this['config']['force_ssl'],
545
                    'httponly' => true,
546 936
                    'always_remember_me' => false,
547 936
                    'remember_me_parameter' => 'login_memory',
548
                ),
549 936
                'users' => $this['orm.em']->getRepository('Eccube\Entity\Customer'),
550
                'anonymous' => true,
551 936
            ),
552
        );
553 936
554 936
        $this['security.access_rules'] = array(
555 936
            array("^/{$this['config']['admin_route']}/login", 'IS_AUTHENTICATED_ANONYMOUSLY'),
556 936
            array("^/{$this['config']['admin_route']}/", 'ROLE_ADMIN'),
557
            array('^/mypage/login', 'IS_AUTHENTICATED_ANONYMOUSLY'),
558
            array('^/mypage/withdraw_complete', 'IS_AUTHENTICATED_ANONYMOUSLY'),
559
            array('^/mypage/change', 'IS_AUTHENTICATED_FULLY'),
560
            array('^/mypage', 'ROLE_USER'),
561 936
        );
562 936
563
        $this['eccube.password_encoder'] = $this->share(function ($app) {
564 936
            return new \Eccube\Security\Core\Encoder\PasswordEncoder($app['config']);
565
        });
566 936
        $this['security.encoder_factory'] = $this->share(function ($app) {
567
            return new \Symfony\Component\Security\Core\Encoder\EncoderFactory(array(
568 936
                'Eccube\Entity\Customer' => $app['eccube.password_encoder'],
569
                'Eccube\Entity\Member' => $app['eccube.password_encoder'],
570
            ));
571
        });
572
        $this['eccube.event_listner.security'] = $this->share(function ($app) {
573
            return new \Eccube\EventListener\SecurityEventListener($app['orm.em']);
574
        });
575
        $this['user'] = function ($app) {
576
            $token = $app['security']->getToken();
577
578
            return ($token !== null) ? $token->getUser() : null;
579
        };
580
581
        // ログイン時のイベントを設定.
582 936
        $this['dispatcher']->addListener(\Symfony\Component\Security\Http\SecurityEvents::INTERACTIVE_LOGIN, array($this['eccube.event_listner.security'], 'onInteractiveLogin'));
583 936
584
        // Voterの設定
585
        $app = $this;
586 936
        $this['authority_voter'] = $this->share(function ($app) {
587 936
            return new \Eccube\Security\Voter\AuthorityVoter($app);
588
        });
589
590 936
        $app['security.voters'] = $app->extend('security.voters', function ($voters) use ($app) {
591
            $voters[] = $app['authority_voter'];
592 936
593
            return $voters;
594
        });
595
596
        $this['security.access_manager'] = $this->share(function ($app) {
597 936
            return new \Symfony\Component\Security\Core\Authorization\AccessDecisionManager($app['security.voters'], 'unanimous');
598 936
        });
599 936
600
    }
601
602
    public function initializePlugin()
0 ignored issues
show
introduced by
Missing function doc comment
Loading history...
603
    {
604
        if ($this->initializedPlugin) {
605
            return;
606
        }
607 936
608 936
        // setup event dispatcher
609
        $this->initPluginEventDispatcher();
610 936
611 936
        // load plugin
612 936
        $this->loadPlugin();
613
614 936
        $this->initializedPlugin = true;
615
    }
616 936
617 936
    public function initPluginEventDispatcher()
0 ignored issues
show
introduced by
Missing function doc comment
Loading history...
618
    {
619 256
        // EventDispatcher
620
        $this['eccube.event.dispatcher'] = $this->share(function () {
621 256
            return new EventDispatcher();
622
        });
623
624
        $app = $this;
625 936
626
        // hook point
627
        $this->on(KernelEvents::REQUEST, function (GetResponseEvent $event) use ($app) {
628 936
            if (!$event->isMasterRequest()) {
629
                return;
630 936
            }
631 936
            $hookpoint = 'eccube.event.app.before';
632
            $app['eccube.event.dispatcher']->dispatch($hookpoint, $event);
633
        }, self::EARLY_EVENT);
634 936
635 View Code Duplication
        $this->on(KernelEvents::REQUEST, function (GetResponseEvent $event) use ($app) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
636 936
            if (!$event->isMasterRequest()) {
637 936
                return;
638
            }
639
            $route = $event->getRequest()->attributes->get('_route');
640 936
            $hookpoint = "eccube.event.controller.$route.before";
641 936
            $app['eccube.event.dispatcher']->dispatch($hookpoint, $event);
642
        });
643
644 View Code Duplication
        $this->on(KernelEvents::RESPONSE, function (FilterResponseEvent $event) use ($app) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
645 936
            if (!$event->isMasterRequest()) {
646
                return;
647 936
            }
648
            $route = $event->getRequest()->attributes->get('_route');
649
            $hookpoint = "eccube.event.controller.$route.after";
650
            $app['eccube.event.dispatcher']->dispatch($hookpoint, $event);
651
        });
652 936
653
        $this->on(KernelEvents::RESPONSE, function (FilterResponseEvent $event) use ($app) {
654
            if (!$event->isMasterRequest()) {
655 936
                return;
656
            }
657 936
            $hookpoint = 'eccube.event.app.after';
658
            $app['eccube.event.dispatcher']->dispatch($hookpoint, $event);
659
        }, self::LATE_EVENT);
660 936
661
        $this->on(KernelEvents::TERMINATE, function (PostResponseEvent $event) use ($app) {
662
            $route = $event->getRequest()->attributes->get('_route');
663
            $hookpoint = "eccube.event.controller.$route.finish";
664 366
            $app['eccube.event.dispatcher']->dispatch($hookpoint, $event);
665 936
        });
666
667 936
        $this->on(\Symfony\Component\HttpKernel\KernelEvents::RESPONSE, function (\Symfony\Component\HttpKernel\Event\FilterResponseEvent $event) use ($app) {
668
            $route = $event->getRequest()->attributes->get('_route');
669
            $app['eccube.event.dispatcher']->dispatch('eccube.event.render.'.$route.'.before', $event);
670
        });
671 353
672 98
        // Request Event
673 View Code Duplication
        $this->on(\Symfony\Component\HttpKernel\KernelEvents::REQUEST, function (\Symfony\Component\HttpKernel\Event\GetResponseEvent $event) use ($app) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
674 353
675 353
            if (\Symfony\Component\HttpKernel\HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
676 936
                return;
677
            }
678
679 352
            $route = $event->getRequest()->attributes->get('_route');
680 98
681
            if (is_null($route)) {
682 350
                return;
683 350
            }
684 350
685 936
            $app['monolog']->debug('KernelEvents::REQUEST '.$route);
686
687
            // 全体
688 347
            $app['eccube.event.dispatcher']->dispatch('eccube.event.app.request', $event);
689 98
690
            if (strpos($route, 'admin') === 0) {
691 347
                // 管理画面
692 347
                $app['eccube.event.dispatcher']->dispatch('eccube.event.admin.request', $event);
693 347
            } else {
694 936
                // フロント画面
695
                $app['eccube.event.dispatcher']->dispatch('eccube.event.front.request', $event);
696
            }
697 347
698 98
            // ルーティング単位
699
            $app['eccube.event.dispatcher']->dispatch("eccube.event.route.{$route}.request", $event);
700 347
701 347
        }, 30); // Routing(32)が解決しし, 認証判定(8)が実行される前のタイミング.
0 ignored issues
show
Unused Code Comprehensibility introduced by
50% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
702 936
703
        // Controller Event
704 View Code Duplication
        $this->on(\Symfony\Component\HttpKernel\KernelEvents::CONTROLLER, function (\Symfony\Component\HttpKernel\Event\FilterControllerEvent $event) use ($app) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
705 347
706 347
            if (\Symfony\Component\HttpKernel\HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
707 347
                return;
708 936
            }
709
710
711 347
            $route = $event->getRequest()->attributes->get('_route');
712 347
713 936
            if (is_null($route)) {
714
                return;
715
            }
716
717
            $app['monolog']->debug('KernelEvents::CONTROLLER '.$route);
718 352
719 98
            // 全体
720
            $app['eccube.event.dispatcher']->dispatch('eccube.event.app.controller', $event);
721
722 352
            if (strpos($route, 'admin') === 0) {
723
                // 管理画面
724 352
                $app['eccube.event.dispatcher']->dispatch('eccube.event.admin.controller', $event);
725
            } else {
726
                // フロント画面
727
                $app['eccube.event.dispatcher']->dispatch('eccube.event.front.controller', $event);
728 352
            }
729
730
            // ルーティング単位
731 352
            $app['eccube.event.dispatcher']->dispatch("eccube.event.route.{$route}.controller", $event);
732
        });
733 352
734
        // Response Event
735 187 View Code Duplication
        $this->on(\Symfony\Component\HttpKernel\KernelEvents::RESPONSE, function (\Symfony\Component\HttpKernel\Event\FilterResponseEvent $event) use ($app) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
736
737
            if (\Symfony\Component\HttpKernel\HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
738 166
                return;
739
            }
740
741
            $route = $event->getRequest()->attributes->get('_route');
742 352
743
            if (is_null($route)) {
744 936
                return;
745
            }
746
747
            $app['monolog']->debug('KernelEvents::RESPONSE '.$route);
748
749 351
            // ルーティング単位
750 98
            $app['eccube.event.dispatcher']->dispatch("eccube.event.route.{$route}.response", $event);
751
752
            if (strpos($route, 'admin') === 0) {
753
                // 管理画面
754 349
                $app['eccube.event.dispatcher']->dispatch('eccube.event.admin.response', $event);
755
            } else {
756 349
                // フロント画面
757
                $app['eccube.event.dispatcher']->dispatch('eccube.event.front.response', $event);
758
            }
759
760 349
            // 全体
761
            $app['eccube.event.dispatcher']->dispatch('eccube.event.app.response', $event);
762
        });
763 349
764
        // Exception Event
765 349 View Code Duplication
        $this->on(\Symfony\Component\HttpKernel\KernelEvents::EXCEPTION, function (\Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent $event) use ($app) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
766
767 185
            if (\Symfony\Component\HttpKernel\HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
768
                return;
769
            }
770 165
771
            $route = $event->getRequest()->attributes->get('_route');
772
773
            if (is_null($route)) {
774 349
                return;
775 936
            }
776
777
            $app['monolog']->debug('KernelEvents::EXCEPTION '.$route);
778
779
            // ルーティング単位
780 347
            $app['eccube.event.dispatcher']->dispatch("eccube.event.route.{$route}.exception", $event);
781 98
782
            if (strpos($route, 'admin') === 0) {
783
                // 管理画面
784 347
                $app['eccube.event.dispatcher']->dispatch('eccube.event.admin.exception', $event);
785
            } else {
786 347
                // フロント画面
787 1
                $app['eccube.event.dispatcher']->dispatch('eccube.event.front.exception', $event);
788
            }
789
790 346
            // 全体
791
            $app['eccube.event.dispatcher']->dispatch('eccube.event.app.exception', $event);
792
        });
793 346
794
        // Terminate Event
795 346 View Code Duplication
        $this->on(\Symfony\Component\HttpKernel\KernelEvents::TERMINATE, function (\Symfony\Component\HttpKernel\Event\PostResponseEvent $event) use ($app) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
796
797 187
            $route = $event->getRequest()->attributes->get('_route');
798
799
            if (is_null($route)) {
800 160
                return;
801
            }
802
803
            $app['monolog']->debug('KernelEvents::TERMINATE '.$route);
804 346
805 936
            // ルーティング単位
806
            $app['eccube.event.dispatcher']->dispatch("eccube.event.route.{$route}.terminate", $event);
807
808
            if (strpos($route, 'admin') === 0) {
809
                // 管理画面
810 12
                $app['eccube.event.dispatcher']->dispatch('eccube.event.admin.terminate', $event);
811
            } else {
812
                // フロント画面
813
                $app['eccube.event.dispatcher']->dispatch('eccube.event.front.terminate', $event);
814 12
            }
815
816 12
            // 全体
817
            $app['eccube.event.dispatcher']->dispatch('eccube.event.app.terminate', $event);
818
        });
819
    }
820 12
821
    public function loadPlugin()
0 ignored issues
show
introduced by
Missing function doc comment
Loading history...
822
    {
823 12
        // プラグインディレクトリを探索.
824
        $basePath = __DIR__.'/../../app/Plugin';
825 12
        $finder = Finder::create()
826
            ->in($basePath)
827 2
            ->directories()
828
            ->depth(0);
829
830 10
        $finder->sortByName();
831
832
        // ハンドラ優先順位をdbから持ってきてハッシュテーブルを作成
833
        $priorities = array();
834 12
        $handlers = $this['orm.em']
835 936
            ->getRepository('Eccube\Entity\PluginEventHandler')
836
            ->getHandlers();
837
        foreach ($handlers as $handler) {
838
            if ($handler->getPlugin()->getEnable() && !$handler->getPlugin()->getDelFlg()) {
0 ignored issues
show
Coding Style introduced by
Blank line found at start of control structure
Loading history...
839
840 347
                $priority = $handler->getPriority();
841
            } else {
842 347
                // Pluginがdisable、削除済みの場合、EventHandlerのPriorityを全て0とみなす
843 1
                $priority = \Eccube\Entity\PluginEventHandler::EVENT_PRIORITY_DISABLED;
844
            }
845
            $priorities[$handler->getPlugin()->getClassName()][$handler->getEvent()][$handler->getHandler()] = $priority;
846 346
        }
847
848
        // プラグインをロードする.
849 346
        // config.yml/event.ymlの定義に沿ってインスタンスの生成を行い, イベント設定を行う.
850
        foreach ($finder as $dir) {
851 346
            //config.ymlのないディレクトリは無視する
852
            $path = $dir->getRealPath();
853 187
            $code = $dir->getBaseName();
854
            try {
855
                $this['eccube.service.plugin']->checkPluginArchiveContent($path);
856 160
            } catch (\Eccube\Exception\PluginException $e) {
857
                $this['monolog']->warning("skip {$code} config loading. config.yml not foud or invalid.", array(
0 ignored issues
show
introduced by
Add a comma after each item in a multi-line array
Loading history...
858
                    'path' => $path,
859
                    'original-message' => $e->getMessage()
860 346
                ));
861 936
                continue;
862
            }
863
            $config = $this['eccube.service.plugin']->readYml($dir->getRealPath().'/config.yml');
864 936
865
            $plugin = $this['orm.em']
866
                ->getRepository('Eccube\Entity\Plugin')
867 936
                ->findOneBy(array('code' => $config['code']));
868 936
869 936
            // const
870 936
            if (isset($config['const'])) {
871 936
                $this['config'] = $this->share($this->extend('config', function ($eccubeConfig) use ($config) {
872
                    $eccubeConfig[$config['code']] = array(
873 936
                        'const' => $config['const'],
874
                    );
875
876 936
                    return $eccubeConfig;
877 936
                }));
878 936
            }
879 936
880 936
            if ($plugin && $plugin->getEnable() == Constant::DISABLED) {
881
                // プラグインが無効化されていれば読み込まない
882
                continue;
883
            }
884
885
            // Type: Event
886
            if (isset($config['event'])) {
887
                $class = '\\Plugin\\'.$config['code'].'\\'.$config['event'];
888 936
                $eventExists = true;
889
890 View Code Duplication
                if (!class_exists($class)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
891
                    $this['monolog']->warning("skip {$code} loading. event class not foud.", array(
892
                        'class' => $class,
893 936
                    ));
894
                    $eventExists = false;
895 140
                }
896 140
897
                if ($eventExists && file_exists($dir->getRealPath().'/event.yml')) {
0 ignored issues
show
Coding Style introduced by
Blank line found at start of control structure
Loading history...
898 140
899
                    $subscriber = new $class($this);
900
901
                    foreach (Yaml::parse(file_get_contents($dir->getRealPath().'/event.yml')) as $event => $handlers) {
902
                        foreach ($handlers as $handler) {
903
                            if (!isset($priorities[$config['event']][$event][$handler[0]])) { // ハンドラテーブルに登録されていない(ソースにしか記述されていない)ハンドラは一番後ろにする
904
                                $priority = \Eccube\Entity\PluginEventHandler::EVENT_PRIORITY_LATEST;
905
                            } else {
906 140
                                $priority = $priorities[$config['event']][$event][$handler[0]];
907
                            }
908 140
                            // 優先度が0のプラグインは登録しない
909 140
                            if (\Eccube\Entity\PluginEventHandler::EVENT_PRIORITY_DISABLED != $priority) {
910 140
                                $this['eccube.event.dispatcher']->addListener($event, array($subscriber, $handler[0]), $priority);
911
                            }
912
                        }
913 140
                    }
914 1
                }
915 1
            }
916 1
            // Type: ServiceProvider
917
            if (isset($config['service'])) {
918
                foreach ($config['service'] as $service) {
919 1
                    $class = '\\Plugin\\'.$config['code'].'\\ServiceProvider\\'.$service;
920 1 View Code Duplication
                    if (!class_exists($class)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
921
                        $this['monolog']->warning("skip {$code} loading. service provider class not foud.", array(
922
                            'class' => $class,
923 140
                        ));
924
                        continue;
925 1
                    }
926
                    $this->register(new $class($this));
927
                }
928
            }
929 139
        }
930 139
    }
931 139
932
    /**
933 139
     * PHPUnit を実行中かどうかを設定する.
934
     *
935
     * @param boolean $testMode PHPUnit を実行中の場合 true
936
     */
937
    public function setTestMode($testMode)
938
    {
939
        $this->testMode = $testMode;
940 139
    }
941
942 139
    /**
943
     * PHPUnit を実行中かどうか.
944 139
     *
945 139
     * @return boolean PHPUnit を実行中の場合 true
946 139
     */
947 139
    public function isTestMode()
948
    {
949
        return $this->testMode;
950
    }
951
952 139
    /**
953 139
     *
954
     * データベースの接続を確認
955
     * 成功 : trueを返却
956
     * 失敗 : \Doctrine\DBAL\DBALExceptionエラーが発生( 接続に失敗した場合 )、エラー画面を表示しdie()
957
     * 備考 : app['debug']がtrueの際は処理を行わない
958
     *
959
     * @return boolean true
960 139
     *
961
     */
962
    protected function checkDatabaseConnection()
963
    {
964
        if ($this['debug']) {
965
            return;
966
        }
967
        try {
968
            $this['db']->connect();
969 936
        } catch (\Doctrine\DBAL\DBALException $e) {
970
            $this['monolog']->error($e->getMessage());
971
            $this['twig.path'] = array(__DIR__.'/Resource/template/exception');
972
            $html = $this['twig']->render('error.twig', array(
973
                'error_title' => 'データーベース接続エラー',
974
                'error_message' => 'データーベースを確認してください',
975
            ));
976
            $response = new Response();
977
            $response->setContent($html);
978
            $response->setStatusCode('500');
979
            $response->headers->set('Content-Type', 'text/html');
980 923
            $response->send();
981 923
            die();
0 ignored issues
show
Coding Style Compatibility introduced by
The method checkDatabaseConnection() contains an exit expression.

An exit expression should only be used in rare cases. For example, if you write a short command line script.

In most cases however, using an exit expression makes the code untestable and often causes incompatibilities with other libraries. Thus, unless you are absolutely sure it is required here, we recommend to refactor your code to avoid its usage.

Loading history...
982
        }
983
984
        return true;
985
    }
986
987
    /**
988
     * Config ファイルをパースし、連想配列を返します.
989 353
     *
990
     * $config_name.yml ファイルをパースし、連想配列を返します.
991 353
     * $config_name.php が存在する場合は、 PHP ファイルに記述された連想配列を使用します。
992
     *
993
     * @param string $config_name Config 名称
0 ignored issues
show
introduced by
Expected 2 spaces after parameter type; 1 found
Loading history...
994
     * @param array $configAll Config の連想配列
0 ignored issues
show
introduced by
Expected 3 spaces after parameter type; 1 found
Loading history...
introduced by
Expected 3 spaces after parameter name; 1 found
Loading history...
995
     * @param boolean $wrap_key Config の連想配列に config_name のキーを生成する場合 true, デフォルト false
0 ignored issues
show
introduced by
Expected 4 spaces after parameter name; 1 found
Loading history...
996
     * @param string $ymlPath config yaml を格納したディレクトリ
0 ignored issues
show
introduced by
Expected 2 spaces after parameter type; 1 found
Loading history...
introduced by
Expected 5 spaces after parameter name; 1 found
Loading history...
997
     * @param string $distPath config yaml dist を格納したディレクトリ
0 ignored issues
show
introduced by
Expected 2 spaces after parameter type; 1 found
Loading history...
introduced by
Expected 4 spaces after parameter name; 1 found
Loading history...
998
     * @return Application
999
     */
1000
    public function parseConfig($config_name, array &$configAll, $wrap_key = false, $ymlPath = null, $distPath = null)
0 ignored issues
show
introduced by
Declare public methods first, then protected ones and finally private ones
Loading history...
1001
    {
1002
        $ymlPath = $ymlPath ? $ymlPath : __DIR__.'/../../app/config/eccube';
1003 936
        $distPath = $distPath ? $distPath : __DIR__.'/../../src/Eccube/Resource/config';
1004
        $config = array();
1005 936
        $config_php = $ymlPath.'/'.$config_name.'.php';
1006 933
        if (!file_exists($config_php)) {
1007
            $config_yml = $ymlPath.'/'.$config_name.'.yml';
1008
            if (file_exists($config_yml)) {
1009 3
                $config = Yaml::parse(file_get_contents($config_yml));
1010
                $config = empty($config) ? array() : $config;
1011 View Code Duplication
                if (isset($this['output_config_php']) && $this['output_config_php']) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1012
                    file_put_contents($config_php, sprintf('<?php return %s', var_export($config, true)).';');
1013
                }
1014
            }
1015
        } else {
1016
            $config = require $config_php;
1017
        }
1018
1019
        $config_dist = array();
1020
        $config_php_dist = $distPath.'/'.$config_name.'.dist.php';
1021
        if (!file_exists($config_php_dist)) {
1022
            $config_yml_dist = $distPath.'/'.$config_name.'.yml.dist';
1023
            if (file_exists($config_yml_dist)) {
1024 3
                $config_dist = Yaml::parse(file_get_contents($config_yml_dist));
1025 View Code Duplication
                if (isset($this['output_config_php']) && $this['output_config_php']) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1026
                    file_put_contents($config_php_dist, sprintf('<?php return %s', var_export($config_dist, true)).';');
1027
                }
1028
            }
1029
        } else {
1030
            $config_dist = require $config_php_dist;
1031
        }
1032
1033 936
        if ($wrap_key) {
1034
            $configAll = array_replace_recursive($configAll, array($config_name => $config_dist), array($config_name => $config));
1035 936
        } else {
1036 936
            $configAll = array_replace_recursive($configAll, $config_dist, $config);
1037 936
        }
1038
1039
        return $this;
1040
    }
1041
1042
    /**
1043
     * セッションが開始されているかどうか.
1044
     *
1045
     * @return boolean セッションが開始済みの場合 true
1046
     * @link http://php.net/manual/ja/function.session-status.php#113468
1047
     */
1048
    protected function isSessionStarted()
1049
    {
1050
        if (php_sapi_name() !== 'cli') {
1051
            if (version_compare(phpversion(), '5.4.0', '>=')) {
1052
                return session_status() === PHP_SESSION_ACTIVE ? true : false;
1053
            } else {
1054
                return session_id() === '' ? false : true;
1055
            }
1056
        }
1057
1058
        return false;
1059
    }
1060
1061
    /**
1062
     * Http Cache対応
1063
     */
1064
    protected function initCacheRequest()
1065
    {
1066
        // httpキャッシュが無効の場合はイベント設定を行わない.
1067
        if (!$this['config']['http_cache']['enabled']) {
1068
            return;
1069
        }
1070
1071
        $app = $this;
1072
1073
        // Response Event(http cache対応、event実行は一番遅く設定)
1074
        $this->on(\Symfony\Component\HttpKernel\KernelEvents::RESPONSE, function (\Symfony\Component\HttpKernel\Event\FilterResponseEvent $event) use ($app) {
1075
1076
            $request = $event->getRequest();
1077
            $response = $event->getResponse();
1078
1079
            $route = $request->attributes->get('_route');
1080
1081
            $etag = md5($response->getContent());
1082
1083
            if (strpos($route, 'admin') === 0) {
1084
                // 管理画面
1085
1086
                // 管理画面ではコンテンツの中身が変更された時点でキャッシュを更新し、キャッシュの適用範囲はprivateに設定
1087
                $response->setCache(array(
1088
                    'etag' => $etag,
1089
                    'private' => true,
1090
                ));
1091
1092
                if ($response->isNotModified($request)) {
1093
                    return $response;
1094
                }
1095
0 ignored issues
show
Coding Style introduced by
Blank line found at end of control structure
Loading history...
1096
            } else {
1097
                // フロント画面
1098
                $cacheRoute = $app['config']['http_cache']['route'];
1099
1100
                if (in_array($route, $cacheRoute) === true) {
1101
                    // キャッシュ対象となる画面lが含まれていた場合、キャッシュ化
1102
                    // max-ageを設定しているためExpiresは不要
1103
                    // Last-Modifiedだと比較する項目がないためETagで対応
1104
                    // max-ageを設定していた場合、contentの中身が変更されても変更されない
1105
1106
                    $age = $app['config']['http_cache']['age'];
1107
1108
                    $response->setCache(array(
1109
                        'etag' => $etag,
1110
                        'max_age' => $age,
1111
                        's_maxage' => $age,
1112
                        'public' => true,
1113
                    ));
1114
1115
                    if ($response->isNotModified($request)) {
1116
                        return $response;
1117
                    }
1118
                }
1119
            }
1120
1121
        }, -1024);
1122
    }
1123
}
1124