扩展核心Laravel 4组件类


Extending core Laravel 4 component class?

我想调整Laravel 4中的Illuminate''Html''FormBuilder类,使其在每个输入中自动包含一个CSS类,与输入类型相对应,例如<input type="radio"class="radio"/>

我创建了自己的类,它扩展了原来的:

namespace Shady;
class FormBuilder extends Illuminate'Html'FormBuilder {
    public function input($type, $name, $value = null, $options = array()) {
        $options['class'] = isset($options['class'])
                ? implode(' ', array_unique(array_merge(array($type), explode(' ', $options['class']))))
                : $type;
        parent::input($type, $name, $value, $options);
    }
}

现在,问题是,我如何让Laravel 4使用它?

我在app/config/app.php中查看过,其中只有一个对HTMLFascade类的引用。我不确定这是如何或在哪里转换为Illuminate''Support''ServiceProvider''HtmlServiceProvider类的,但该类对FormBuilder类进行了硬编码,即

protected function registerFormBuilder()
{
    $this->app['form'] = $this->app->share(function($app)
    {
        $form = new FormBuilder($app['html'], $app['url'], $app['session']->getToken());
        return $form->setSessionStore($app['session']);
    });
}

我想知道我是否可以欺骗它以某种方式加载我的类版本?或者,如果没有,我该如何平滑、整洁地添加此功能?干杯

文档中有一个关于扩展Laravel的新章节应该会有所帮助:http://laravel.com/docs/extending

我也尝试过解决这个问题,因为我想和你做完全一样的事情,部分是出于扩展核心类的兴趣,但也为了停止重复自己(DRY)每次想要提交按钮时在第二个(选项)数组参数中传递相同的两个类,但没有成功。

相反,我最终选择了制作一个HTML宏,正如上面其他人所建议的那样,但这里有一个实际的例子,供其他可能遇到这种情况的人使用。

示例:

将以下代码保存到app/macros.php(默认情况下该文件不存在,因此创建它):

HTML::macro( 'submit', function( $value = null, $options = array() )
{
    $options = array_merge( $options, array( 'class' => 'btn btn-info' ) );
    return Form::input( 'submit', null, $value, $options );
});

现在通过在app/start/global.php的底部添加require app_path().'/macros.php';来包含macros.php。

现在在你看来,而不是:

Form::submit( 'Submit', array( 'class' => 'btn btn-info' ) );

用途:

HTML::submit( 'Submit' );

它将生成相同的提交按钮,默认情况下允许与Laravel相同的参数,但会自动将btnbtn-info类添加到按钮中,而无需每次重复。希望这能帮助到别人

没有必要扩展HTML助手类。相反,使用CSS选择器来选择元素。

至于制作自己的方法,您可以使用HTML::macro()

请参阅:http://laravel.com/api/source-class-Illuminate.Html.HtmlBuilder.html#32

以及:http://laravel.com/api/source-class-Illuminate.Html.HtmlBuilder.html#390