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

Forms Laravel Package

nette/forms

Robust PHP form library from Nette for building and validating HTML forms. Provides reusable controls, CSRF protection, server-side validation with clear error handling, rendering helpers, and strong integration with Nette applications for secure, maintainable form workflows.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation:

    composer require nette/forms
    

    For Laravel integration (standalone), add to composer.json:

    "require": {
        "nette/forms": "^3.2"
    }
    
  2. Basic Form Creation:

    use Nette\Forms\Form;
    use Nette\Forms\Controls\TextInput;
    
    $form = new Form();
    $form->addText('username', 'Username:')
         ->addRule(Form::MIN_LENGTH, 'Too short', 3)
         ->addSubmit('send', 'Send');
    
    // Handle submission
    $form->onSuccess[] = function ($form) {
        $values = $form->getValues();
        // Process $values['username']
    };
    
  3. Rendering in Blade:

    echo $form->render();
    

    Or use Latte (if integrated) with {formPrint $form}.

First Use Case

Create a login form with validation:

$form = new Form();
$form->addText('email', 'Email')
     ->addRule(Form::EMAIL, 'Invalid email')
     ->addPassword('password', 'Password')
     ->addRule(Form::MIN_LENGTH, 'Too short', 6)
     ->addSubmit('login', 'Login');

$form->onSuccess[] = function ($form) {
    $email = $form->getValue('email');
    // Authenticate user
};

Implementation Patterns

Core Workflows

  1. Form Initialization & Submission:

    // In Laravel controller
    public function create(Form $formFactory) {
        $form = $formFactory->create();
        // Add controls, rules, etc.
        return view('form.view', ['form' => $form]);
    }
    
    public function handle(Form $formFactory, Request $request) {
        $form = $formFactory->get($request->get('form_id'));
        if ($form->isSubmitted() && $form->isValid()) {
            $values = $form->getValues();
            // Process
        }
        return redirect()->back();
    }
    
  2. Dynamic Forms (Laravel + DI):

    // Register in `services.php`
    $container->addService('formFactory', function () {
        return new Nette\Forms\Container();
    });
    
    // Usage
    $form = $container->get('formFactory');
    $form->addText('dynamic_field')->addRule(Form::FILLED);
    
  3. Validation Rules:

    // Built-in rules
    $form->addText('age')->addRule(Form::INTEGER, 'Must be integer')
         ->addRule([$form, 'validateAge'], 'Too young');
    
    // Custom validator
    public function validateAge($value, Form $form) {
        return $value >= 18 || $form->addError('Must be 18+');
    }
    
  4. Client-Side Validation:

    // Auto-generated via `netteForms.js`
    $form->addText('name')->addRule(Form::MIN_LENGTH, 'Too short', 2);
    // Renders with `data-nette-rules="minLength:2"`
    
  5. File Uploads:

    $form->addUpload('avatar')
         ->addRule(Form::MAX_FILE_SIZE, 'Too large', 5 * 1024 * 1024)
         ->addRule(Form::IMAGE, 'Must be image');
    

Integration Tips

  • Laravel Blade: Use {{ $form->render() }} or extract controls:
    @foreach ($form->getControls() as $control)
        <div>{{ $control->getLabel() }}</div>
        {{ $control->getControl()->render() }}
    @endforeach
    
  • Latte Integration: Replace Blade with Latte templates for {formPrint $form}.
  • CSRF Protection: Enabled by default (uses SameSite cookies).
  • Error Handling:
    if (!$form->isValid()) {
        foreach ($form->getErrors() as $error) {
            echo $error->getMessage();
        }
    }
    

Gotchas and Tips

Pitfalls

  1. Validation Scope:

    • getValues() returns only validated controls by default. Use:
      $form->getValues(true); // All values (including invalid)
      
    • BC Break: getValues() in v3.2+ respects setValidationScope().
  2. Latte Dependency:

    • Some features (e.g., {formPrint}) require Latte. For Blade-only apps:
      use Nette\Forms\Rendering\DefaultFormRenderer;
      $renderer = new DefaultFormRenderer();
      echo $renderer->render($form);
      
  3. Client-Side Rules:

    • Only controls with data-nette-rules are validated client-side. Explicitly add rules:
      $form->addText('field')->addRule(Form::FILLED)->setHtmlAttribute('data-nette-rules', 'filled');
      
  4. Enum Support:

    • Use addEnum() with BackedEnum:
      enum Status { ACTIVE, INACTIVE }
      $form->addEnum('status', Status::class);
      
  5. Hidden Fields:

    • addHidden() accepts any type (unlike setDefaultValue):
      $form->addHidden('user_id')->setValue($user->id);
      

Debugging Tips

  1. Validation Errors:

    • Check $form->getErrors() for form-level errors and $control->getErrors() for field-specific issues.
    • Use addRule(Form::CUSTOM, 'Custom message') for granular control.
  2. CSRF Issues:

    • Ensure SameSite cookies are supported (PHP 8.1+). For older PHP:
      $form->setHtmlAttribute('data-nette-csrf', true);
      
  3. File Uploads:

    • Validate upload_max_filesize in PHP.ini and use:
      $form->addUpload('file')->addRule(Form::MAX_FILE_SIZE, null, 10 * 1024 * 1024);
      
  4. Type Safety:

    • Leverage PHP 8.1+ native types:
      $form->addText('age')->addRule(Form::INTEGER)->setType('int');
      

Extension Points

  1. Custom Validators:

    class CustomValidator extends Nette\Forms\Validator {
        public function validate($value, Form $form) {
            return $value === 'secret' || $form->addError('Invalid');
        }
    }
    $form->addText('secret')->addRule(new CustomValidator());
    
  2. Override Rendering:

    $renderer = new DefaultFormRenderer();
    $renderer->setElementPrototype('div', '<div class="form-group">%html%</div>');
    echo $renderer->render($form);
    
  3. Dynamic Controls:

    $form->addDynamic('dynamic_field')
         ->addRule(Form::FILLED)
         ->onValidate[] = function ($control, $value) {
             if (empty($value)) {
                 $control->addError('Required');
             }
         };
    
  4. Laravel Service Provider:

    // app/Providers/NetteFormsServiceProvider.php
    public function register() {
        $this->app->singleton('form.factory', function () {
            return new Nette\Forms\Container();
        });
    }
    
  5. Blueprint Generation:

    • Use Blueprint for DTOs:
      use Nette\Forms\Blueprint;
      $blueprint = new Blueprint($form);
      $blueprint->generate('UserDto.php');
      
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.
codraw/entity-migrator
codraw/doctrine-extra
codraw/aws-tool-kit
codraw/validator
codraw/workflow
codraw/open-api
codraw/cron-job
codraw/process
codraw/log
nexmo/api-specification
capell-app/block-library
axium/identity
cetria/laravel-dummy-models
cetria/reflection-helper
agropredict/sso-auth-bundle
evolvestudio/spam-protection
datacore/hub-sdk
develia/commons
cuci/prototurk-sdk
cuci/prototurk-sdk-symfony