Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel Form Generator Laravel Package

yeejiawei/laravel-form-generator

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Steps

  1. Installation:

    composer require yeejiawei/laravel-form-generator
    

    Publish the config (if needed):

    php artisan vendor:publish --provider="YeeJiaWei\LaravelFormGenerator\FormGeneratorServiceProvider"
    
  2. 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();
    }
    
  3. Where to Look First:

    • Review the basic usage examples in the README.
    • Check the config/form-generator.php for default settings (e.g., layouts, field types).
    • Inspect the FormGenerator facade/class for available methods (e.g., addInputField, setLayout, addValidationRule).

Implementation Patterns

Core Workflows

  1. 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'],
        ]);
    
  2. Layout and Styling: Override the default layout (e.g., layouts.app) for admin forms:

    FormGenerator::create()
        ->setLayout('layouts.admin.form')
        ->setFormName('Admin Settings');
    
  3. Validation and Routes: Attach validation rules and route names dynamically:

    $form = FormGenerator::create()
        ->addValidationRule('email', 'required|email')
        ->setCreateRouteName('posts.store')
        ->setUpdateRouteName('posts.update');
    
  4. 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);
        }
    }
    
  5. 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 !!}
    

Advanced Patterns

  1. 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'],
        ]);
    
  2. 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',
        ]);
    
  3. 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']);
    
  4. 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);
    

Gotchas and Tips

Pitfalls

  1. Archived Package:

    • The package is archived (last release in 2021). Test thoroughly in staging before production.
    • Consider forking or maintaining a local copy if long-term support is needed.
  2. Limited Documentation:

    • The README lacks examples for advanced use cases (e.g., nested forms, file uploads).
    • Debug by inspecting the FormGenerator class methods and Blade templates in vendor/.
  3. Blade Template Overrides:

    • Custom layouts must extend the package’s default Blade templates (e.g., resources/views/vendor/form-generator/).
    • Override templates by publishing assets:
      php artisan vendor:publish --tag=form-generator-views
      
  4. CSRF and Method Spoofing: Ensure forms include @csrf and @method directives in Blade:

    {!! Form::open(['route' => 'posts.store']) !!}
        @csrf
        @method('POST')
        {!! $form !!}
    {!! Form::close() !!}
    
  5. Field Naming Conflicts: Avoid duplicate field names (e.g., name in nested arrays). Use dot notation:

    ->addInputField('address.street')
    

Debugging Tips

  1. Inspect Generated HTML: Use dd($form->render()) to debug the raw output before rendering.

  2. Check Config Values: Verify config/form-generator.php for default settings (e.g., default_layout, field_types).

  3. Enable Blade Debugging: Add this to AppServiceProvider to debug Blade templates:

    if (config('app.debug')) {
        Blade::compileFn(function ($view) {
            return $view->render();
        });
    }
    
  4. Log Field Definitions: Dump field configurations before rendering:

    $form = FormGenerator::create()->addInputField('title');
    \Log::debug('Field config:', $form->getFieldConfig('title'));
    

Extension Points

  1. 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.
        }
    }
    
  2. 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;
        });
    }
    
  3. 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);
    
  4. 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',
    ];
    
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
jayeshmepani/jpl-moshier-ephemeris-php
elnasnato/laraliveui
labrodev/rest-sdk
sampaui/sampaui
babelqueue/php-sdk
facebook/capi-param-builder-php
babelqueue/symfony
hamzi/corewatch
minionfactory/raw-hydrator
hexters/coinpayment
rjcodes/rjcms
act-training/laravel-permissions-manager
alimarchal/laravel-chart-of-accounts
babenkoivan/elastic-scout-driver
mkwebdesign/filament-watchdog-v5
renatomarinho/laravel-page-speed
zedmagdy/filament-business-hours
renatovdemoura/blade-elements-ui
devgeek/beacon-admin
benjamin-rqt/data-watcher-bundle