Php Zend-重构以在站点全局包含表单

Php Zend-重构以在站点全局包含表单,php,model-view-controller,zend-framework,Php,Model View Controller,Zend Framework,我目前在搜索控制器中有一个搜索表单,因此我只能通过/search/访问它。我必须重构我的代码,这样这个搜索表单不仅会出现在搜索控制器中,而且会在整个站点中全局出现 (代码不准确,因为我不得不重新键入一些代码) 扩展Zend_Form的我的类位于application/forms/forms/SearchForm.php: class Form_SearchForm extends Zend_Form { public function init() {}; } 我的搜索控制器类似于

我目前在搜索控制器中有一个搜索表单,因此我只能通过
/search/
访问它。我必须重构我的代码,这样这个搜索表单不仅会出现在搜索控制器中,而且会在整个站点中全局出现

(代码不准确,因为我不得不重新键入一些代码)

扩展Zend_Form的我的类位于
application/forms/forms/SearchForm.php

class Form_SearchForm extends Zend_Form {

    public function init() {};

}
我的搜索控制器类似于

class SearchController extends Zend_Controller_Action
{
    public function search() {
        $searchForm = new Form_SearchForm();
        $this->view->form = $searchForm;
    }
}
在我的Bootstrap.php中,我有一个模型自动加载器:

protected function _initAutoload() {
    $autoLoader = Zend_Loader_Autoloader::getInstance();
    $resourceLoader = new Zend_Loader_Autoloader_Resource(
        array(
        'basePath'  => APPLICATION_PATH,
        'namespace' => '',
        'resourceTypes' => array(
            'form' => array(
            'path' => 'forms',
            'namespace' => 'Form_',
            ),
            'model' => array(
            'path' => 'models/',
            'namespace' => 'Model_',
            ),
        ),
        )
    );

return $autoLoader;
}

我想知道在哪里可以存储代码,以便在视图中全局生成搜索表单

我的全局布局文件位于
应用程序/layouts/scripts/layout.phtml
中,当前弹出一个动态内容区域:

<div id="main">
    <?php echo $this->layout()->content;?>
</div>

我应该只是将表单添加到此layout.phtml中,还是应该使用一些通用控制器

编辑:很抱歉没有指定这个太多,但如果我想不包括它的1-2个特殊页面(可能是一个管理部分)。。如果我把它硬编码到layout.phtml中,它仍然会出现。。或者我应该提供一个不同的布局文件,比如说,一个管理区域

  • 您可以在控制器插件中创建表单,并以某种方式(通过Zend_Controller_Front?)将其添加到视图变量中,这些变量也可以在布局中访问。但在当前的ZF版本中,它太复杂了(或者我太笨了)

  • 你可以把表单变成一个单件

    class Form_SearchForm ... {
         static function getInstance() {
              static $instance;
              if (!$instance)
                  $instance = new Form_SearchForm();
              return $instance;
         }
    }
    
    现在,不要创建新表单,只需将其作为

    $form = Form_SearchForm::getInstance();
    
  • 您可以将Form_SearchForm的实例放入注册表

  • 我可能错过了一个非常酷的简单方法:)


  • 我会把它分成一部分和一个占位符

    在layout.phtml中:

    <?php if($searchForm = $this->placeHolder('searchForm'): ?>
      <?php echo $searchForm; ?>
    <?php endif; ?>
    
    <?php echo $this->searchForm() ?>
    

    创建一个
    searchAction()
    对性能不好,因为它需要一个全新的调度周期。如果,而且只有当,你有非常复杂的逻辑来证明一个单独的行动是正确的,你才能。如果您只是实例化/分配表单,或者不需要每个请求都使用搜索表单,那么这不是最佳解决方案


    另一种可能是在引导中实例化和分配表单。这种方法打破了关注点之间的分离,但提供了更好的性能

    protected function _initSearchForm()
    {
        $this->bootstrap('view');
    
        $view = $this->getResource('view');
        $searchForm = new Form_SearchForm();
    
        $view->searchForm = $searchForm;
        return $searchForm;
    }
    

    最后,我的首选解决方案是自定义视图帮助器:

    <?php
    
    class My_View_Helper_SearchForm extends Zend_View_Helper_Abstract
    {
        public function searchForm()
        {
            $searchForm = new Form_SearchForm();
            return $searchForm;
        } 
    }
    

    很抱歉,你失去了我,你介意为我的新手扩展一下吗?你更喜欢哪个选项?我想我不知道正确的方法。但我认为最正确的是第一个,但现在太复杂了。将类设为单例很简单,我现在将为此添加一个代码。如何将Form_SearchForm的实例添加到Zend_注册表中,您可以自己弄清楚:)很好奇,将其设置为单身会实现什么?Richard Nguyen正是需要的:我确保它只创建一次,因此,如果表单被处理,它将存储值和验证结果。他将如何使用控制器中的表单?您可以访问视图,从而访问视图帮助器控制器。如果您谈论的是使用Zend_表单实际构建from,那么您可以调用动作帮助器,而不是调用部分帮助器,从而转到搜索_控制器。假设$view是Zend_视图实例。。。“form”是输出表单的操作的名称$查看->占位符('searchForm')->set($view->action('form','search','default));对不起,我很困惑,我是否必须在每个视图中都包含第二个代码段?是的,您希望表单出现在任何视图中。如果你有比没有更多的视图,那么前端控制器插件更容易。。。减少维护。
    
    <?php echo $this->searchForm() ?>