如何在 ZF2 中创建表单输入/元素

2024-01-20

编辑:我的主要问题现在变成了“如何以某种干净的方式将带有学说实体管理器的 ServiceManager 交到我的表单、元素和输入类手中?”继续阅读以查看完整的帖子。

我将尝试在这里举例询问,所以请耐心等待。让我知道哪里做错/对了,或者哪里可以改进

我正在尝试创建一个注册表。我可以使用 ZfcUser 模块,但我想自己完成此操作。我也将 ZF2 与 Doctrine2 一起使用,因此这让我稍微远离了该模块。

我的策略是这样的

  1. 创建一个名为注册表单的表单类

  2. 为每个元素创建单独的“元素”类,其中每个元素都有一个输入规范

  3. 由于每个元素都是表单中的一个单独的类,因此我可以单独对每个元素进行单元测试。

一切看起来都很好,直到我想向我的用户名元素添加一个验证器来检查用户名是否尚未使用。

这是到目前为止的代码

namepsace My\Form;

use Zend\Form\Form,
    Zend\Form\Element,
    Zend\InputFilter\Input,
    Zend\InputFilter\InputFilter,

/**
 * Class name : Registration
 */
class Registration
    extends Form
{

    const USERNAME     = 'username';
    const EMAIL        = 'email';
    const PASSWORD     = 'password';
    const PASS_CONFIRM = 'passwordConfirm';
    const GENDER       = 'gender';
    const CAPTCHA      = 'captcha';
    const CSRF         = 'csrf';
    const SUBMIT       = 'submit';

    private $captcha = 'dumb';

    public function prepareForm()
    {
        $this->setName( 'registration' );

        $this->setAttributes( array(
            'method' => 'post'
        ) );

        $this->add( array(
            'name'       => self::USERNAME,
            'type'       => '\My\Form\Element\UsernameElement',
            'attributes' => array(
                'label'     => 'Username',
                'autofocus' => 'autofocus'
            )
            )
        );

        $this->add( array(
            'name'       => self::SUBMIT,
            'type'       => '\Zend\Form\Element\Submit',
            'attributes' => array(
                'value' => 'Submit'
            )
        ) );

    }

}

我删除了很多我认为没有必要的内容。下面是我的用户名元素。

namespace My\Form\Registration;

use My\Validator\UsernameNotInUse;
use Zend\Form\Element\Text,
    Zend\InputFilter\InputProviderInterface,
    Zend\Validator\StringLength,
    Zend\Validator\NotEmpty,
    Zend\I18n\Validator\Alnum;

/**
 *
 */
class UsernameElement
    extends Text
    implements InputProviderInterface
{

    private $minLength = 3;
    private $maxLength = 128;

    public function getInputSpecification()
    {
        return array(
            'name'     => $this->getName(),
            'required' => true,
            'filters'  => array(
                array( 'name'       => 'StringTrim' )
            ),
            'validators' =>
            array(
                new NotEmpty(
                    array( 'mesages' =>
                        array(
                            NotEmpty::IS_EMPTY => 'The username you provided is blank.'
                        )
                    )
                ),
                new AlNum( array(
                    'messages' => array( Alnum::STRING_EMPTY => 'The username can only contain letters and numbers.' )
                    )
                ),
                new StringLength(
                    array(
                        'min'      => $this->getMinLength(),
                        'max'      => $this->getMaxLength(),
                        'messages' =>
                        array(
                            StringLength::TOO_LONG  => 'The username is too long. It cannot be longer than ' . $this->getMaxLength() . ' characters.',
                            StringLength::TOO_SHORT => 'The username is too short. It cannot be shorter than ' . $this->getMinLength() . ' characters.',
                            StringLength::INVALID   => 'The username is not valid.. It has to be between ' . $this->getMinLength() . ' and ' . $this->getMaxLength() . ' characters long.',
                        )
                    )
                ),
                array(
                    'name'    => '\My\Validator\UsernameNotInUse',
                    'options' => array(
                        'messages' => array(
                            UsernameNotInUse::ERROR_USERNAME_IN_USE => 'The usarname %value% is already being used by another user.'
                        )
                    )
                )
            )
        );
    }    
}

现在这是我的验证器

namespace My\Validator;

use My\Entity\Helper\User as UserHelper,
    My\EntityRepository\User as UserRepository;
use Zend\Validator\AbstractValidator,
    Zend\ServiceManager\ServiceManagerAwareInterface,
    Zend\ServiceManager\ServiceLocatorAwareInterface,
    Zend\ServiceManager\ServiceManager;

/**
 *
 */
class UsernameNotInUse
    extends AbstractValidator
    implements ServiceManagerAwareInterface
{

    const ERROR_USERNAME_IN_USE = 'usernameUsed';

    private $serviceManager;

    /**
     *
     * @var UserHelper
     */
    private $userHelper;
    protected $messageTemplates = array(
        UsernameNotInUse::ERROR_USERNAME_IN_USE => 'The username you specified is being used already.'
    );

    public function isValid( $value )
    {
        $inUse = $this->getUserHelper()->isUsernameInUse( $value );
        if( $inUse )
        {
            $this->error( UsernameNotInUse::ERROR_USERNAME_IN_USE, $value );
        }

        return !$inUse;
    }

    public function setUserHelper( UserHelper $mapper )
    {
        $this->userHelper = $mapper;
        return $this;
    }

    /**
     * @return My\EntityRepository\User
     */
    public function getUserHelper()
    {
        if( $this->userHelper == null )
        {
            $this->setUserHelper( $this->getServiceManager()->get( 'doctrine.entitymanager.orm_default' )->getObjectRepository( 'My\Entity\User') );
        }
        return $this->userHelper;
    }

    public function setServiceManager( ServiceManager $serviceManager )
    {
        echo get_class( $serviceManager );
        echo var_dump( $serviceManager );
        $this->serviceManager = $serviceManager;
        return $this;
    }

    /**
     *
     * @return ServiceManager
     */
    public function getServiceManager( )
    {
        return $this->serviceManager;
    }

}

为什么这对我来说是个好主意?

  1. 这似乎是一个很好的可测试性/重用选择,因为如果需要,我可以在我的应用程序中单独重用这些元素。

  2. 我可以对每个元素生成的每个输入进行单元测试,以确保它正确接受/拒绝输入。

这是我的元素单元测试的示例

public function testFactoryCreation()
{
    $fac = new Factory();

    $element = $fac->createElement( array(
        'type' => '\My\Form\Registration\UsernameElement'
        ) );
    /* @var $element \My\Form\Registration\UsernameElement  */

    $this->assertInstanceOf( '\My\Form\Registration\UsernameElement',
                             $element );

    $input      = $fac->getInputFilterFactory()->createInput( $element->getInputSpecification() );
    $validators = $input->getValidatorChain()->getValidators();
    /* @var $validators \Zend\Validator\ValidatorChain */

    $expectedValidators = array(
        'Zend\Validator\StringLength',
        'Zend\Validator\NotEmpty',
        'Zend\I18n\Validator\Alnum',
        'My\Validator\UsernameNotInUse'
    );

    foreach( $validators as $validator )
    {
        $actualClass = get_class( $validator['instance'] );
        $this->assertContains( $actualClass, $expectedValidators );

        switch( $actualClass )
        {
            case 'My\Validator\UsernameNotInUse':
                $helper = $validator['instance']->getUserHelper();
                //HAVING A PROBLEM HERE
                $this->assertNotNull( $helper );
                break;

            default:

                break;
        }
    }

}

我遇到的问题是验证器无法正确获取 UserHelper,从学说来看,这实际上是一个 UserRepository。发生这种情况的原因是验证器只能访问作为 ServiceManager 的 ValidatorPluginManager,而不是访问应用程序范围的 ServiceManager。

我在验证器部分收到此错误,尽管如果我在通用服务管理器上调用相同的 get 方法,它可以正常工作。

1) Test\My\Form\Registration\UsernameElementTest::testFactoryCreation
Zend\ServiceManager\Exception\ServiceNotFoundException: Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for doctrine.entitymanager.orm_default

验证器中的 var_dump( $serviceManager ) 显示它属于 ValidatorPluginManager 类。

我尝试将工厂放入 service_manager 条目中,如下所示

'service_manager' => array(
                'factories' => array(
                    'My\Validator\UsernameNotInUse' => function( $sm )
                    {
                        $validator = new \My\Validator\UsernameNotInUse();
                        $em        = $serviceManager->get( 'doctrine.entitymanager.orm_default' );
                        /* @var $em \Doctrine\ORM\EntityManager */
                        $validator->setUserHelper( $em->getRepository( '\My\Entity\User' ) );

                        return $validator;
                    }
                )

但这不起作用,因为它没有咨询应用程序级别服务经理。

所以,总的来说,我的问题如下:

  1. 这种将形式和元素分离的策略是好的吗?我应该继续这样走下去吗?什么是替代方案? (为了可测试性,我赞成将内容分解)我原本打算仅测试表单本身以及所有输入的组合,但似乎我试图做太多事情。

  2. 如何解决我遇到的上述问题?

  3. 我应该以我没有看到的其他方式使用 Zend 的表单/元素/输入部分吗?


这是我的验证器,使用静态方法注入entityManager并使用任何doctine实体。

<?php

namespace Base\Validator;

use Traversable;
use Zend\Stdlib\ArrayUtils;
use Zend\Validator\AbstractValidator;
use Doctrine\ORM\EntityManager;

class EntityUnique extends AbstractValidator
{
    const EXISTS = 'exists';

    protected $messageTemplates = array(
        self::EXISTS => "A %entity% record already exists with %attribute% %value%",
    );

    protected $messageVariables = array(
        'entity' => '_entity',
        'attribute' => '_attribute',
    );


    protected $_entity;
    protected $_attribute;
    protected $_exclude;

    protected static $_entityManager;

    public static function setEntityManager(EntityManager $em) {

        self::$_entityManager = $em;
    }

    public function getEntityManager() {

        if (!self::$_entityManager) {

            throw new \Exception('No entitymanager present');
        }

        return self::$_entityManager;
    }

    public function __construct($options = null)
    {
        if ($options instanceof Traversable) {
            $options = ArrayUtils::iteratorToArray($token);
        }

        if (is_array($options)) {

            if (array_key_exists('entity', $options)) {

                $this->_entity = $options['entity'];
            }

            if (array_key_exists('attribute', $options)) {

                $this->_attribute = $options['attribute'];
            }

            if (array_key_exists('exclude', $options)) {

                if (!is_array($options['exclude']) ||
                    !array_key_exists('attribute', $options['exclude']) ||
                    !array_key_exists('value', $options['exclude'])) {

                    throw new \Exception('exclude option must contain attribute and value keys');
                }

                $this->_exclude = $options['exclude'];
            }
        }

        parent::__construct(is_array($options) ? $options : null);
    }

    public function isValid($value, $context = null)
    {
        $this->setValue($value);

        $queryBuilder = $this->getEntityManager()
            ->createQueryBuilder()
            ->from($this->_entity, 'e')
            ->select('COUNT(e)')
            ->where('e.'. $this->_attribute . ' = :value')
            ->setParameter('value', $this->getValue());

        if ($this->_exclude) {

            $queryBuilder = $queryBuilder->andWhere('e.'. $this->_exclude['attribute'] . ' != :exclude')
                ->setParameter('exclude', $this->_exclude['value']);
        }

        $query = $queryBuilder->getQuery();        
        if ((integer)$query->getSingleScalarResult() !== 0) {

            $this->error(self::EXISTS);
            return false;
        }

        return true;
    }
}

IE。我将它用于这些表单元素,这些元素也经过测试并且工作正常:

<?php

namespace User\Form\Element;

use Zend\Form\Element\Text;
use Zend\InputFilter\InputProviderInterface;

class Username extends Text implements InputProviderInterface
{
    public function __construct() {

        parent::__construct('username');
        $this->setLabel('Benutzername');
        $this->setAttribute('id', 'username');
    }

    public function getInputSpecification() {

        return array(
            'name' => $this->getName(),
            'required' => true,
            'filters'  => array(
                array(
                    'name' => 'StringTrim'
                ),
            ),
            'validators' => array(
                array(
                    'name' => 'NotEmpty',
                    'break_chain_on_failure' => true,
                    'options' => array(
                        'messages' => array(
                            'isEmpty' => 'Bitte geben Sie einen Benutzernamen ein.',
                        ),
                    ),
                ),
            ),
        );
    }
}

创建新用户时

<?php

namespace User\Form\Element;

use Zend\InputFilter\InputProviderInterface;
use User\Form\Element\Username;

class CreateUsername extends Username implements InputProviderInterface
{
    public function getInputSpecification() {

        $spec = parent::getInputSpecification();
        $spec['validators'][] = array(
            'name' => 'Base\Validator\EntityUnique',
            'options' => array(
                'message' => 'Der name %value% ist bereits vergeben.',
                'entity' => 'User\Entity\User',
                'attribute' => 'username',  
            ),    
        );

        return $spec;
    }
}

编辑现有用户时

<?php

namespace User\Form\Element;

use Zend\InputFilter\InputProviderInterface;
use User\Form\Element\Username;

class EditUsername extends Username implements InputProviderInterface
{
    protected $_userId;

    public function __construct($userId) {

        parent::__construct();
        $this->_userId = (integer)$userId;
    }

    public function getInputSpecification() {

        $spec = parent::getInputSpecification();
        $spec['validators'][] = array(
            'name' => 'Base\Validator\EntityUnique',
            'options' => array(
                'message' => 'Der name %value% ist bereits vergeben.',
                'entity' => 'User\Entity\User',
                'attribute' => 'username',
                'exclude' => array(
                    'attribute' => 'id',
                    'value' => $this->_userId,  
                ),
            ),    
        );

        return $spec;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 ZF2 中创建表单输入/元素 的相关文章

  • 如何使用 php 将 *.xlsb 转换为数组或 *.csv

    我正在尝试转换 xlsb文件到php array or csv文件 或至少 xls 我尝试使用PHPExcel 但看起来它无法识别该文件中的内容 我注意到 你可以重命名 xlsb文件到 zip文件 然后使用命令行解压缩unzip zip 之
  • 客户端和服务器端编程有什么区别?

    我有这个代码 为什么这不会将 bar 写入我的文本文件 而是警告 42 注意 这个问题的早期修订明确涉及服务器上的 PHP 和客户端上的 JavaScript 问题的本质和解决方案是相同的any当一种语言在客户端上运行而另一种语言在服务器上
  • 将扩展配置文件实体添加到 FOS UserBundle

    我正在尝试扩展 FOS UserBundle 以允许扩展配置文件实体除了基本 UserBundle 字段之外还保存其他信息 因为我的网站上有多种类型的用户 所以我创建了单独的实体来保存个人资料信息 我的实体设置如下 class UserPr
  • 如何在 PHP 中将默认日期设置为波斯日期?

    如何在 PHP 中将默认日期设置为波斯日期 说吧 如果我echo这个功能date Y m d 然后它会显示2018 03 05但我想要1396 12 14波斯日期 请检查 http php net manual en intldatefor
  • 从目录中读取所有文件内容 - php

    这实际上是一个简单的任务 我想显示指定文件夹中所有文件的内容 我正在传递目录名称 echo a href row qname a 在第二页上 我正在迭代目录内容 while entryname readdir myDirectory if
  • 打印一个模式以显示最多 5 行 5 列的数字,例如 5 4 3 2 1 和下一行 4 3 2 1 5 直到第 5 行

    这是一个正方形图案 每行有 5 列 共有 5 行 图案如下所示 5 4 3 2 1 4 3 2 1 5 3 2 1 5 4 2 1 5 4 3 1 5 4 3 2 我的代码如下以获得模式 但当计数器达到 1 并显示在相应的列值中时 我无法重
  • 在 php 和 mysql 中使用 utf8mb4

    我读过 mysql gt 5 5 3 完全支持每个可能的字符 如果您使用编码utf8mb4对于某个表 列http mathiasbynens be notes mysql utf8mb4 http mathiasbynens be note
  • PHP:如何发送电子邮件基础知识

    我想使用 PHP 从本地主机向其他人发送电子邮件 我需要做什么才能做到这一点 例如我需要安装邮件服务器吗 如果我没记错的话 有一种语言不需要邮件服务器来发送电子邮件 这样对吗 PHP ini里面有 邮件功能 如何配置这个 我在网上查了一下
  • php递归合并

    我需要以某种不同的方式合并一些数组 我使用 array merge recursive 然而 有一些事情我需要改变 但我不知道如何改变 这是来自 php net 的引用 但是 如果数组具有相同的数字键 则后面的值 不会覆盖原始值 但会追加
  • 如何在 PHP 中运行 shell 脚本?

    我正在尝试使用 PHP 触发 shell 脚本的运行 本质上 当用户在我们用 PHP 编写的网站上完成一个操作时 我们希望触发一个 shell 脚本 该脚本本身调用一个 Java 文件 提前致谢 See shell exec http ph
  • 同一路由组的多个前缀

    我正在为一所学校编写一个相当简单的网站 该网站有新闻 文章 视频剪辑 等 它的工作方式是在主页中我们向访问者展示一些课程 例如 gt math gt geography gt chemistry 用户在其中选择 1 网站内容会根据用户的选择
  • 无法显示由 Fine-uploader 上传到 Amazon s3 的图像

    我现在尝试设置fineuploader s3以显示在aws服务器上成功上传的文件的图像 如示例页面上所做的那样 http fineuploader com s3 demo http fineuploader com s3 demo 我 仍然
  • 如何使用php在mysql数据库中添加照片? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我对 PH
  • PHP 负面因素不断增加

    我这里有这个代码 remaining 0 foreach clientArrayInvoice as key gt row remaining remaining row total 它的作用是 它获取总计值并将它们相加 但是当我有负值时
  • 如何缓存 twitter api 结果?

    我想缓存 twitter api 结果的结果并将其显示给用户 缓存结果的最佳方法是什么 我正在考虑根据时间限制将结果写入文件 可以吗 还是应该使用任何其他方法 最重要的是 理想的缓存时间是多少 我想显示来自 twitter 的最新内容 但
  • 使用 IntlDateFormatter 转换非公历日期

    我应该如何使用将非公历日期转换为其他日历类型IntlDateFormatter 我要转换 1392 01 02 from persian to islamic日历 我尝试了以下代码 但它没有转换日历 formatter IntlDateFo
  • PHP函数返回值到html标签

    我想获取函数的返回值并将其显示到特定的id 在我的 Class php 中 我有一个名为 login 的函数 用于验证密码是否正确 不正确
  • 我应该使用排队系统来处理付款吗?

    我在用着Slim https www slimframework com和这个结合Stripe 的 PHP 库 https stripe com docs api php在我的应用程序中处理付款 一切都很好 但是直到最近 我在我的系统中发现
  • 有关于 PHP 中的 V8JS 的文档吗?

    有没有关于V8JS的文档 我是否只需要标准 PHP 或一些扩展即可使用 V8JS 我将非常感谢有关 PHP 中的 V8JS 的任何信息 要求 PHP 5 3 3 和 V8 库和标头安装在正确的路径中 Install http www php
  • 如何更改phpmyadmin MySQL的IP地址?

    我在 xampp 中更改了 apache 的 IP 地址 但无法连接到 MySQL 我认为问题是我的 apache 不在我的数据库的同一网络上 我的 apache 位于 192 168 1 10 而我的 MySQL 位于 127 0 0 1

随机推荐

  • 如何将可观察集合写入txt文件?

    将可观察集合写入 txt 文件的最佳方法是什么 我目前有以下内容 public ObservableCollection
  • pytqt图形线的鼠标坐标

    每当我将鼠标移动到图表顶部时 我都试图获取随机函数图的 x y 值 我正在使用 pyqtgraph SignalProxy 并将其连接到回调 mousedMoved 我收到此错误 NameError 未定义全局名称 mouseMoved 这
  • 在 Play 2.x 中覆盖 WebJar 资源

    只是想知道 是否有一种方法可以在一个文件中覆盖某些资产 确切地说是 JS 和 LESS 文件WebJars http www webjars org 资产与位于app assets 目录 说吧 我有一个引导程序 3 1 1 webjar h
  • 将 Matplotlib 图形保存为全屏图像

    我正在使用 Pandas 和 MatPlotLib 构建一个小型图形实用程序来解析工作机器中的数据和输出图形 当我使用输出图表时 plt show 我最终得到了一个不清晰的图像 其中的图例和标签就像这样相互排斥 However expand
  • 无法使用 pip 安装 Python 成像库

    尝试使用 PIP 安装 Python Imaging Library PIL 时 安装失败并出现以下错误 SyntaxError invalid syntax Complete output from command python setu
  • 没有找到类“androidx.core.widget.DrawerLayout”

    使用 Android Studio 菜单选项 Refactor gt Refactor to Androidx 迁移到 Androidx 包后 我的 build gradle 看起来像 implementation androidx app
  • facebook graph api 和 php sdk,删除事件!

    在我的一生中 我找不到一种方法来删除 取消或移除我使用 FB PHP SDK 和 Graph API 创建和更新的 Facebook 事件 我已经尝试了 facebook 文档和堆栈溢出中找到的每一个排列 以下是我在探索中发现的一些线索 h
  • 适合初学者的松耦合和面向对象实践

    保持类松散耦合是编写易于理解 修改和调试的代码的一个重要方面 我明白了 然而 作为一个新手 几乎任何时候我都很难超越最简单的例子 我或多或少地了解如何将字符串 整数和简单数据类型封装在它们自己的类中 然而 当我开始处理富文本格式等信息时 事
  • 在Linux上安装特定的adb版本

    我想使用特定的 adb 版本来连接设备 为了连接外部模拟器 我尝试使用adb connect localhost 5555 我得到这个结果 adb adb server version 36 doesn t match this clien
  • 如何在 Asp.Net Core 2.2 中禁用/启用运行时身份验证?

    网站默认只能匿名访问 管理员有一个按钮可以将站点切换到维护模式 这应该使用内置的 Cookie 身份验证启用授权 在数据库中稍微翻转一下 与本文无关 为了实现这一点 我首先配置了 cookie 身份验证 在startup cs中 publi
  • 如何在 MVC 3 中的 PartialView 加载上执行 JavaScript 函数

    code public ActionResult mapPartial DataTable dt string strEvents foreach DataRow row in dt Rows strEvents row Lat ToStr
  • dijit.byId 不适用于 IE8 和 dojo.addOnLoad

    当我使用 IE8 加载此脚本时 出现异常Object does not support this property or method 但它适用于其他浏览器 我用的是dijit 1 3 1 我不明白 dojo addOnLoad init
  • 如何将使用事务的代码包装在事务中然后回滚?

    我正在设置我的集成测试设备 我正在使用beforeEach and afterEach挂钩将每个测试包装在回滚的事务中 以便测试不会相互影响 一个简化的例子可能是这样的 const repository require library de
  • 如何从左到右解压元组?

    有没有一种干净 简单的方法来从左到右解压右侧的Python元组 例如对于 j 1 2 3 4 5 6 7 1 2 3 4 5 6 7 v b n j 4 7 我可以修改切片符号以便v j 6 b j 5 n j 4 我意识到我可以只订购左侧
  • React js:无法将数组中的第一个对象作为道具发送

    我正在尝试构建一个小型 React js 应用程序 我的组件结构如下所示 MainComponent CategoryList Category ItemsList Item 我的 MainContent 组件对其状态数据执行 ajax 请
  • 如何找到最接近的旋转

    考虑从 0 T 开始按递增顺序给出的点 Y 我们将这些点视为位于圆周 T 的圆上 现在考虑点 X 也来自 0 T 并且也位于圆周 T 的圆上 我们说 X 和 Y 之间的距离是 X 中每个点与其 Y 中最近点之间的绝对距离之和 回想一下 两者
  • 将滚动平均值与数据一起绘制

    我有一个看起来像这样的数据框 delays Worst case Avg case 2014 10 27 2 861433 0 953108 2014 10 28 2 899174 0 981917 2014 10 29 3 080738
  • 检测语言的最佳方法是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 是否可以使用循环创建同一组件的多个实例?

    我有一个组件 Component CAU is port CLK in std logic RESET in std logic START in std logic V DIRECTION in vector 3d P ORIGIN in
  • 如何在 ZF2 中创建表单输入/元素

    编辑 我的主要问题现在变成了 如何以某种干净的方式将带有学说实体管理器的 ServiceManager 交到我的表单 元素和输入类手中 继续阅读以查看完整的帖子 我将尝试在这里举例询问 所以请耐心等待 让我知道哪里做错 对了 或者哪里可以改