PHP更新5.6.26到5.6.27之后的TransformationFailedException

时间:2016-10-21 23:35:01

标签: php symfony

共享主机上的应用程序现在产生

  

... datefmt_create:没有这样的时区:' America / Los_Angeles'

用户尝试访问带有日期字段的表单时出现

错误。完整的信息是:

  

未捕获的PHP异常   Symfony的\分量\表格\异常\ TransformationFailedException:   "无法转换属性路径的值" contactDate":   datefmt_create:没有这样的时区:' America / Los_Angeles':   U_ILLEGAL_ARGUMENT_ERROR"在   /www3.projectmana.org/vendor/symfony/symfony/src/Symfony/Component/Form/Form.php   第1149行

几周内网站没有其他变化。

phpinfo()的默认时区为America/Los_Angeles

对此有任何合理的解释/解决方法吗?在同一台服务器上有一个站点的沙箱,它会演示相同的错误。我的开发PHP 7系统上没有出现错误。

编辑:

我用(测试的)3.1.5取代了Symfony 2.8安装 - 类似的行为。现在错误:

  

发生错误!未捕获的PHP异常   Symfony的\分量\ OptionsResolver \异常\ InvalidOptionsException:   " datefmt_create:没有这样的时区:' America / Los_Angeles':   U_ILLEGAL_ARGUMENT_ERROR"在   /www3.projectmana.org/vendor/symfony/symfony/src/Symfony/Component/Form/Extension/Core/Type/DateType.php   第88行

使用以下简化代码:

控制器:

/**
 * @Route("/datecheck")
 */
public function dateCheckAction()
{
    $form = $this->createFormBuilder($task)
        ->add('dueDate', DateType::class)
        ->add('save', SubmitType::class, array('label' => 'Create Task'))
        ->getForm();

    return $this->render('Default/datecheck.html.twig', [
        'form' => $form,
    ]);
}

模板:

{{ form(form) }}

编辑#2:

当我查看应用程序的错误而不是上面的简单代码时,我看到:

  

发生错误!未捕获的PHP异常   Symfony的\分量\表格\异常\ TransformationFailedException:   "无法转换属性路径的值" contactDate":   datefmt_create:没有这样的时区:' America / Los_Angeles':   U_ILLEGAL_ARGUMENT_ERROR"在   /www3.projectmana.org/vendor/symfony/symfony/src/Symfony/Component/Form/Form.php   第1095行

围绕该行的Form.php代码:

try {
    foreach ($this->config->getViewTransformers() as $transformer) {
        $value = $transformer->transform($value);
    }
} catch (TransformationFailedException $exception) {
    throw new TransformationFailedException(
        'Unable to transform value for property path "'.$this->getPropertyPath().'": '.$exception->getMessage(),
        $exception->getCode(),
        $exception
    );
}

var_dump($transformer)的结果包含在“例外”中

object(Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToLocalizedStringTransformer)#1128 (6) { ["dateFormat":"Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToLocalizedStringTransformer":private]=> int(2) ["timeFormat":"Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToLocalizedStringTransformer":private]=> int(-1) ["pattern":"Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToLocalizedStringTransformer":private]=> string(5) "M/d/y" ["calendar":"Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToLocalizedStringTransformer":private]=> int(1) ["inputTimezone":protected]=> string(19) "America/Los_Angeles" 

不确定如何处理此信息。

2 个答案:

答案 0 :(得分:0)

您可以尝试PHP DateTimeZone::listIdentifiers() help page中的示例1A吗?

<?php
$timezone_identifiers = DateTimeZone::listIdentifiers();
foreach ($timezone_identifiers as $id) {
    echo "$id\n";
}
?>

这将输出所有时区......如果你的时区在列表中,那么它就是其他的。

答案 1 :(得分:0)

解决方案但尚未回答共享主机的网站管理员要弄清楚为什么IntlDateFormatter返回null。当主机运行时

<?php
$fmt = new IntlDateFormatter('en', null, null);

echo 'timezone_id of the formatter is : ' . $fmt->getTimezoneId();

回复是

  

致命错误:在null

上调用成员函数getTimezoneId()

什么时候应该

  

格式化程序的timezone_id是:America / Los_Angeles

网站管理员已经重新编译了PECL-intl和ICU,但它似乎没有改变任何东西。