Getting Started
Formatting Blade
Parsing Templates
Blade Documents
Compilation
Validation
Workspaces
The Blade Parser library provides a simple yet powerful validation system. The validation system can be used to validate individual nodes within a document or entire document instances at once.
This documentation page is intended for those looking to implement their own Blade validators, or are curious to learn more about the system. If you are interested in running existing validators against your Laravel project, consider reading the The Validate Command article instead.
The validation system operates by first parsing the nodes of an input template and then running a series of checks on the resulting nodes. These node checks are created by extending the Stillat\BladeParser\Validation\AbstractNodeValidator
class.
For example, the following sample is the implementation of the core DirectiveSpacingValidator
validator:
1<?php 2 3namespace Stillat\BladeParser\Validation\Validators; 4 5use Stillat\BladeParser\Nodes\AbstractNode; 6use Stillat\BladeParser\Nodes\DirectiveNode; 7use Stillat\BladeParser\Validation\AbstractNodeValidator; 8use Stillat\BladeParser\Validation\ValidationResult; 9use Stillat\BladeParser\Validation\Validators\Concerns\CanIgnoreDirectives;10 11class DirectiveSpacingValidator extends AbstractNodeValidator12{13 use CanIgnoreDirectives;14 15 public function validate(AbstractNode $node): ?ValidationResult16 {17 if (! $node instanceof DirectiveNode || $this->shouldIgnore($node)) {18 return null;19 }20 21 if ($node->hasPreviousNode() && $node->hasWhitespaceOnLeft() == 0) {22 return $this->makeValidationResult($node, "Missing space before [@{$node->content}]");23 }24 25 if ($node->hasNextNode() && $node->hasWhitespaceOnRight() == 0) {26 return $this->makeValidationResult($node, "Missing space after [@{$node->content}]");27 }28 29 return null;30 }31}
Each node validator will receive an AbstractNode
instance. It is up to each validator to analyze the node and decide whether it should return a validation result. The validator implementation should return null
if a node passes all validation checks. Multiple validation results can be returned as an array.
Node validators are added to a BladeValidator
instance using one of the following methods:
addValidator(AbstractNodeValidator $validator)
addValidators(AbstractNodeValidator[] $validators)
Alternatively, validators may extend the Stillat\BladeParser\Validation\AbstractDocumentValidator
class to implement a validator that should evaluate an entire Document. These validator implementations will receive a single Document
instance as their only argument.
For example, the following is how the core InvalidPhpDocumentValidator
validator was implemented:
1<?php 2 3namespace Stillat\BladeParser\Validation\Validators\Documents; 4 5use Stillat\BladeParser\Document\Document; 6use Stillat\BladeParser\Validation\AbstractDocumentValidator; 7use Stillat\BladeParser\Validation\PhpSyntaxValidator; 8use Stillat\BladeParser\Validation\ValidationResult; 9 10class InvalidPhpDocumentValidator extends AbstractDocumentValidator11{12 /**13 * Attempts to detect any invalid PHP syntax in the provided document.14 *15 * @param Document $document The document instance.16 * @return ValidationResult|null17 */18 public function validate(Document $document): ?ValidationResult19 {20 $syntaxValidator = new PhpSyntaxValidator();21 $result = $syntaxValidator->checkDocument($document);22 if (! $result->detectedErrors) {23 return null;24 }25 26 return $result->toValidationResult();27 }28}
Document validators may be registered with one of the following methods:
addDocumentValidator(AbstractDocumentValidator $validator)
addDocumentValidators(AbstractDocumentValidator[] $validators)
It is not recommended to place custom validator implementations within the blade.validation.core_validators
array. The core validators are initialized as singleton objects and have specific requirements for configuration.
Instead, suppose you want to ensure custom validator implementations are available on every BladeValidator
instance created. In that case, you can use the resolving
method provided by Laravel's service container:
1<?php 2 3namespace App; 4 5use Illuminate\Support\ServiceProvider as BaseServiceProvider; 6use Stillat\BladeParser\Validation\BladeValidator; 7 8class ServiceProvider extends BaseServiceProvider 9{10 public function boot()11 {12 $this->app->resolving(BladeValidator::class, function (BladeValidator $validator) {13 // Add your validator implementations here.14 });15 }16}
Adding custom validators in this way provides the most flexibility for custom configuration and lifecycle management.
Returns a collection of node validation results.
1<?php2 3use Illuminate\Support\Collection;4 5public function getResults(): Collection;
Returns a collection of document validation results.
1<?php2 3use Illuminate\Support\Collection;4 5public function getDocumentResults(): Collection;
Adds all the core validator instances to the current BladeValidator
instance.
1<?php2 3use Stillat\BladeParser\Validation\BladeValidator;4 5public function withCoreValidators(): BladeValidator;
Returns the total number of validator instances registered with BladeValidator
instance.
1<?php2 3public function getValidatorCount(): int;
Returns a collection of all registered validator instances.
1<?php2 3use Illuminate\Support\Collection;4 5public function getValidators(): Collection;
Returns a collection containing only the registered node validator instances.
1<?php2 3use Illuminate\Support\Collection;4 5public function getNodeValidators(): Collection;
Returns a collection containing only the registered document validator instances.
1<?php2 3use Illuminate\Support\Collection;4 5public function getDocumentValidators(): Collection;
Tests if the BladeValidator
instance contains the provided validator.
Argument | Description |
---|---|
$validator | The validator to check. |
1<?php2 3use Stillat\BladeParser\Validation\AbstractNodeValidator;4 5public function hasValidatorInstance(6 AbstractNodeValidator $validator7): bool;
Tests if the BladeValidator
instance contains the provided validator.
Argument | Description |
---|---|
$validator | The validator to check. |
1<?php2 3use Stillat\BladeParser\Validation\AbstractDocumentValidator;4 5public function hasDocumentValidatorInstance(6 AbstractDocumentValidator $validator7): bool;
Tests if the BladeValidator
instance contains any validator instance with the provided class name.
Argument | Description |
---|---|
$validatorClass | The class name to check. |
1<?php2 3public function hasValidatorClass(4 string $validatorClass5): bool;
Registers a single node validator instance with the BladeValidator
instance.
Argument | Description |
---|---|
$validator | The node validator instance. |
1<?php2 3use Stillat\BladeParser\Validation\AbstractNodeValidator;4use Stillat\BladeParser\Validation\BladeValidator;5 6public function addValidator(7 AbstractNodeValidator $validator8): BladeValidator;
Adds the validators to validator instance.
Argument | Description |
---|---|
$validators | The validators. |
1<?php2 3use Stillat\BladeParser\Validation\BladeValidator;4 5public function addValidators(6 array $validators7): BladeValidator;
Registers a document validator with the BladeValidator
instance.
Argument | Description |
---|---|
$validator | The validator instance. |
1<?php2 3use Stillat\BladeParser\Validation\AbstractDocumentValidator;4use Stillat\BladeParser\Validation\BladeValidator;5 6public function addDocumentValidator(7 AbstractDocumentValidator $validator8): BladeValidator;
Registers multiple document validators with the BladeValidator
instance.
Argument | Description |
---|---|
$validators | The document validator instances. |
1<?php2 3use Stillat\BladeParser\Validation\BladeValidator;4 5public function addDocumentValidators(6 array $validators7): BladeValidator;
Removes a validator instance with the provided validator class name.
Argument | Description |
---|---|
$validatorClass | The validator class name. |
1<?php2 3use Stillat\BladeParser\Validation\BladeValidator;4 5public function removeValidator(6 string $validatorClass7): BladeValidator;
Runs all registered node validators against the provided node list.
Argument | Description |
---|---|
$nodes | The nodes to validate. |
1<?php2 3use Illuminate\Support\Collection;4 5public function validateNodes(6 array $nodes7): Collection;
Runs all registered document validators against the provided document.
This method will not automatically run registered node validators against the document's nodes.
Argument | Description |
---|---|
$document | The document to validate. |
1<?php2 3use Illuminate\Support\Collection;4use Stillat\BladeParser\Document\Document;5 6public function validateDocument(7 Document $document8): Collection;
The following amazing people help support this site and my open source projects ♥️
If you're interesting in supporting my work and want to show up on this list, check out my GitHub Sponsors Profile.