Я пытаюсь расширить класс Form
в L4.1, но, похоже, что-то не хватает. Мой файл называется FormBuilder.php
на основе API и сохраняется в приложении / 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
но, похоже, он использовал основной класс вместо моего расширенного. Что я забыл сделать?
Чтобы расширить / заменить базовый класс 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">