2

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

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

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

编辑:

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

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());
    }
}

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

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

4

1 回答 1

1

您可以做的一件事是创建一种方法来缩短您的代码。我做了一个 trait 来做到这一点,但它可以是您扩展的基类中的方法、具有静态方法的类或类似的东西。请注意,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()),
    ];
}
于 2021-03-29T02:50:14.493 回答