У меня есть приложение 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");
}
Я пробую, но в symfony ничего не меняется, не знаю почему. Я пытаюсь изменить часовой пояс в: /etc/php/7.0/fpm/php.ini, /etc/php/7.0/cli/php.ini и /etc/php/7.0/fpm/php.ini и перезапустить apache, но в symfony дата и время не меняются.
Вы уверены, что редактируете правильный php.ini? Проверьте этот связанный вопрос: stackoverflow.com/questions/20743060/…
Я выполняю (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 / Tests / 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
где ваш php.ini можно показать свой маршрут до php.ini?
@ImanaliMamadiev Как я могу узнать, какой php.ini использует система? У меня есть три: /etc/php/7.0/apache2/php.ini /etc/php/7.0/cli/php.ini /etc/php/7.0/fpm/php.in
@Argoitzestebanezbarrado Самый простой способ: из любого действия контроллера просто вызвать phpinfo() и die после этого. Он должен вывести весь набор информации - и одна из них должна быть местоположением используемого php.ini ...
Спасибо @JovanPerovic, попробую.




<?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;
}
}
Вы знаете, сколько раз вы собираетесь вызывать эту функцию с этим решением?
Точно. Если вы сделаете это в загрузке, как и другой ответ, он будет выполнен только один раз. Тот же результат, меньше потерь ресурсов.
Ах, наверное, ты прав. но я сохраню свой ответ на тот случай, если загрузка не является жизнеспособным решением.
Если вы не можете установить его в 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.
Вы можете проверить в app / AppKernel.php, определен ли часовой пояс для всего вашего приложения Symfony /
Он будет превышать часовой пояс php conf по умолчанию
Почему бы просто не установить его в php.ini?