为所有 DateTimeField 设置默认值 view_timezone

Set default view_timezone for all DateTimeField

在 EasyAdmin 3 / Symfony 5.2 后端,我有几个带有日期时间字段的 *CrudController classes,它们的配置如下:

public function configureFields(string $pageName): iterable
{
    return [
        // ...
        DateTimeField::new('createdAt')
            ->setTimezone($this->getUser()->getTimezone())
            ->setFormTypeOption('view_timezone', $this->getUser()->getTimezone()),
    ];
}

有没有办法将时区定义为默认时区,而不是为每个实体的每个日期时间字段复制粘贴相同的代码?

编辑:

我发现 setTimezone() 可以为 ConfigureCrud() 中的整个 *CrudController class 调用一次,这默认适用于所有字段:

class MyCrudController extends AbstractCrudController
{
    public function configureCrud(Crud $crud): Crud
    {
        return $crud->setTimezone($this->getUser()->getTimezone());
    }
}

实际上,它甚至可以在仪表板上设置为默认应用于所有 crud 控制器及其字段。

class DashboardController extends AbstractDashboardController
{
    public function configureCrud(): Crud
    {
        // Default config for all cruds in this controller. 
        // Only impact index and detail actions. 
        // For Forms, use ->setFormTypeOption('view_timezone', '...') 
        // on all fields
        return Crud::new()->setTimezone($this->getUser()->getTimezone());
    }
}

因此,DashboardController class 中的 configureCrud() 是索引和详细信息操作的最简单解决方案。

我仍然对每个领域的 avoir setFormTypeOption('view_timezone', '...') 类似解决方案感兴趣。

您可以做的一件事是创建一种方法来缩短您的代码。我做了一个特性来做到这一点,但它可以是你扩展的基础 class 中的方法,带有静态方法的 class 或类似的东西。请注意,如果您在控制器或仪表板级别设置 setTimezone(),这里的 setTimezone() 是可选的,但为了确保它们保持同步,我还是将其包含在此处。

<?php
// src/Helper/Admin/DateTimeFieldTrait.php
namespace App\Helper\Admin;

use App\Entity\User;
use EasyCorp\Bundle\EasyAdminBundle\Field\DateTimeField;

trait DateTimeFieldTrait
{
    protected function createDateTimeFieldForUser(string $propertyName, User $user): DateTimeField
    {
        return DateTimeField::new($propertyName)
            ->setTimezone($user->getTimezone())
            ->setFormTypeOption('view_timezone', $user->getTimezone())
            ;
    }
}

然后在您的代码中,您可以在需要的地方使用它。

//...
use DateTimeFieldTrait;
// ...

public function configureFields(string $pageName): iterable
{
    return [
        // ...
        $this->createDateTimeFieldForUser('createdAt', $this->getUser()),
    ];
}