Intereting Posts

Расширение класса Laravel Form

Я пытаюсь расширить класс 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">