nixphp/form

NixPHP Form Plugin to make form handling easier.

Maintainers

Details

github.com/nixphp/form

Source

Issues

Installs: 28

Dependents: 1

Suggesters: 0

Security: 0

Stars: 0

Watchers: 1

Forks: 0

Open Issues: 0

Type:nixphp-plugin

pkg:composer/nixphp/form

v0.1.0 2025-11-30 17:32 UTC

This package is auto-updated.

Last update: 2025-11-30 19:28:18 UTC


README

Logo

NixPHP Form Plugin

โ† Back to NixPHP

nixphp/form

Form handling the NixPHP way โ€” minimal, secure, intuitive, extendable.

This plugin provides form memory, CSRF protection, a flexible Validator system, and a full set of view helpers for easy form handling in your NixPHP applications.

Everything is registered automatically and works without configuration.

๐Ÿ“ฆ Features

  • โœ”๏ธ Form input memory (memory(), memory_checked(), memory_selected())
  • โœ”๏ธ CSRF protection via automatic event listener
  • โœ”๏ธ Validator system with dynamic rule registry
  • โœ”๏ธ Built-in rules: required, email, min, max, boolean
  • โœ”๏ธ Custom rules via Validator::register()
  • โœ”๏ธ View helpers (error(), has_error(), error_class(), validator())
  • โœ”๏ธ Automatically integrates into guard() and the event system
  • โœ”๏ธ Zero configuration โ€” plug and play

๐Ÿ“ฅ Installation

composer require nixphp/form

The plugin registers itself. No additional setup needed.

๐Ÿš€ Usage

๐Ÿง  Form Memory

memory($key, $default = null)

Restores previous user input:

<input name="email" value="<?= memory('email') ?>">

memory_checked($key, $value = 'on')

Works for checkboxes:

<input type="checkbox" name="terms" <?= memory_checked('terms') ?>>

memory_selected($key, $expected)

Works for selects:

<option value="de" <?= memory_selected('country', 'de') ?>>Germany</option>

Memory is powered by param() and persists automatically after POST requests.

๐Ÿงช Validation

Create a Validator and run rules:

validator()->validate(request()->getParsedBody(), [
    'email'    => 'required|email',
    'password' => 'required|min:8',
]);

Check validity:

if (validator()->isValid()) {
    // continue...
}

Custom messages:

validator()->validate($request->getParsedBody(), [
    'name' => 'required|min:3'
], [
    'name' => [
        'required' => 'Please enter your name.',
        'min'      => 'At least %s characters.'
    ]
]);

Get errors:

validator()->getErrorMessages();
validator()->getErrorMessage('email');

๐Ÿงฉ Built-in Validation Rules

The plugin registers these rules automatically:

Validator::register('required', fn($val) => !empty($val), 'Field is required.');
Validator::register('email', fn($val) => (bool)filter_var($val, FILTER_VALIDATE_EMAIL), 'Please enter a valid email address.');
Validator::register('min', fn($val, $p) => empty($val) || mb_strlen((string)$val) >= (int)$p, 'At least %d characters.');
Validator::register('max', fn($val, $p) => empty($val) || mb_strlen((string)$val) <= (int)$p, 'Maximum of %d characters.');
Validator::register('boolean', fn($val) => filter_var($val, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) !== null, 'Is not a boolean value.');

### Adding your own rule:

```php
Validator::register('starts_with', function ($value, $param) {
    return str_starts_with((string)$value, $param);
}, "Value must start with '%s'.");

๐ŸŽจ View Helpers for Errors

error($field, Validator $validator)

Outputs error messages wrapped in <div class="error-msg">.

<?= error('email', $validator) ?>

has_error($field, $validator)

Useful for conditional styling:

<div class="<?= error_class('email', $validator) ?>">

error_class($field, $validator)

Returns "error" if the field has validation errors.

validator()

Returns the Validator instance from the container:

$validator = validator();

is_post()

Detects if the request method is POST.

๐Ÿ›ก๏ธ CSRF Protection

CSRF is enforced automatically for:

  • POST
  • PUT
  • DELETE

unless an Authorization header exists.

Add the token to your form:

<form method="post">
    <input type="hidden" name="_csrf" value="<?= csrf()->generate() ?>">
</form>

Invalid tokens immediately trigger a 400 response before controller execution.

๐Ÿ” Internals

The plugin automatically:

  • Registers built-in validator rules via the container
  • Hooks CSRF validation into Event::CONTROLLER_CALLING
  • Extends the guard with a CSRF service
  • Provides global view helpers for forms
  • Uses param() to manage form memory state

All without configuration.

๐Ÿ“ Requirements

  • nixphp/framework โ‰ฅ 0.1.0
  • nixphp/session โ‰ฅ 0.1.0 (required for CSRF + memory)

๐Ÿ“„ License

MIT License.