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 update
和composer.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 扩展表单类的主要内容,如果未能解决你的问题,请参考以下文章