为Laravel应用程序中的所有表单设置全局选项

时间:2014-09-29 20:47:43

标签: php forms oop laravel laravel-4

我希望我的laravel应用程序中的所有表单都具有'autocomplete'=>默认为'关闭',除非我指定'autocomplete'=> 'on'..

由于我的应用程序有很多形式,并且laravel是如此棒的框架,我想知道我是否可以设置表单类的全局选项始终自动完成关闭,除非我指定相反的。

有人知道吗?

2 个答案:

答案 0 :(得分:3)

是的,这是可能的。基本思想是您需要扩展两个类:内置的Illuminate\Html\FormBuilderIlluminate\Html\HtmlServiceProvider类,并将HtmlServiceProvider中的app/config/app.php替换为您创建的类。

首先,创建一个MyForm类,它将覆盖FormBuilder所需的功能:

use Illuminate\Html\FormBuilder;

class MyForm extends FormBuilder
{
    /**
     * Open up a new HTML form.
     *
     * @param  array   $options
     * @return string
     */
    public function open(array $options = array())
    {
        // If you haven't specified an autocomplete option, default it to 'off'
        if(!isset($options['autocomplete'])) {
            $options['autocomplete'] = 'off';
        }

        return parent::open($options);
    }
}

接下来,您需要创建一个从Illuminate\Html\HtmlServiceProvider延伸并覆盖registerFormBuilder方法的服务提供商:

use Illuminate\Html\HtmlServiceProvider;
use MyForm;

class FormServiceProvider extends HtmlServiceProvider
{
    public function registerFormBuilder()
    {
        $app = $this->app;
        // Taken From: Illuminate\Html\HtmlServiceProvider
        $app->bindShared('form', function($app) {
            // Replace FormBuilder with MyForm
            $form = new MyForm($app['html'], $app['url'], $app['session.store']->getToken());

            return $form->setSessionStore($app['session.store']);
        });
    }
}

最后,您需要将'Illuminate\Html\HtmlServiceProvider',中的app/config/app.php替换为新的服务提供商。我已经在本地测试Laravel 4.2安装上测试了这个,无需修改Form::open

的调用中的任何内容

答案 1 :(得分:1)

我感觉很懒,所以我只是将行$attributes['autocomplete'] = 'off';添加到文件FormBuilder.php。我在open函数的第108行添加了它。

这是hacky解决方案的一个很好的例子。