使用表单与Zend Framework

11

我相对来说是MVC和Zend Framework的新手。话虽如此,我觉得在我的目录结构中很难弄清Form应该放在哪里。我有一个模块化的目录结构,所以我不知道是否应该有一个单独的forms目录,或者每个模块目录中都应该有一个。

/application
    /modules/
        /default
            /controllers
            /views
        /admin
            /controllers
            /views

当您决定了一个表单目录后,您是否将该目录设置在引导程序的包含路径中?或者您会在使用该表单的控制器中包含该表单?

您如何在Zend Framework中使用表单?

8个回答

11

虽然有些晚了,但在当前版本的ZF中,这个问题已经得到解决:

在以下网页上http://framework.zend.com/manual/en/zend.loader.autoloader-resource.html 手册中声明:

30.3.2. 模块资源自动加载器 Zend框架附带一个具体的实现Zend_Loader_Autoloader_Resource,其中包含覆盖Zend Framework MVC应用程序的默认推荐目录结构的资源类型映射。该加载器名为Zend_Application_Module_Autoloader,并具有以下映射:

api/         => Api
forms/       => Form
models/      => Model
    DbTable/ => Model_DbTable
plugins/     => Plugin
作为示例,如果您有一个以“Blog_”为前缀的模块,并尝试实例化名为“Blog_Form_Entry”的类,它将在资源目录的“forms/”子目录中查找名为“Entry.php”的文件。 使用Zend_Application的模块引导程序时,默认情况下会为每个离散模块创建一个Zend_Application_Module_Autoloader实例,从而允许您自动加载模块资源。 然而,这确实需要使用Zend_Application。

好的,很有用!我没有跟上最近的变化,所以知道这个问题在当前版本中得到了解决是很有帮助的。 - Andrew
正是我所需要的。我选择了模型/表单路线,目前正在重构我的结构以符合Zend标准/建议。 - Aries

4

将以下代码添加到application/modules/yourmodule/Bootstrap.php文件中:

class Yourmodule_Bootstrap extends Zend_Application_Module_Bootstrap
{

protected function _initAutoload()
    {
        $autoloader = new Zend_Application_Module_Autoloader(array(
            'namespace' => 'Yourmodule_',
            'basePath'  => APPLICATION_PATH .'/modules/yourmodule',
            'resourceTypes' => array (
                'form' => array(
                    'path' => 'forms',
                    'namespace' => 'Form',
                ),
                'model' => array(
                    'path' => 'models',
                    'namespace' => 'Model',
                ),
            )
        ));
        return $autoloader;
    }

}

2
截至2009年3月,ZF的思想领袖似乎仍在就最佳组织方式进行讨论。作为Zend_Tool的一部分,预计在ZF v1.8中发布一个脚手架生成器。目前它还在孵化器中,我上周试用了它,它能够工作,但是它的当前状态下没有生成很多组件。
从我看到的例子来看,它们似乎最好与其相互作用的模型分开管理(这是来自于《Zend Framework实战》的内容)。
/application
    /modules/
        /default
            /controllers
            /forms
                ContactForm.php
                LoginForm.php
                RegisterForm.php
                SupportForm.php
            /models
                Comment.php
                User.php
                Users.php
            /views
        /admin
            /controllers
            /views

然而,我也看到了在模型目录下面的以下结构。Matthew Weier O'Phinney展示了如何将它们用于模型本身的验证
/application
    /modules/
        /default
            /controllers
            /models
                Comment.php
                User.php
                /Form
                    Comment.php
                    Login.php
                    Register.php
            /views
        /admin
            /controllers
            /views

为了让您的文件自动包含,请确保使用下划线模式命名您的类。
例如,当Zend_Loader看到:
 class RegisterController extends Zend_Controller_Action

它在php的include_path中查找:
Zend/Controller/Action.php

同样地,如果我们假设上面的第一个结构,如果我们在我们的include_path中包含“default”模块:
# bootstrap.php
$rootDir = dirname(dirname(__FILE__));
define('ROOT_DIR', $rootDir);
set_include_path(get_include_path()
    . PATH_SEPARATOR . ROOT_DIR . '/library/'
    . PATH_SEPARATOR . ROOT_DIR . '/application/modules/default/'
);
include 'Zend/Loader.php';
Zend_Loader::registerAutoload();

你给你的课程取名字:
Forms_ContactForm
Models_User

一些程序员选择将大部分文件放在库中,这样他们就不必添加额外的包含路径:
/library
    /My
        /Form
            Contact.php

假设包含了库文件夹,上面的类将被命名为:
My_Form_Contact

祝你好运!-Matt

我在上面的回复中添加了一些额外的注释。如果您有问题,请告诉我。 - Apex
这种方法的问题在于您必须将每个模块目录添加到include_path中。而且,Forms_ContactForm似乎是多余和丑陋的。 - leek
我完全同意,那个特定的文件夹结构是使用包含语句(不是为Zend Loader设计的)。无论如何,你的建议确实更加优雅。 :) - Apex

1

zend命令工具可以创建相关表单:

zf create form product sales

其中,sales是模块的名称。该命令工具会在sales模块内创建一个form目录,并在其中生成一个Product.php文件及其对应的类。

class sales_Form_Product extends Zend_Form {

你需要添加一个 de Zend_Application_Module_Autoloader 的定义,来定义你的模块目录


1

就我个人而言,我发现将我的模块目录放在包含路径中,并按照Zend Loader模式命名我的表单类是最容易的。

示例目录结构(从Matt的答案中复制):

/application
    /modules/
        /default
            /controllers
            /forms
                Contact.php
                Login.php
                Register.php
                Support.php
            /models
                Comment.php
                User.php
                Users.php
            /views
        /admin
            /controllers
            /views

类名示例:

Default_Forms_Contact
Default_Forms_Login
Default_Forms_Register
Default_Forms_Support

为了保持简单,我会给我的模型和插件起类似的名字。

希望这个问题在Zend Framework的后续版本中得到正确解决。

更新: 这种结构在*nix平台上不起作用。我是通过艰难的方式发现的!Zend Loader需要将模块、表单和模型文件夹大写才能在区分大小写的环境中正常工作。


只是提醒一下:我也认为 '{Module}Forms{Name}' 太丑了。 - leek

1

我个人喜欢将它们放在我的应用程序文件夹中,因为我认为它们不属于库,并且只有一个文件夹可以更轻松地自动加载它们。

/application
/forms
/modules/
    /default
        /controllers
        /views
    /admin
        /controllers
        /views
/libray/
    /Zend

我只需将表格路径添加到 includes_path 中,就可以轻松完成了。


0
 $selectexamname = new Admin_Form_examresults_Selectexamname();
        $this->view->selectexamname = $selectexamname;

你的类应该按照这个格式进行定义

class Admin_Form_examresults_Selectexamname extends Zend_Form {}

-1

我把所有的模型放在库中的一个文件夹里。Notion 是我的公司名称。

/application
/modules/
    /default
        /controllers
        /views
    /admin
        /controllers
        /views
/libray/
    /Zend
    /Notion
        /Form

这使得包含和查找文件变得容易,因为您已经包含了库文件夹。

Notion_Form_Login
Notion_Db_Manager_Login

1
如果您有不同的模块需要不同的表单怎么办? - Aries

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接