AthenaeumAthenaeum
Packages
  • next
  • current
  • v9.x
  • v8.x
  • v7.x
  • v6.x
  • v5.x
  • v4.x
  • v3.x
  • v2.x
  • v1.x
Changelog
GitHub
Packages
  • next
  • current
  • v9.x
  • v8.x
  • v7.x
  • v6.x
  • v5.x
  • v4.x
  • v3.x
  • v2.x
  • v1.x
Changelog
GitHub
  • Version 6.x

    • Release Notes
    • Upgrade Guide
    • New to this...
    • Contribution Guide
    • Security Policy
    • Code of Conduct
    • Origin
  • ACL

    • Introduction
    • How to install
    • Setup
    • Permissions
    • Roles
    • Users
    • Cached Permissions
  • Audit

    • Audit
    • How to install
    • Setup
    • Recording
    • Events
  • Circuits

    • Circuits
    • How to install
    • Setup
    • Usage
    • Events
  • Collections

    • Collections
    • How to install
    • Summation

      • Summation Collection
      • Items Processor
  • Config

    • Configuration Loader
    • How to install
    • Setup
    • Load Configuration Files
    • Custom File Parsers
  • Console

    • Command and Schedule Registration
    • How to install
    • Setup
    • Commands
    • Schedules
  • Container

    • IoC Service Container
    • How to install
    • Container
    • List Resolver
  • Core

    • Athenaeum Core Application
    • How to install
    • Setup
    • Usage

      • Configuration
      • Service Providers
      • Service Container
      • Events
      • Caching
      • Logging
      • Console
      • Task Scheduling
      • Exception Handling
      • Extending Core Application
      • Testing
  • Database

    • Introduction
    • How to install
    • Models

      • Instantiatable
      • Sluggable
    • Query

      • Criteria (Query Filter)
  • Dto

    • Data Transfer Object (DTO)
    • How to install
    • Create Interface
    • Implement DTO
    • How to use
    • Populate
    • Export
    • Json
    • Serialization
    • Nested DTOs
    • Array DTO
  • ETags

    • ETags
    • How to install
    • Setup
    • Usage
    • Generators

      • Default Generator
      • Custom Generator
    • Eloquent Models
    • Macros
  • Events

    • Register Listeners and Subscribers
    • How to install
    • Setup
    • Listeners
    • Subscribers
  • Filters

    • Search Filter Utilities
    • Prerequisites
    • How to install
    • Setup
    • Processor
    • Filters Builder
    • Predefined Resources

      • Search Processor
      • Sorting Processor
      • Constraints Processor
      • Matching Processor
    • Tip: Create a base builder
  • Flysystem

    • Introduction
    • Database Adapter

      • Introduction
      • How to install
      • Setup
      • Data Deduplication
      • MIME-Type Detection
  • Http

    • Api

      • Http API
      • How to install
      • Setup
      • Resources

        • Introduction
        • Timestamps
        • Self-Link
        • Relations
        • Registrar
      • Middleware

        • Introduction
        • Request Must Be Json
        • Capture Fields To Select
    • Clients

      • Http Clients
      • How to install
      • Setup
      • Basic Usage
      • Available Methods

        • Fluent Api
        • Protocol Version
        • Base Uri
        • Http Method and Uri
        • Headers
        • Accept & Content-Type
        • Authentication
        • Http Query
        • Payload Format
        • Payload
        • Attachments
        • Cookies
        • Response Expectations
        • Middleware
        • Conditions
        • Criteria
        • Redirects
        • Timeout
        • Debugging
        • Logging
        • Driver Options
        • Driver
      • Http Query Builder

        • Introduction
        • Select
        • Where
        • Dates
        • Include
        • Pagination
        • Sorting
        • Raw Expressions
        • Custom Grammar
    • Cookies

      • Http Cookies
      • How to install
      • Usage
    • Messages

      • Http Messages
      • How to install
      • Serializers
  • Maintenance

    • Modes

      • Maintenance Modes
      • How to install
      • Setup
      • Basic Usage
      • Available Drivers
  • Mime Types

    • MIME-Types
    • How to install
    • Setup
    • Usage
    • Drivers

      • Available Drivers
      • File Info
  • Properties

    • Properties Overload
    • How to install
    • Usage
    • Naming Convention
    • Properties Visibility
  • Redmine

    • Redmine Api Client
    • How to install
    • Setup
    • General Usage

      • Supported Operations
      • Fetch list of resources
      • Find
      • Fetch
      • Create new record
      • Update existing record
      • Delete existing record
      • Relations
    • Available Resources

      • Predefined Resources
      • Attachments
      • Enumerations
      • Issue Relations
      • Users
      • User Groups
      • Roles
      • Project Memberships
      • Versions (Milestones)
      • Issue Categories
      • Trackers
  • Service

    • Service Registrar
    • How to install
    • How to use
  • Streams

    • Streams
    • How to install
    • Setup
    • How to use

      • Introduction
      • Open and Close
      • Raw Resource
      • Seeking
      • Reading
      • Writing
      • Size
      • Truncate
      • Flush
      • Hash
      • MIME-Type
      • Output
      • Locking
      • Transactions
      • Meta
      • Misc
  • Support

    • Introduction
    • How to install
    • Laravel Aware-of Helpers

      • How to use
      • Enforce Via Interface
      • Custom Default
      • Pros and Cons
      • Available Helpers
    • Aware-of Properties

      • Generator
      • Available Aware-of Helpers
    • Live Templates
  • Testing

    • Introduction
    • How to install
    • Test Cases
    • Testing Aware-of Helpers
  • Utils

    • Introduction
    • How to install
    • Array
    • Duration
    • Json
    • Math
    • Memory
    • Method Helper
    • Invoker
    • Populatable
    • String
    • Version
  • Validation

    • Introduction
    • How to install
    • Setup
    • Rules

      • Alpha-Dash-Dot
      • Semantic Version
You are viewing documentation for an outdated version. It is no longer supported!

Processor

A http query parameter processor is responsible for creating appropriate query filters, based on its assigned parameter value.

  • How it works
  • How to create processor
  • Validation
    • Advanced Input Validation
  • Built Filters Map
    • Add filters
    • Obtain filters
    • Obtain all filters
    • Arbitrary meta data

How it works

A query parameter is assigned to the processor. It is then responsible for validating the value of that parameter and create one or more query filters, which are stored inside a BuiltFiltersMap component.

The processor is invoked by a builder, if a http query parameter is matched.

How to create processor

You can create a new processor by extending the BaseProcessor abstraction.

use Aedart\Filters\BaseProcessor;
use Aedart\Contracts\Filters\BuiltFiltersMap;
use Acme\Models\Filters\SearchFilter;

class SimpleSearchProcessor extends BaseProcessor
{
    public function process(BuiltFiltersMap $built, callable $next)
    {
        // E.g. skip if parameter was submitted with empty value...
        $value = $this->value();
        if (empty($value)) {
            return $next($built);
        }
        
        // Create and assign your query filter
        $filter = new SearchFilter($value);
        $built->add($this->parameter(), $filter);
        
        // Finally, process the next processor
        return $next($built);
    }
}

In the above shown example, a search filter instance is created and added to the "built filters map" - a data transfer object, which is passed through each processor. Laravel's pipeline is used behind the scene, for invoking the process() method.

Validation

A received query parameter might contain incorrect or harmful value. You are therefore highly encouraged to validate the received input, before using it in a query filter. The following example shows a possible way to perform validation of a parameter's value.

use Aedart\Filters\Exceptions\InvalidParameter;

class SimpleSearchProcessor extends BaseProcessor
{
    public function process(BuiltFiltersMap $built, callable $next)
    {
        // Fail if parameter's value is invalid...
        $value = $this->value();
        if (empty($value)) {
            throw InvalidParameter::make($this, 'Empty value is not allowed');
        }
        
        // Create and assign your query filter
        $filter = new SearchFilter($value);
        $built->add($this->parameter(), $filter);
        
        // Finally, process the next processor
        return $next($built);
    }
}

The builder that runs your processor will automatically handle any exceptions that inherit from InvalidParameterException¹. Exceptions, of the mentioned kind, will be rethrown as Laravel's ValidationException, which will result in a 422 Unprocessable Entity http response in your typical Laravel Application.

¹: Aedart\Contracts\Filters\Exceptions\InvalidParameterException

Advanced Input Validation

You can also use Laravel's validator and let it do all the heavy lifting. The BaseProcessor offers a reference to the validator factory, via the getValidatorFactory() method.

class SimpleSearchProcessor extends BaseProcessor
{
    public function process(BuiltFiltersMap $built, callable $next)
    {
        $validator = $this->getValidatorFactory()->make(
            // The input...
            [
                'value' => $this->value()
            ],
            
            // Validation rules...
            [
                'value' => 'required|string|min:3|max:150'
            ]
        );
        
        // Obtain valid input... or fail
        $validated = $validator->validated();
        
        // ... remaining not shown
    }
}

Built Filters Map

The BuiltFiltersMap DTO is intended be used as a temporary placeholder of all the filters that processors created.

Add filters

To add one or more filters, from your processor, use the add() method. It accepts two arguments:

  • $key: string key name.
  • filter: Criteria the query filter.
// ... inside your processor's process method ...

$built->add('my-parameter', new SearchFilter());

If a key already exists, then new filters are simply added to that key. This means that the same key can hold multiple query filters.

Obtain filters

To obtain filters, you can use the get() method.

$filters = $built->get('my-parameter');

Obtain all filters

The all() method will return a list of all added filters.

$filters = $built->all();

Arbitrary meta data

Sometimes, your processor might be required to store additional arbitrary data that other processors can use. If that is the case, then you can use setMeta() and getMeta() methods to do so.

// E.g. inside first processor...
$built->setMeta('use_admin_flag', true);

// E.g. inside another processor...
$useAdminFlag = $built->getMeta('use_admin_flag', false);

See Aedart\Contracts\Filters\BuiltFiltersMap for additional reference of available methods.

Edit page
Last Updated: 16/02/2023, 09:10
Contributors: alin, Alin Eugen Deac
Prev
Setup
Next
Filters Builder