relief_applications / symfony-request-validator-bundle
Installs: 14 435
Dependents: 0
Suggesters: 0
Security: 0
Stars: 1
Watchers: 4
Forks: 0
Open Issues: 0
Type:symfony-bundle
Requires
- php: >=7.0
- symfony/framework-bundle: >=2.5.6
This package is auto-updated.
Last update: 2024-10-11 00:34:16 UTC
README
Step 1: Download the Bundle
Open a command console, enter your project directory and execute the following command to download the latest stable version of this bundle:
$ composer require relief_applications/symfony-request-validator-bundle @dev
This command requires you to have Composer installed globally, as explained in the installation chapter of the Composer documentation.
Step 2: Enable the Bundle
Then, enable the bundle by adding it to the list of registered bundles
in the app/AppKernel.php
file of your project:
<?php // app/AppKernel.php // ... class AppKernel extends Kernel { public function registerBundles() { $bundles = array( // ... new RA\RequestValidatorBundle\RARequestValidatorBundle(), ); } }
Step 3: Configuration
# app/config/services.yml according to your project path imports: - { resource: "@RARequestValidatorBundle/Resources/config/services.yml" }
Step 4: Default routing
To test our default controller
# app/config/routing.yml according to your project path RequestValidatorBundle: resource: "@RARequestValidatorBundle/Resources/config/routing.yml"
Step 5: Usage
1. Define a custom constraints class
this class should extend RA\RequestValidatorBundle\RequestValidator\Constraints. The list of constraints is available here https://symfony.com/doc/current/reference/constraints.html
<?php namespace RequestValidatorBundle\Custom; use RA\RequestValidatorBundle\RequestValidator\Constraints as RequestValidatorConstraints; use Symfony\Component\Validator\Constraints\Choice; use Symfony\Component\Validator\Constraints\Collection; use Symfony\Component\Validator\Constraints\GreaterThan; use Symfony\Component\Validator\Constraints\NotBlank; use Symfony\Component\Validator\Constraints\NotEqualTo; use Symfony\Component\Validator\Constraints\Optional; use Symfony\Component\Validator\Constraints\Type; /** * TopicsConstraints * * A special class for topic constraints */ class TopicsConstraints extends RequestValidatorConstraints { protected function configure() : array { //Reusable rules can be store into variables starting by 'common' $commonCategoryId = new Optional ([ new Type('numeric'), new GreaterThan(0) ]); $commonNotBlank = new NotBlank(); return [ 'topics' => [ // rules for URI fields 'query' => new Collection([ 'method' => new Optional ([new Choice(['by'])]), 'category_id' => $commonCategoryId ]), // rules for POSTED fields 'request' => new Collection([ 'category_id' => $commonCategoryId, 'title' => $commonNotBlank, 'description' => $commonNotBlank, 'message' => $commonNotBlank ]), ], // rules for ANY fields 'topics2' => new Collection([ 'category_id' => $commonCategoryId, 'title' => $commonNotBlank, 'description' => $commonNotBlank, 'message' => $commonNotBlank ]), ]; } }
2. Using annotations
<?php //... use RequestValidatorBundle\Custom\TopicsConstraints; //our custom constraints class use RA\RequestValidatorBundle\Annotations\ValidateQuery; use RA\RequestValidatorBundle\Annotations\ValidateRequest; class TopicController extends Controller { /** * @Get("/", name="get_all_topics") * @ValidateQuery( configuration="topics", constraintsClass=TopicsConstraints::class) * Get a table of all the topics */ public function getAllAction(Request $request){ $categoryId = $request->get('category_id'); //... } /** * @Post("/", name="create_topic") * @ValidateRequest( configuration="topics", constraintsClass=TopicsConstraints::class) * Get a table of all the topics */ public function createAction(Request $request){ $categoryId = $request->request->get('category_id'); $title = $request->request->get('title'); $description = $request->request->get('description'); $messageContent = $request->request->get('message'); //... }
3. Using functions
<?php //... use RequestValidatorBundle\Custom\TopicsConstraints; //our custom constraints class use RA\RequestValidatorBundle\RequestValidator\ValidationException as RequestValidatorValidationException; class TopicController extends Controller { /** * @Get("/", name="get_all_topics") * Get a table of all the topics */ public function getAllAction(Request $request){ try { $validator = $this->get('request_validator'); $this->validator->validateQuery('topics',TopicsConstraints::class); } catch (RequestValidatorValidationException $e) { return new JsonResponse($e->getErrors(), $e->getCode()); } $categoryId = $request->get('category_id'); } /** * @Post("/", name="create_topic") * Get a table of all the topics */ public function createAction(Request $request){ try { $validator = $this->get('request_validator'); $this->validator->validateRequest('topics',TopicsConstraints::class); } catch (RequestValidatorValidationException $e) { return new JsonResponse($e->getErrors(), $e->getCode()); } $categoryId = $request->request->get('category_id'); $title = $request->request->get('title'); $description = $request->request->get('description'); $messageContent = $request->request->get('message'); }
4. Using ValidateAny
This method check both, URI and posted parameters. When using ValidateAny, the configuration defined into the constraints class can only contain a constraints collection. Here we use topics2. ValidateAny can also be used as a function in the controller body. For now, ValidateAny will merge request fields and query fields if they have the same name.
<?php //... use RequestValidatorBundle\Custom\TopicsConstraints; //our custom constraints class use RA\RequestValidatorBundle\Annotations\ValidateAny; class TopicController extends Controller { /** * @Get("/", name="get_all_topics") * @ValidateAny( configuration="topics2", constraintsClass=TopicsConstraints::class) * Get a table of all the topics */ public function getAllAction(Request $request){ $categoryId = $request->get('category_id'); //... } /** * @Post("/", name="create_topic") * @ValidateAny( configuration="topics2", constraintsClass=TopicsConstraints::class) * Get a table of all the topics */ public function createAction(Request $request){ $categoryId = $request->request->get('category_id'); $title = $request->request->get('title'); $description = $request->request->get('description'); $messageContent = $request->request->get('message'); //... }