yeejiawei/laravel-form-generator
Installation:
composer require yeejiawei/laravel-form-generator
Publish the config (if needed):
php artisan vendor:publish --provider="YeeJiaWei\LaravelFormGenerator\FormGeneratorServiceProvider"
First Use Case:
Generate a basic form for a User model in a controller:
use YeeJiaWei\LaravelFormGenerator\FormGenerator;
public function create()
{
return FormGenerator::create()
->setFormName('Create User')
->addInputField('name')
->addInputField('email')
->setCreateRouteName('users.store')
->render();
}
Where to Look First:
config/form-generator.php for default settings (e.g., layouts, field types).FormGenerator facade/class for available methods (e.g., addInputField, setLayout, addValidationRule).Dynamic Form Generation:
Use addInputField() to dynamically add fields from a model or array:
// From a model (e.g., User)
$form = FormGenerator::create()
->setModel(new User())
->addInputFieldsFromModel(['name', 'email', 'password'])
->setCreateRouteName('users.store');
// From an array
$form = FormGenerator::create()
->addInputFields([
['name' => 'title', 'type' => 'text', 'label' => 'Category Title'],
['name' => 'description', 'type' => 'textarea'],
]);
Layout and Styling:
Override the default layout (e.g., layouts.app) for admin forms:
FormGenerator::create()
->setLayout('layouts.admin.form')
->setFormName('Admin Settings');
Validation and Routes: Attach validation rules and route names dynamically:
$form = FormGenerator::create()
->addValidationRule('email', 'required|email')
->setCreateRouteName('posts.store')
->setUpdateRouteName('posts.update');
Reusable Form Components: Create a base form builder in a service or trait:
// app/Services/FormBuilder.php
class FormBuilder {
public static function buildUserForm($action, $method = 'POST') {
return FormGenerator::create()
->setFormName('User Profile')
->addInputField('name')
->addInputField('email')
->setAction($action)
->setMethod($method);
}
}
Integration with Blade: Render forms in Blade views:
// In a controller
return view('admin.users.create', [
'form' => FormGenerator::create()
->addInputField('name')
->render(),
]);
<!-- resources/views/admin/users/create.blade.php -->
{!! $form !!}
Custom Field Types: Extend the package to support custom input types (e.g., date pickers, select2):
FormGenerator::create()
->addInputField('birthday', 'date', [
'type' => 'text',
'options' => ['class' => 'datepicker'],
]);
Conditional Fields: Use JavaScript or server-side logic to show/hide fields:
FormGenerator::create()
->addInputField('is_admin', 'checkbox')
->addInputField('admin_role', 'select', [
'options' => ['super_admin', 'editor'],
'conditional' => 'is_admin',
]);
Form Tabs or Steps:
Group fields into tabs using the setLayout option or custom Blade templates:
FormGenerator::create()
->setLayout('layouts.form.tabs')
->addTab('Personal Info', ['name', 'email'])
->addTab('Address', ['street', 'city']);
API-Driven Forms: Fetch field definitions from an API or database:
$fields = Cache::remember('form_fields', 60, function() {
return Http::get('api/form-definitions')->json();
});
FormGenerator::create()->addInputFields($fields);
Archived Package:
Limited Documentation:
FormGenerator class methods and Blade templates in vendor/.Blade Template Overrides:
resources/views/vendor/form-generator/).php artisan vendor:publish --tag=form-generator-views
CSRF and Method Spoofing:
Ensure forms include @csrf and @method directives in Blade:
{!! Form::open(['route' => 'posts.store']) !!}
@csrf
@method('POST')
{!! $form !!}
{!! Form::close() !!}
Field Naming Conflicts:
Avoid duplicate field names (e.g., name in nested arrays). Use dot notation:
->addInputField('address.street')
Inspect Generated HTML:
Use dd($form->render()) to debug the raw output before rendering.
Check Config Values:
Verify config/form-generator.php for default settings (e.g., default_layout, field_types).
Enable Blade Debugging:
Add this to AppServiceProvider to debug Blade templates:
if (config('app.debug')) {
Blade::compileFn(function ($view) {
return $view->render();
});
}
Log Field Definitions: Dump field configurations before rendering:
$form = FormGenerator::create()->addInputField('title');
\Log::debug('Field config:', $form->getFieldConfig('title'));
Custom Field Types:
Extend the YeeJiaWei\LaravelFormGenerator\Field class to add new input types:
namespace App\Extensions;
use YeeJiaWei\LaravelFormGenerator\Field;
class CustomSelectField extends Field {
public function render() {
// Custom logic for select2, multiselect, etc.
}
}
Hooks for Pre/Post Rendering: Use service provider booting to modify forms globally:
// app/Providers/FormGeneratorServiceProvider.php
public function boot() {
FormGenerator::macro('addAdminHeader', function() {
$this->setFormName('Admin: ' . $this->formName);
return $this;
});
}
Database-Backed Field Definitions:
Store form fields in a form_fields table and hydrate dynamically:
$fields = DB::table('form_fields')->where('form_type', 'user')->get();
FormGenerator::create()->addInputFields($fields);
Localization: Override labels/placeholders via language files:
// config/form-generator.php
'localization' => [
'namespace' => 'form-generator',
'fallback_locale' => 'en',
];
// resources/lang/en/form-generator.php
return [
'name_label' => 'Full Name',
];
How can I help you explore Laravel packages today?