【问题标题】:FOSUserBundle not working ValidationFOSUserBundle 不工作验证
【发布时间】:2018-08-06 21:10:26
【问题描述】:

我将 symfony 3.3 和 php 7.0 与 FOSUserBundle 版本 2.1.1 一起使用,我刚刚意识到,如果您只是在设置器参数中添加类型提示,例如在用户实体中...验证将失败.

<?php
namespace AppBundle\Entity;

use ...;

/**
 * @ORM\Entity
 * @ORM\Table(name="`user`")
 */
class User extends BaseUser
{
    /**
     * @Assert\NotBlank()
     * @var string
     * @ORM\Column(type="string", nullable=false)
     */
    private $firstName;

   /**
    * @return string
    */
    public function getFirstName()
    {
        return $this->firstName;
    }
    /**
    * @param string $firstName
    */
    public function setFirstName(string $firstName) <- IF YOU ADD THIS STRING AS THE PARAMETER THE VALIDATION FAILS
    {
        $this->firstName = $firstName;
    }
}

所以最后一行应该是这样的:

public function setFirstName($firstName)

如果有人知道如何在不给验证带来问题的情况下添加类型提示,那就太好了。

【问题讨论】:

    标签: symfony validation fosuserbundle type-hinting


    【解决方案1】:

    这是 Symfony Validator 默认的工作方式:它首先设置值(例如null),然后执行验证,而不是其他方式。因为你的方法不接受null 值,只接受字符串:

    public function setFirstName(string $firstName)
    

    很可能,您遇到了错误Exception: Argument 1 passed to setFirstName() must be of the type string, null given

    要克服这个问题,您必须将相应字段的空数据设​​置为''detach your entities from the form component。或者您可以强制方法接受空值:

    // php 7
    public function setFirstName(string $firstName = null)
    {
        $this->firstName = (string) $firstName;
    }
    
    // >= php7.1
    public function setFirstName(?string $firstName)
    

    我敦促您停止将实体与表单和验证器混在一起。您的核心域应该没有这些低级问题(参见SOLID 中的SRP)。另外,从你的二传手的表情来看,我可以告诉你正在走向名为 Anemic Domain Model 的反模式。

    【讨论】:

      【解决方案2】:

      如果您想使用验证功能,显然 FOSUserBundle 目前不允许 typehint。

      【讨论】:

        【解决方案3】:

        你在 User 类中的方法 setFirstName() 必须兼容 FOSUserBundle/Model/UserInterface->setFirstName($username)

        接口没有typehint,所以你不能在你的方法中添加typehint...

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-10
          • 1970-01-01
          相关资源
          最近更新 更多