【问题标题】:ZF2: Validate collection field based on parent fieldset elementZF2:根据父字段集元素验证集合字段
【发布时间】:2013-10-18 13:00:21
【问题描述】:

我正在尝试验证 Collection 中的字段。

集合指的是公司区域并与公司字段集相关联

验证需要检查数据库中该公司的区域名称是否不存在。

我正在尝试在我的集合元素“area_name”中使用回调验证器来执行此操作,我的问题是集合只知道它自己的上下文,这意味着所有与区域相关联但不知道公司的字段上下文,所以我不能按公司父级过滤我的验证器。

有没有办法访问集合的父上下文?还是我需要在验证之前初始化我的表单,将 Company 对象传递给 Collection?

编辑:我忘了提到我正在使用 Doctrine2,所以我不确定是否可以使用与 ZF2 捆绑的 Db_NoRecordExists 验证器

【问题讨论】:

  • 你尝试过使用 DoctrineModule 的内置 ObjectExistsNoObjectExists 验证器吗? github.com/doctrine/DoctrineModule/blob/master/docs/…
  • 我做了,但它没有按公司过滤,我的意思是如果 X 公司已经有一个 X_A 区域,Y 公司的 NoObjectExists 返回 false,因为 X_A 没有被过滤。我不知道这是验证器的工作方式还是我遗漏了什么。

标签: php doctrine-orm zend-framework2


【解决方案1】:

这是一个老问题,您可能已经解决了这个问题,但我最近遇到了类似的问题。

您可以在您的区域模型/服务中创建一个函数: validateAreaCompanyRelation(area, company) 并在您的字段集中使用回调来使用它:

AreaService 类: 添加一个方法以根据 1 行限制的查询返回 true 或 false。 就我而言,它是这样的:

public function validateAreaCompanyRelation($company, $area)
    {
        $result = false;
        $count  = $this->getRepository()
                ->createQueryBuilder('q')
                ->select('q')
                ->innerJoin('q.company', 'c')
                ->innerJoin('q.area','b')
                ->where('b.id = :area and c.company = :company')
                ->setParameter('area',$area)
                ->setParameter('company',$area)
                ->setMaxResults( 1 )
                ->getQuery()
                ->getArrayResult();     
        if(count($count) <>1){
            $result=true;
        }
       return $result;
    }

区域字段集: 将 AreaService 注入到字段集(传递给工厂构造)

class AreaFieldset extends Fieldset implements InputFilterProviderInterface
{

private $areaService;
public function __construct(areaServiceEntityService $areaService)
{

$this->areaService = $areaService;
}

public function init() 
{

$this->add(
    array(
    'name' => 'area',
    'filters' => array(),
    'validators' => array (
    array(
    'name' => 'Zend\Validator\Callback',
    'options' => array(
    'messages' => array(
        \Zend\Validator\Callback::INVALID_VALUE => 'Your custom error message',
),
    'callback' => array($this,'vlidateUniqueRelation'),
),
), 

)
)
);
array(
    'name' => 'company',
    'filters' => array(),
    'validators' => array (
    array(
    'name' => 'Zend\Validator\Callback',
    'options' => array(
    'messages' => array(
    \Zend\Validator\Callback::INVALID_VALUE =>  'Your custom error message',,
),
    'callback' => array($this,'vlidateUniqueRelation'),
    ),
), 

    )
)
);
}

public function vlidateUniqueRelation($value, $context)
{
    // $value =  value
    // $context['xxxx'] =  xxxxx value
    // Logic to validate goes here
    $context["company"]
    $context["area"]
return $this->AreaService->validateAreaCompanyRelation($context["company"], $context["Area"]);
}

【讨论】:

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