Как я могу установить часовой пояс в Symfony 3?

У меня есть приложение Symfony 3, развернутое на сервере Ubuntu 14.04.

Когда я выполняю "Дата" в командном окне, сервер отвечает мне «Пт, 11 мая, 10:02:30 CEST 2018», но когда я сбрасываю дату и время в twig как "{{дамп (" сейчас "| дата)}}", ответ будет «11 мая 2018 г. 04:04».

Если я вставлю заголовок функции контроллера (маршрута), "date_default_timezone_set (" Европа / Мадрид ");", он будет работать нормально, но я не хочу копировать эту строку во всех функциях всех контроллеров.

Затем я хочу знать, где я могу установить часовой пояс в качестве конфигурации Symfony или где я могу установить эту команду PHP (date_default_timezone_set («Европа / Мадрид»)) глобально для всех контроллеров.

Спасибо

[РЕДАКТИРОВАТЬ]

Одним из решений может быть размещение этого кода в заголовке контроллера, но я хочу установить его только во всех контроллерах, службах и т. д.:

public function __construct(){
    date_default_timezone_set("Europe/Madrid");
}

Почему бы просто не установить его в php.ini?

Iwan Wijaya 11.05.2018 10:32

Я пробую, но в symfony ничего не меняется, не знаю почему. Я пытаюсь изменить часовой пояс в: /etc/php/7.0/fpm/php.ini, /etc/php/7.0/cli/php.ini и /etc/php/7.0/fpm/php.ini и перезапустить apache, но в symfony дата и время не меняются.

Argoitz 11.05.2018 10:39

Вы уверены, что редактируете правильный php.ini? Проверьте этот связанный вопрос: stackoverflow.com/questions/20743060/…

fxbt 11.05.2018 10:42

Я выполняю (find / -name "php.ini"), и только эти файлы существуют в / etc: /etc/php/7.0/apache2/php.ini /etc/php/7.0/cli/php.ini / etc / php /7.0/fpm/php.ini У меня есть другие в каталоге поставщиков symfony: /var/www/html_back/vendor/doctrine/cache/tests/travis/php.in‌ i / var / www / html_back / vendor / doctrine / doctrine-cache-bundle / Tes‌ts / travis / php.ini /var/www/html/vendor/doctrine/cache/tests/travis/php.ini / var / www / html / vendor / doctrine / doctrine-cache -bundle / Tests / tr‌ avis / php.ini /var/www/html/vendor/vendor/doctrine/cache/tests/travis/php.‌ ini

Argoitz 11.05.2018 10:49

где ваш php.ini можно показать свой маршрут до php.ini?

Imanali Mamadiev 11.05.2018 11:01

@ImanaliMamadiev Как я могу узнать, какой php.ini использует система? У меня есть три: /etc/php/7.0/apache2/php.ini /etc/php/7.0/cli/php.ini /etc/php/7.0/fpm/php.in

Argoitz 11.05.2018 11:49

@Argoitzestebanezbarrado Самый простой способ: из любого действия контроллера просто вызвать phpinfo() и die после этого. Он должен вывести весь набор информации - и одна из них должна быть местоположением используемого php.ini ...

Jovan Perovic 11.05.2018 15:39

Спасибо @JovanPerovic, попробую.

Argoitz 14.05.2018 12:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
9
8
12 946
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

<?php

namespace App\EventSubscriber;

use App\Manager\EventManager;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Twig\Environment;
use Twig\Extension\CoreExtension;

/**
 * Class TimeZoneListener
 *
 * @package App\EventListener
 */
class TimeZoneSubscriber implements EventSubscriberInterface
{
    /** @var Environment */
    private $environment;

    /** @var EventManager */
    private $manager;

    /** @var string */
    private $timezone;

    /**
     * TimeZoneListener constructor.
     *
     * @param Environment  $environment
     * @param EventManager $manager
     * @param string       $timezone
     */
    public function __construct(Environment $environment, EventManager $manager, string $timezone)
    {
        $this->environment = $environment;
        $this->manager     = $manager;
        $this->timezone    = $timezone;
    }

    /**
     * @return array|null
     */
    public static function getSubscribedEvents(): ?array
    {
        return [
            KernelEvents::CONTROLLER => 'setTimeZone',
        ];
    }

    public function setTimeZone(FilterControllerEvent $filterControllerEvent)
    {
        if (!$this->environment instanceof Environment) {
            return;
        }

        // decide correct timezone either default or event defined
        $event    = $this->manager->getActiveEvent();
        $timezone = null === $event ? $this->timezone : $event->getTimezone();

        /**
         * set twig default time zone
         *
         * @var CoreExtension $core
         */
        $core = $this->environment->getExtension('Twig_Extension_Core');
        $core->setTimezone($timezone);

        return $this->environment;
    }
}

Вы знаете, сколько раз вы собираетесь вызывать эту функцию с этим решением?

Jimbo 25.06.2020 20:10

Точно. Если вы сделаете это в загрузке, как и другой ответ, он будет выполнен только один раз. Тот же результат, меньше потерь ресурсов.

Jimbo 26.06.2020 20:43

Ах, наверное, ты прав. но я сохраню свой ответ на тот случай, если загрузка не является жизнеспособным решением.

HelpNeeder 26.06.2020 21:07
Ответ принят как подходящий

Если вы не можете установить его в php.ini или хотите убедиться, что значение согласовано независимо от целевой среды, самый простой способ - установить его в AppBundle:

class AppBundle extends Bundle
{
    public function boot()
    {
        parent::boot();
        date_default_timezone_set("Europe/Madrid");
    }
}

В качестве альтернативы, если у вас нет AppBundle (или любого другого собственного пакета), вы можете добавить его в метод AppKernel::registerBundles() прямо перед загрузкой пакетов.

Спасибо! В Symfony 4 я решил эту проблему, добавив указанную строку в Kernel.php в методе registerBundles.

cezar 07.08.2019 09:56

Вы можете проверить в app / AppKernel.php, определен ли часовой пояс для всего вашего приложения Symfony /

Он будет превышать часовой пояс php conf по умолчанию

Другие вопросы по теме