This version is outdated. You should upgrade your project to Mako 9.1 or Mako 10.0!
Learn more

Validation



The mako validator provides a simple and consistent way of validating user input.


Usage

First you need to define a set of rules you want to use to validate the input.

$rules =
[
	'username' => ['required', 'min_length(4)', 'max_length(20)'],
	'password' => ['required'],
	'email'    => ['required', 'email'],
];

The rules defined above will make sure that the username, password and email fields are filled in. That the username is between 4 and 20 characters long, and that the email field contains a valid email address.

If all of your fields have one or more rule in common, then you can use the * shortcut.

$rules =
[
	'*'        => ['required'],
	'username' => ['min_length(4)', 'max_length(20)'],
	'email'    => ['email'],
];

Only non-empty fields or fields marked as required are validated.

Next you'll need to create a validation object. The first parameter is the input data you want to validate and the second is the validation rules.

$validator = $this->validator->create($this->request->post(), $rules);

Now you need to check if the input data is valid using the isValid method.

if($validator->isValid())
{
	// Save to database
}
else
{
	// Handle errors
}

You can also use the isInvalid method.

if($validator->isInvalid())
{
	// Handle errors
}
else
{
	// Save to database
}

Retrieving errors is done using the getErrors method.

$errors = $validator->getErrors();

Or by using the optional $errors parameter of the isValid and isInvalid methods.

if($validator->isValid($errors))
{
	// Save to database
}
else
{
	var_dump($errors);
}

An empty array will be returned if there are no errors.


Validation rules

The following validation rules are included with Mako:

Name Description
required Checks that the field isn't empty.
min_length Checks that the field value is long enough (min_length(10)).
max_length Checks that the field value is short enough (max_length(20)).
exact_length Checks that the field value is of the right length (exact_length(20)).
less_than Checks that the field value is less than x (less_than(5)).
less_than_or_equal_to Checks that the field value is less than or equal to x (less_than_or_equal_to(5)).
greater_than Checks that the field value is greater than x (greater_than(5)).
greater_than_or_equal_to Checks that the field value is greater than or equal to x (greater_than_or_equal_to(5)).
between Checks that the field value is between x and y (between(5,10)).
match Checks that the field value matches the value of another field (match("password_confirmation")).
different Checks that the field value is different from the value of another field (different("old_password")).
regex Checks that the field value matches a regex pattern (regex("/[a-z]+/i")).
integer Checks that the field value is a integer.
float Checks that the field value is a float.
natural Checks that the field value is a natural.
natural_non_zero Checks that the field value is a natural non zero.
hex Checks that the field value is valid HEX.
alpha Checks that the field value only contains valid alpha characters.
alpha_unicode Checks that the field value only contains valid alpha unicode characters.
alphanumeric Checks that the field value only contains valid alphanumeric characters.
alphanumeric_unicode Checks that the field value only contains valid alphanumeric unicode characters.
alpha_dash Checks that the field value only contains valid alphanumeric, dash and underscore characters.
alpha_dash_unicode Checks that the field value only contains valid alphanumeric unicode, dash and underscore characters.
email Checks that the field value is a valid email address (uses PHP's filter_var function).
email_domain Checks that the field value contains a valid MX record.
ip Checks that the field value is an IP address (uses PHP's filter_var function).
url Checks that the field value is a valid URL (uses PHP's filter_var function).
in Checks that the field value contains one of the given values (in(["foo","bar","baz"])).
not_in Checks that the field value does not contain one of the given values (not_in(["foo","bar","baz"])).
date Checks that the field value is a valid date (date("Y-m-d")).
before Checks that the field value is a valid date before the provided date (before("Y-m-d","2012-09-25")).
after Checks that the field value is a valid date after the provided date (after("Y-m-d","2012-09-25")).
token Checks that the field value matches a valid session token.
one_time_token Checks that the field value matches a valid session one time token.
uuid Checks that the field value matches a valid uuid.
unique Checks that the field value doesn't exist in the database (unique("users","email")).
exists Checks that the field value exist in the database (exists("users","email")).

Custom messages

All error messages are defined in the app/i18n/*/strings/validate.php language file.

Adding custom field specific error messages can be done using the overrides.messages array:

'overrides' => array
(
	'messages' => array
	(
		'username' => array
		(
			'required' => 'You need a username!',
		),
	),
),

You can also add custom field name translations using the overrides.fieldnames array:

'overrides' => array
(
	'fieldnames' => array
	(
		'email' => 'email address',
	),
),

Validator plugins

You can create your own custom validator plugins. They must extend the mako\validator\plugins\ValidatorPlugin class and implement the mako\validator\plugins\ValidatorPluginInterface interface.

<?php

use mako\validator\plugins\ValidatorPlugin;
use mako\validator\plugins\ValidatorPluginInterface;

class IsFooValidator extends ValidatorPlugin implements ValidatorPluginInterface
{
	protected $ruleName = 'is_foo';

	public function validate($input)
	{
		return mb_strtolower($input) === 'foo';
	}
}

Prefix the $ruleName value with your package name and two colons (::) if your validator is a part of a package.

You can register the plugin with the validation factory, thus making it available to all future validator instances.

$this->validator->registerPlugin(new IsFooValidator);

You can also register it into an existing validator instance.

$validator->registerPlugin(new IsFooValidator);