【问题标题】:Extending core Laravel 4 component class?扩展核心 Laravel 4 组件类?
【发布时间】:2013-07-01 09:41:18
【问题描述】:

我想调整 Laravel 4 中的 Illuminate\Html\FormBuilder 类,以自动在每个输入中包含一个 CSS 类,对应于输入的类型,例如

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

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

我想知道我是否可以欺骗它以某种方式加载我的课程版本?或者,如果没有,我还能如何顺利、整齐地添加此功能?干杯。

【问题讨论】:

  • 当您可以轻松地使用 CSS 选择器找到这些类型的输入时,似乎需要做很多额外的工作才能让它工作。 真的有必要吗?
  • 在这种情况下,我是个白痴,没有意识到 CSS 选择器可以做到这一点(当你退出开发 18 个月时会发生这种情况)。但作为一个原则,我想知道它是如何完成的,所以我也可以为其他事情做。干杯
  • 在框架的那个级别,我认为您不想覆盖任何方法。相反,使用HTML::macro() 定义您自己的方法。希望这会有所帮助!

标签: php laravel laravel-4


【解决方案1】:

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

【讨论】:

  • 我在该页面上没有看到任何关于表单的内容。
  • @iconoclast 问题与表单无关。
【解决方案2】:

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

相反,我最终选择制作一个 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 类,而无需您每次都重复。希望这可以帮助某人。 =)

【讨论】:

【解决方案3】:

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

【讨论】:

  • 我不觉得创建宏是正确的解决方案,因为它不能解决原始问题,并且以非常笨拙的方式解决它。我对每个元素(例如 Form::radio、Form::whatever)的所有调用都必须更改为通过宏路由,并且它不会促进代码重用。
猜你喜欢
  • 1970-01-01
  • 2015-12-03
  • 2023-03-12
  • 1970-01-01
  • 2013-08-14
  • 2012-09-26
  • 2013-12-29
  • 2013-06-08
  • 2012-12-30
相关资源
最近更新 更多