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


Setting a global option for all forms in a Laravel application

我希望我的laravel应用程序中的所有表单默认情况下都具有"autocomplete"=>"off",除非我指定"autocomplete"=>"on"。。

由于我的应用程序有很多表单,而laravel是一个非常棒的框架,我想知道我是否可以将表单类的全局选项设置为始终自动完成,除非我指定相反的选项。

有人知道这件事吗?

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

首先,创建一个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']);
        });
    }
}

最后,您需要用新的服务提供商替换app/config/app.php中的'Illuminate'Html'HtmlServiceProvider',。我已经在本地测试Laravel 4.2安装上测试了这一点,并且无需修改对Form::open 的调用中的任何内容即可工作

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

这是一个巧妙的解决方案的好例子。