扩展核心Laravel 4组件类?

时间:2013-07-03 15:43:50

标签: php laravel laravel-4

我想调整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中看过,并且只有对HTML Fascade类的引用。我不确定如何或在哪里转换为Illuminate \ Support \ ServiceProvider \ HtmlServiceProvider类,但该类硬编码FormBuilder类,ala

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']);
    });
}

我想知道我是否能以某种方式欺骗它加载我的版本?或者如果没有,我还能如何顺利和整洁地添加这个功能?欢呼声。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我也尝试过这个问题,因为我想和你做同样的事情,部分是出于扩展核心类的兴趣,但也停止重复自己(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 );
});

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

现在在你的观点中,而不是:

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

使用:

HTML::submit( 'Submit' );

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

答案 2 :(得分:0)

没有必要扩展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