我已经使用Abstract类为Forms,Fieldsets和InputFilters建立了一个结构.表单和字段集具有工厂,而InputFilters由FieldsetFactory在Fieldsets上创建和设置(使用MutableCreationoptionsInterface传递选项)

我遇到的问题是为Form加载了InputFilters,但不用于验证数据.所有输入都被接受为有效.

例如.我有一个具有名称属性的国家/地区实体.国家/地区的名称必须至少为3个字符且最多为255个.当名称为“ab”时,它被认为是有效的.

在有人问:没有抛出错误之前,数据被接受为有效.

在过去的几天里,我一直在试图找到我犯了错误的地方但是找不到它.

此外,还有相当多的代码.我将它限制在我认为相关的内容中,但是:如果你需要更多,那么会有更多.我删除了很多类型检查,docblocks和类型提示来限制代码行/阅读时间;)

module.config.PHP

'form_elements' => [
    'factories' => [
        CountryForm::class => CountryFormFactory::class,CountryFieldset::class => CountryFieldsetFactory::class,],

Country.PHP

class Country extends AbstractEntity // Creates $id + getter/setter
{
    /**
     * @var string
     * @ORM\Column(name="name",type="string",length=255,nullable=false)
     */
    protected $name;

    // Other properties
    // Getters/setters
}

CountryController.PHP – 扩展AbstractActionController

public function editaction() // Here to show the params used to call function
{
    return parent::editaction(
        Country::class,CountryForm::class,[
            'name' => 'country','options' => []
        ],'id','admin/countries/view','admin/countries',['id']
    );
}

AbstractActionController.PHP – (在这里出错了) – 由CountryController#editaction()使用

public function editaction (
    $emEntity,$formName,$formOptions,$idProperty,$route,$errorRoute,array
    $routeParams = []
) {
    //Check if form is set

    $id = $this->params()->fromroute($idProperty,null);

    /** @var AbstractEntity $entity */
    $entity = $this->getEntityManager()->getRepository($emEntity)->find($id);

    /** @var AbstractForm $form */
    $form = $this->getFormElementManager()->get($formName,(is_null($formOptions) ? [] : $formOptions));
    $form->bind($entity);

    /** @var Request $request */
    $request = $this->getRequest();
    if ($request->isPost()) {
        $form->setData($request->getPost());

        if ($form->isValid()) { // HERE IS WHERE IT GOES WRONG -> ALL IS TRUE
            try {
                $this->getEntityManager()->flush();
            } catch (\Exception $e) {
                //Print errors & return (removed,unnecessary)
            }

            return $this->redirectToRoute($route,$this->getRouteParams($entity,$routeParams));
        }
    }

    return [
        'form' => $form,'validationMessages' => $form->getMessages() ?: '',];
}

CountryForm.PHP

class CountryForm extends AbstractForm
{
    // This one added for SO,does nothing but call parent#__construct,which would happen anyway
    public function __construct($name = null,array $options)
    {
        parent::__construct($name,$options);
    }

    public function init()
    {
        //Call parent initializer.
        parent::init();

        $this->add([
            'name' => 'country','type' => CountryFieldset::class,'options' => [
                'use_as_base_fieldset' => true,]);
    }
}

CountryFormFactory.PHP

class CountryFormFactory extends AbstractFormFactory
{
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        $serviceManager = $serviceLocator->getServiceLocator();

        /** @var EntityManager $entityManager */
        $entityManager = $serviceManager->get('Doctrine\ORM\EntityManager');

        $form = new CountryForm($this->name,$this->options);
        $form->setobjectManager($entityManager);
        $form->setTranslator($serviceManager->get('translator'));

        return $form;
    }
}

AbstractFormFactory.PHP – 使用MutableCreationoptionsInterface从Controller函数调用接收选项:$form = $this-> getFormElementManager() – > get($formName,(is_null($formOptions)?[]:$formOptions))

abstract class AbstractFormFactory implements FactoryInterface,MutableCreationoptionsInterface
{
    protected $name;
    protected $options;

    /**
     * @param array $options
     */
    public function setCreationoptions(array $options)
    {
        // Check presence of required "name" (string) parameter in $options
        $this->name = $options['name'];

        // Check presence of required "options" (array) parameter in $options
        $this->options = $options['options'];
    }
}

CountryFieldset.PHP – 以上由CountryForm.PHP用作基本字段集

class CountryFieldset extends AbstractFieldset
{
    public function init()
    {
        parent::init();

        $this->add([
            'name' => 'name','required' => true,'type' => Text::class,'options' => [
                'label' => _('Name'),]);
        // Other properties
    }
}

AbstractFieldset.PHP

abstract class AbstractFieldset extends Fieldset
{
    use InputFilterawareTrait;
    use TranslatorAwareTrait;

    protected $entityManager;

    public function __construct(EntityManager $entityManager,$name)
    {
        parent::__construct($name);

        $this->setEntityManager($entityManager);
    }

    public function init()
    {
        $this->add([
            'name' => 'id','type' => Hidden::class,]);
    }

    // Getters/setters for $entityManager
}

CountryFieldsetFactory.PHP – 在这里,输入滤波器设置在FIELDSET上

class CountryFieldsetFactory extends AbstractFieldsetFactory
{
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        parent::createService($serviceLocator);

        /** @var CountryRepository $entityRepository */
        $entityRepository = $this->getEntityManager()->getRepository(Country::class);

        $fieldset = new CountryFieldset($this->getEntityManager(),$this->name);
        $fieldset->setHydrator(new DoctrineObject($this->getServiceManager()->get('doctrine.entitymanager.orm_default'),false));
        $fieldset->setobject(new Country());
        $fieldset->setTranslator($this->getTranslator());

        // HERE THE INPUTFILTER IS SET ONTO THE FIELDSET THAT WAS JUST CREATED
        $fieldset->setInputFilter(
            $this->getServiceManager()->get('InputFilterManager')->get(
                CountryInputFilter::class,[ // These are the options read by the MutableCreationoptionsInterface
                    'object_manager' => $this->getEntityManager(),'object_repository' => $entityRepository,'translator' => $this->getTranslator(),]
            )
        );

        return $fieldset;
    }
}

AbstractFieldsetFactory.PHP

abstract class AbstractFieldsetFactory implements FactoryInterface,MutableCreationoptionsInterface
{

    protected $serviceManager;
    protected $entityManager;
    protected $translator;
    protected $name;


    public function setCreationoptions(array $options)
    {
        $this->name = $options['name'];
    }

    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        /** @var ServiceLocator $serviceManager */
        $this->serviceManager = $serviceLocator->getServiceLocator();

        /** @var EntityManager $entityManager */
        $this->entityManager = $this->getServiceManager()->get('Doctrine\ORM\EntityManager');

        /** @var Translator $translator */
        $this->translator = $this->getServiceManager()->get('translator');
    }

    // Getters/setters for properties
}

CountryFieldsetInputFilter.PHP

class CountryInputFilter extends AbstractInputFilter
{
    public function init()
    {
        parent::init();

        $this->add([
            'name' => 'name','filters' => [
                ['name' => StringTrim::class],['name' => StripTags::class],'validators' => [
                [
                    'name' => StringLength::class,'options' => [
                        'min' => 3,// This is just completely ignored
                        'max' => 255,]);

        // More adding
    }
}

AbstractFieldsetInputFilter.PHP – 最后一个!

总结

以上是DEVMAX为你收集整理的ZF2 / Doctrine2 – 未验证的字段集,数据始终有效全部内容。

如果觉得DEVMAX网站内容还不错,欢迎将DEVMAX网站推荐给好友。

ZF2 / Doctrine2 – 未验证的字段集,数据始终有效的更多相关文章

  1. HTML5新增form控件和表单属性实例代码详解

    这篇文章主要介绍了HTML5新增form控件和表单属性实例代码详解,需要的朋友可以参考下

  2. HTML5表单验证特性(知识点小结)

    这篇文章主要介绍了HTML5表单验证特性的一些知识点,本文通过实例代码截图的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. amazeui页面分析之登录页面的示例代码

    这篇文章主要介绍了amazeui页面分析之登录页面的示例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  4. ios – Swift Eureka Form中的循环

    我正在构建一个Eureka表单,并希望在表单中放置一个循环来构建基于数组的步进器列表.我试图使用的代码是:但是,当我这样做时,我在StepperRow行上出现了一个错误:所以看起来Swift不再认为它在形式之内并且正在关注

  5. swift 上传图片和参数 upload image with params

    Alamofire.upload(urlRequest.0,urlRequest.1).progress{(bytesWritten,totalBytesWritten,totalBytesExpectedToWrite)inprintln("\(totalBytesWritten)/\(totalBytesExpectedToWrite)")}}

  6. swift – 使用PostgreSQL在Vapor 3中上传图片

    我正在关注这些家伙MartinLasek教程,现在我正在“图片上传”.似乎没有人能回答“如何上传iVapor3图像”的问题Db连接正常,所有其他值都保存.这是我的创建方法:和型号:}和叶子模板:我知道需要一种管理文件的方法和原始图像字节,但我怎么去那里?这使用多部分表单的自动解码:upload.leaf文件是:使用File类型可以访问上载文件的本地文件名以及文件数据.如果将其余的Question字段添加到ExampleUpload结构中,则可以使用该路径捕获整个表单的字段.

  7. HTML form表单提交方法案例详解

    这篇文章主要介绍了HTML form表单提交方法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. React Form组件的实现封装杂谈

    这篇文章主要介绍了React Form组件的实现封装杂谈,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  9. Jquery Easyui表单组件Form使用详解(30)

    这篇文章主要为大家详细介绍了Jquery Easyui表单组件Form的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Vue自定义Form组件实现方法介绍

    这篇文章主要介绍了Vue自定义Form组件的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部