src/Eccube/Twig/Extension/IgnoreTwigSandboxErrorExtension.php line 56

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of EC-CUBE
  4.  *
  5.  * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
  6.  *
  7.  * http://www.ec-cube.co.jp/
  8.  *
  9.  * For the full copyright and license information, please view the LICENSE
  10.  * file that was distributed with this source code.
  11.  */
  12. namespace Eccube\Twig\Extension;
  13. use Twig\Environment;
  14. use Twig\Error\LoaderError;
  15. use Twig\Extension\AbstractExtension;
  16. use Twig\Extension\SandboxExtension;
  17. use Twig\Sandbox\SecurityError;
  18. use Twig\TwigFunction;
  19. /**
  20.  * \vendor\twig\twig\src\Extension\CoreExtension の拡張
  21.  */
  22. class IgnoreTwigSandboxErrorExtension extends AbstractExtension
  23. {
  24.     /**
  25.      * {@inheritdoc}
  26.      */
  27.     public function getFunctions(): array
  28.     {
  29.         return [
  30.             new TwigFunction('include', [$this'twig_include'], ['needs_environment' => true'needs_context' => true'is_safe' => ['all']]),
  31.         ];
  32.     }
  33.     /**
  34.      * twig sandboxの例外を操作します
  35.      * app_env = devの場合、エラーを表示する
  36.      * app_env = prodの場合、エラーを表示しない
  37.      *
  38.      * @param Environment $env
  39.      * @param $context
  40.      * @param $template
  41.      * @param $variables
  42.      * @param $withContext
  43.      * @param $ignoreMissing
  44.      * @param $sandboxed
  45.      *
  46.      * @return string|void
  47.      *
  48.      * @throws LoaderError
  49.      * @throws SecurityError
  50.      */
  51.     public function twig_include(Environment $env$context$template$variables = [], $withContext true$ignoreMissing false$sandboxed false)
  52.     {
  53.         try {
  54.             return \twig_include($env$context$template$variables$withContext$ignoreMissing$sandboxed);
  55.         } catch (SecurityError $e) {
  56.             // devではエラー画面が表示されるようにする
  57.             $appEnv env('APP_ENV');
  58.             if ($appEnv === 'dev') {
  59.                 throw $e;
  60.             } else {
  61.                 // ログ出力
  62.                 log_warning($e->getMessage(), ['exception' => $e]);
  63.                 // 例外がスローされた場合、sandboxが効いた状態になってしまうため追加
  64.                 $sandbox $env->getExtension(SandboxExtension::class);
  65.                 if (!$sandbox->isSandboxedGlobally()) {
  66.                     $sandbox->disableSandbox();
  67.                 }
  68.             }
  69.         }
  70.     }
  71. }