src/WebBundle/Controller/ExtendedController.php line 243

Open in your IDE?
  1. <?php
  2. namespace WebBundle\Controller;
  3. use Exception;
  4. use FlexApp\Service\ParametersGenerator;
  5. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  6. use Symfony\Component\HttpFoundation\JsonResponse;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpFoundation\Response;
  9. use Symfony\Component\HttpFoundation\Session\Session;
  10. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  11. use Symfony\Component\Security\Csrf\CsrfToken;
  12. use Symfony\Component\Security\Csrf\CsrfTokenManager;
  13. use WebBundle\Helper\App;
  14. use WebBundle\Helper\LocaleHelper;
  15. use WebBundle\Helper\RequestHelper;
  16. /*
  17.  * class: ExtendedController
  18.  * -----------------------------------------------------
  19.  * Класс для наследования, в нем реализованы базовые общие методы
  20.  * @package WebBundle\Controller
  21.  */
  22. class ExtendedController extends AbstractController
  23. {
  24.     /** @var $oSession */
  25.     private  $oSession;
  26.     /** @var $oRequest */
  27.     private $oRequest;
  28.     /** текущая локаль юзера */
  29.     private $sLocale;
  30.     /**
  31.      * ExtendedController constructor.
  32.      * @throws Exception
  33.      */
  34.     public function __construct()
  35.     {
  36.         if (RequestHelper::isAjax()) {
  37.             if (!$this->isValidToken()) {
  38.                 // тут должен быть abort операции
  39.                 return $this->error('Token не валиден');
  40.             }
  41.         }
  42.         return true;
  43.     }
  44.     public function render(string $view, array $parameters = [], Response $response null): Response
  45.     {
  46.         $response parent::render($view$parameters$response); // TODO: Change the autogenerated stub
  47.         $response->headers->set('Cache-Control','no-store');
  48.         return $response;
  49.     }
  50.     /**
  51.      * Отдача контента
  52.      * @param null $val
  53.      * @param bool $jsonOnly
  54.      * @return null|JsonResponse
  55.      */
  56.     protected function ok($val null$jsonOnly false)
  57.     {
  58.         if (RequestHelper::isAjax() or $jsonOnly) {
  59.             $res['content'] = $val;
  60.             $res['status'] = 'success';
  61.             $res = new JsonResponse($res);
  62.         } else {
  63.             if ($val instanceof Response) {
  64.                 $res $val;
  65.             } else {
  66.                 if (is_array($val)) {
  67.                     $res = new JsonResponse($val);
  68.                 } else {
  69.                     $res = new Response($val);
  70.                 }
  71.             }
  72.         }
  73.         return $res;
  74.     }
  75.     /**
  76.      * Отдача контента ОШИБКИ
  77.      * @param null $val
  78.      * @param int|string $code
  79.      * @param bool $jsonOnly
  80.      * @return null|JsonResponse
  81.      */
  82.     protected function error($val null$code 500$jsonOnly false)
  83.     {
  84.         if (RequestHelper::isAjax() or $jsonOnly) {
  85.             $res['content'] = $val;
  86.             $res['status'] = 'error';
  87.             $res = new JsonResponse($res);
  88.         } else {
  89.             switch ($code) {
  90.                 case 403:
  91.                     throw $this->createAccessDeniedException($val);
  92.                 case 404:
  93.                     throw $this->createNotFoundException($val);
  94.                 default:
  95.                     $res $val;
  96.             }
  97.         }
  98.         return $res;
  99.     }
  100.     /**
  101.      * Валидация по CSRF токену
  102.      * @param null $xCSRFToken
  103.      * @param null $xCSRFTokenKey
  104.      * @return bool
  105.      * @throws Exception
  106.      */
  107.     public function isValidToken($xCSRFToken null$xCSRFTokenKey null): bool
  108.     {
  109.         if (!is_object($this->container)) {
  110.             return true;//TODO Возможно стоит проверять валидность токена не в конструкторе контроллера, а в лиссенере по событию kernel.request: https://symfony.com/doc/current/reference/events.html#kernel-request
  111. //            throw new \Exception('$this->container не является объектом.');
  112.         }
  113.         /**  @var CsrfTokenManager $csrfManager */
  114.         $csrfManager $this->get('security.csrf.token_manager');
  115.         $xCSRFToken $xCSRFToken $xCSRFToken RequestHelper::getToken();
  116.         $xCSRFTokenKey $xCSRFTokenKey $xCSRFTokenKey $this->oSession()->getId();
  117.         if (!$xCSRFToken) {
  118.             //static::abort('Токен не найден', 403);
  119.             return false;
  120.         }
  121.         if (!$xCSRFTokenKey) {
  122.             //static::abort('ID сессии не найден', 403);
  123.             return false;
  124.         }
  125.         $oCsrfToken = new CsrfToken($xCSRFTokenKey$xCSRFToken);
  126.         if (!$csrfManager->isTokenValid($oCsrfToken)) {
  127.             //static::abort('Токен не валиден', 403);
  128.             return false;
  129.         }
  130.         return true;
  131.     }
  132.     /**
  133.      * Текущая локаль юзера
  134.      * @param bool $full
  135.      * @return string
  136.      */
  137.     public function getCurLocale($full false)
  138.     {
  139.         if (!$this->sLocale) {
  140.             $this->sLocale $this->oRequest()->getLocale() ? $this->oRequest()->getLocale() : LocaleHelper::getDefault();
  141.         }
  142.         return $full $this->sLocale explode('-'$this->sLocale)[0];
  143.     }
  144.     /**
  145.      * @return Request
  146.      */
  147.     protected function oRequest()
  148.     {
  149.         if (!$this->oRequest) {
  150.             $this->oRequest RequestHelper::syRequest();
  151.         }
  152.         return $this->oRequest;
  153.     }
  154.     /**
  155.      * @return Session
  156.      */
  157.     protected function oSession()
  158.     {
  159.         if (!$this->oSession) {
  160.             $this->oSession $this->get('session');
  161.         }
  162.         return $this->oSession;
  163.     }
  164. //    public function get($id)
  165. //    {
  166. //        // алтернативная реализация получения контейнера, используется прия AJAx запросах
  167. //        if (!$this->container) {
  168. //            $this->setContainer(WebBundle::getContainer());
  169. //        }
  170. //
  171. //        return $this->container->get($id);
  172. //    }
  173.     /**
  174.      * translator
  175.      * @param       $val
  176.      * @param array $parameters
  177.      * @param null $domain
  178.      * @param null $locale
  179.      * @return string
  180.      */
  181.     public function translate($val$locale null, array $parameters = [], $domain null): string
  182.     {
  183.         $oTtranslator $this->get('translator');
  184.         return $oTtranslator->trans($val$parameters$domain$locale);
  185.     }
  186.     /**
  187.      * Generates a URL from the given parameters.
  188.      * @param string $route The name of the route
  189.      * @param mixed $parameters An array of parameters
  190.      * @param int $referenceType The type of reference (one of the constants in UrlGeneratorInterface)
  191.      * @return string The generated URL
  192.      * @see UrlGeneratorInterface
  193.      */
  194. //    public function generateUrl(string $route, array $parameters = [], int $referenceType = UrlGeneratorInterface::ABSOLUTE_PATH): string
  195. //    {
  196. //        return urldecode($this->container->get('router')->generate($route, $parameters, $referenceType));
  197. //    }
  198.     /**
  199.      * Добавляет к initialState общие данные по header и footer блокам
  200.      * @param string $template
  201.      * @param array $params
  202.      * @return Response
  203.      * @throws Exception
  204.      */
  205.     public function renderReact(string $template$params = []): Response
  206.     {
  207.         /** @var ParametersGenerator $parametersGenerator */
  208.         $parametersGenerator App::getContainer()->get(ParametersGenerator::class);
  209.         $params $parametersGenerator->generate($params);
  210.         $oLeftService App::getContainer()->get('app.service.leftmenu');
  211.         $params['initialState']['liteMenu'] = $oLeftService->getDataMenuLite();
  212.         return $this->render($template$params);
  213.     }
  214. }