Zend Framework 11.1:找不到Form_Customer

时间:2012-04-05 09:28:55

标签: php zend-framework namespaces zend-form

首先,我知道stackoverflow上有一些关于那个表单问题的问题,但是没有一个能真正帮助我,所以我自己试一试。在过去的10个小时里,我一直坚持这一点,现在我真的很沮丧。

所以,让我们从我的目录结构开始:

  gpos/
  ---- application/
       --- forms/
       ------- CustomerForm.php
       --- modules/
           --- default/
               --- controllers/
                   --- CustomerController.php
               --- views/
       --- Bootstrap.php
  ---- public/
  ---- library/
       --- Doctrine/
       --- GPos/
           --- Doctrine/
               --- ActiveEntity.php
           --- Models/
               --- Customer.php

正如您所看到的,我使用Zend的标准表单/文件夹来存储表单,我也使用Doctrine作为数据库管理员。


所以我一直试图从CustomerForm.php到达我的CustomerController.php但只是找到一个未找到的错误。

这是我得到的错误:
Fatal error: Class 'Form_CustomerForm' not found in C:\wamp\www\GPos\gpos\application\modules\default\controllers\CustomerController.php on line 9

CustomerController.php:

class CustomerController extends Zend_Controller_Action {

    public function init() {
        /* Initialize action controller here */
    }

    public function indexAction() {
        $form = new Form_CustomerForm(); //line 9
        $form->setAction('/customer/index');
        $form->setMethod('post');
        $this->view->form = $form;
    }

CustomerForm.php:

class Form_CustomerForm extends Zend_Form {
    public function init() {

最后views/scripts/customer/submit.phtml:

<h2>Customer</h2>
<p>To create blabla</p>

<?php echo $this->form; ?>

我一直在努力将Form命名空间添加到自动加载器中,但我今天才知道它已经在感谢Zend为我们做的了。那么......我做错了什么?我发现很多帖子都说如何添加资源以及如何管理自定义表单,我觉得我正在做的就是问题,但是无论如何都无关紧要。

我担心它来自其他地方因为我一直试图为library/GPos/Doctrine/中的ActiveEntity.php文件添加不同的命名空间,例如GPos_Doctrine:

protected function _initAutoload()
{
    $autoloader = new Zend_Application_Module_Autoloader(array(
            'namespace' => 'Application',
            'basePath' => APPLICATION_PATH,
    ));
    $autoloader->addResourceType('gpos', '/../../library/GPos', 'GPos');
    $autoloader->addResourceType('doctrine', '/../../library/GPos/Doctrine', 'GPos_Doctrine');

    return $autoloader;
}

这也不起作用。我不太确定'path'参数(第二个参数)但我在教程中看到你添加的eath资源类型的路径必须是相对于autoloader的basePath,所以我想出了这些路径。

我可以使我的GPos_Doctrine_ActiveEntity()工作的唯一方法是将autoloadernamespaces[] = "GPos_"添加到a​​pplication.ini。添加autoloadernamespaces[] = "Form_"虽然没有用......我真的不明白我添加的资源类型有什么问题。

请注意,我没有使用zf工具来构建该项目。我正在考虑这样做,如果我找不到一种方法让它全部正常工作。

我也尝试将我的表单类重命​​名为“Application_Form_CustomerForm”,但也没有做任何好处。我觉得我已经尽力了。我只是de de :(

哦,顺便说一句,我最初找到的唯一工作就是将表单/文件夹放在我的库中,这很有效。不明白为什么,但我不想使用那个黑客。看,我正在做这个项目作为我的IT学士工作毕业,我真的不应该进入黑客行为让它们工作:P。

感谢任何关注的人!

2 个答案:

答案 0 :(得分:2)

将引导程序添加到默认模块(然后自动设置资源类型)

class Default_Bootstrap extends Zend_Application_Module_Bootstrap
{
    protected function _initAutoload() {
        $moduleLoader = new Zend_Application_Module_Autoloader(array(
                    'namespace' => 'Default_',
                    'basePath' => APPLICATION_PATH . '/modules/default'));
        return $moduleLoader;
    }
}

或将其添加到您的全局引导程序(使用两个自定义资源类型扩展它):

public function _initDefaultResourceTypes() {
    $al = new Zend_Application_Module_Autoloader(array(
        'namespace' => '',
        'basePath'  => APPLICATION_PATH.'/modules/default/',
        'resourceTypes' => array(
            'dbtable' => array(
                'namespace' => 'Model_DbTable',
                'path'      => 'models/DbTable',
            ),
            'mappers' => array(
                'namespace' => 'Model_Mapper',
                'path'      => 'models/mappers',
            ),
            'form'    => array(
                'namespace' => 'Form',
                'path'      => 'forms',
            ),
            'model'   => array(
                'namespace' => 'Model',
                'path'      => 'models',
            ),
            'plugin'  => array(
                'namespace' => 'Plugin',
                'path'      => 'plugins',
            ),
            'service' => array(
                'namespace' => 'Service',
                'path'      => 'services',
            ),
            'viewhelper' => array(
                'namespace' => 'View_Helper',
                'path'      => 'views/helpers',
            ),
            'viewfilter' => array(
                'namespace' => 'View_Filter',
                'path'      => 'views/filters',
            )
          )
    ));
    $al->setDefaultResourceType('model');
}

查看这个ZF 1 Skeleton获取更多信息: https://github.com/eddiejaoude/Zend-Framework--Doctrine-ORM--PHPUnit--Ant--Jenkins-CI--TDD-

答案 1 :(得分:1)

我不使用模块,但这里是我做的,这是非常基本的:

在/public/index.php中,我将“/ forms”添加到包含路径: (当然,重要的部分是与“形式”的界线

set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    realpath(APPLICATION_PATH . '/forms'),
    get_include_path(),
)));

我的表格随后命名为:

class Default_Form_Login extends Zend_Form

然后我会这样做:

$form = new Default_Form_Login();