Laravel 扩展表单类

Posted

技术标签:

【中文标题】Laravel 扩展表单类【英文标题】:Laravel extend Form class 【发布时间】:2014-05-18 01:31:44 【问题描述】:

我正在尝试在 L4.1 中扩展 Form 类,但我似乎遗漏了一些东西。我的文件基于 API 命名为 FormBuilder.php,并保存在 app/libraries/extended/FormBuilder.php 中。

<?php namespace Extended;

class FormBuilder extends \Illuminate\html\FormBuilder 

/**
 * Create a text input field.
 *
 * @param  string  $name
 * @param  string  $value
 * @param  array   $options
 * @return string
 */
public function text($name, $value = null, $options = array())

        $options = $options + array('id'=>"field-$name");
        return $this->input('text', $name, $value, $options);



这实际上是我第一次尝试在 Laravel 中扩展核心类。我似乎不知道如何正确扩展像 Form 这样的核心类。

编辑: 我将"app/libraries/extended" 添加到我的composer.json 文件中并同时运行composer.phar updatecomposer.phar dump-autoload,但它似乎仍然使用核心类而不是我的扩展类。我忘了做什么?

【问题讨论】:

错误 500 页面的文本是什么? 这是一个自定义的 500 页面。让我看看我能不能。 另外,验证网络服务器和 Laravel 日志,以防万一。 我假设你已经正确地关闭了你的课程?它只是不在上面的代码中...... 我看到 500 是针对我修复的另一个错误。我编辑了帖子以删除提及错误 500 的任何实例。我正在使用的示例页面加载正常,但它似乎仍在使用核心 Form 类而不是扩展类。 【参考方案1】:

要扩展/交换 Laravel 核心类,您可以创建一个服务提供者:

文件:app/App/Libraries/Extensions/FormBuilder/FormBuilderServiceProvider.php

<?php namespace App\Libraries\Extensions\FormBuilder;

use Illuminate\Support\ServiceProvider as  IlluminateServiceProvider;
use App\Libraries\Extensions\FormBuilder\FormBuilder;

class FormBuilderServiceProvider extends IlluminateServiceProvider 

    /**
     * Indicates if loading of the provider is deferred.
     *
     * @var bool
     */
    protected $defer = true;

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    
        $this->app->bindShared('formbuilder', function($app)
        
            $form = new FormBuilder($app['html'], $app['url'], $app['session.store']->getToken());

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

    /**
     * Get the services provided by the provider.
     *
     * @return array
     */
    public function provides()
    
        return array('formbuilder');
    


为它创建一个外观:

文件:app/App/Libraries/Extensions/FormBuilder/FormBuilderFacade.php

<?php namespace App\Libraries\Extensions\FormBuilder;

use Illuminate\Support\Facades\Facade as IlluminateFacade;

class FormBuilderFacade extends IlluminateFacade 

    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor()  return 'formbuilder'; 


这将是您的命名空间服务类:

文件:app/App/Libraries/Extensions/FormBuilder/FormBuilder.php

<?php namespace App\Libraries\Extensions\FormBuilder;

use \Illuminate\Html\FormBuilder as IlluminateFormBuilder;

class FormBuilder extends IlluminateFormBuilder 

    public function text($name, $value = null, $options = array())
    
        $options = $options + array('id'=>"field-$name");

        return $this->input('text', $name, $value, $options);
    


打开app/config/app.php 和您的服务提供商到列表

'App\Libraries\Extensions\FormBuilder\FormBuilderServiceProvider',

并用你的替换 Laravel 的表单别名

    'Form'            => 'App\Libraries\Extensions\FormBuilder\FormBuilderFacade',

为了测试,我创建了一个这样的路由器:

Route::any('test', function() 

   return e(Form::text('first_name'));

);

它给了我这个结果:

<input id="field-first_name" name="first_name" type="text">

【讨论】:

在任何地方都不需要namespace 命名空间由你决定,但最好全部命名。 这非常适合我的要求。唯一的问题是,如果文件在 Libraries 文件夹 (namespace App\Libraries) 但不在 Extensions 子文件夹 (namespace App\Libraries\Extensions) 中,它可以工作。 我听说 Laravel 有两种扩展核心类的方法。记录一下,这是哪一个? 你只需要重命名命名空间,它们就可以工作了。我只是在答案中将它们全部重命名。关于其他扩展,实际上有不止一种方法可以做到这一点。但是在文档中你会发现一些类有一个extend() 方法,但它不是 FormBuilder 的情况,所以它不起作用,看:laravel.com/docs/extending。在 FormBuilder 中您可以创建宏,但这并不是真正的扩展,因为您不能只重写核心方法。

以上是关于Laravel 扩展表单类的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 6:找不到类“表单”

laravel使用request类进行form表单验证

未找到 Laravel 5 类“表单”

无法将类添加到 Laravel 表单选择

Laravel 5 验证 - 表单元素上的错误类

扩展/覆盖 Laravel 验证器类