Validation for APIs
Good validation practises. API focused.
Kirk Bushell
Who the hell am I?
• Technical Lead for Tectonic Digital (www.tectonic.com.au)
• Software architect for http://awardforce.com
• Technical writer (see: http://kirkbushell.me)
• Open source contributor (Laravel 3/4, various other projects)
• http://github.com/kirkbushell
• Also known as Oddman on IRC, forums.etc.
• @kirkbushell
Disclaimers
This is my first talk.
Sorry.
In addition...
• I'll assume you know a couple of things about validation and
• You know or at least understand some of the concepts of Laravel
4, including:
• Dependency injection and
• The IoC feature
• I start work at 4.30am (apologies if I'm not quite with it)
Why?
• There's been a lot of talk in the community the last 6 months
about validation
• How we can do it well - lots of different opinions
• I have a pretty strong opinion on this matter
What we're going to cover
• A brief history of MVC, the repository pattern and why validation
should be its own domain
• Implementing validation within an API context
• Using exceptions for greater readability
• Catching exceptions to generate API responses automagically
• The end result - cleaner code
What I'm not going to talk about
• RESTful APIs
• The view layer
A brief history of everything MVC.
• A blessing to web development (and software development in
general)
• Fat controllers, skinny models
• Skinny controllers, fat models
• Validation tied up in models (along with everything else)
• We still seem to be stuck on the previous point.
Introducing.. the repository pattern?
• Helped clean up models
• Query building and object management
• So, what about validation?
Validate all the things!
• Validation within models breaks the single responsibility principle
• Validation in models doesn't make much sense if you're using the
repository pattern
• Implemented via the controller or a service (such as a user
registration service)
Implementing validation
The validate method
Please read Jason Lewis' article: http://jasonlewis.me/article/laravel-
advanced-validation
// Validate function from article
protected function validate()
{
$this->validator = Validator::make($this->input, $this->rules);
if ($this->validator->fails())
{
throw new ValidateException($this->validator);
}
}
ValidateException
class ValidateException extends Exception
{
protected $validator;
public function __construct(Validator $validator)
{
$this->message = 'Validation has failed, or something.';
$this->validator = $validator;
}
public function getErrors()
{
return $this->validator->messages();
}
}
Our code, our rules
Implement our own custom rules for user registration:
// UserValidator class
class UserValidator extends Validator
{
public function register()
{
$this->rules = [
'email' => ['required', 'email'],
'password' => ['required']
];
$this->validate();
}
}
Validate!
Within our controller, load up our validator and validate the input.
// UserController
public function postRegister()
{
$input = Input::get();
App::make('UserValidator', [$input])->register();
return User::create($input);
}
Now what?
• When validation fails it will throw an exception:
if ($this->validator->fails())
{
throw new ValidateException($this->validator);
}
• We need to catch that exception and return a nice status code and
error message, along with any validation errors.
• Laravel 4 provides an excellent way of managing this.
Laravel 4 error handling
Create an error handler that is specific to validation exceptions:
App::error(function(ValidateException $exception)
{
$errorResponse = [
'message' => $exception->getMessage(),
'errors' => $exception->getErrors()
];
return Response::json($errorResponse, 422); // Unprocessable entity
});
In conclusion
• Complex validation should be in its own domain
• Helps to clean up our code, making it more readable
• Let the framework handle exceptions for you!
• Best for large applications (not so applicable to small apps)
Thank you.
You can catch me at the following online
locales:
• http://kirkbushell.me
• http://github.com/kirkbushell
• @kirkbushell

More Related Content

PPTX
Api testing libraries using java script an overview
PPTX
Whys and Hows of Automation
PPTX
Automated tests to a REST API
PDF
How To Use Selenium Successfully
PDF
Automated testing
PPTX
Angular Unit Test
PPTX
Selenium Design Patterns
PPTX
REST API testing with SpecFlow
Api testing libraries using java script an overview
Whys and Hows of Automation
Automated tests to a REST API
How To Use Selenium Successfully
Automated testing
Angular Unit Test
Selenium Design Patterns
REST API testing with SpecFlow

What's hot (20)

PPTX
Automated Acceptance Tests in .NET
PDF
Agile Testing
PPTX
Test Your Own Stuff - Scrum Atlanta 2015
PPTX
BDD for APIs
PPTX
Automated Acceptance Tests & Tool choice
PPTX
How to make your functional tests really quick
PPTX
BDD with SpecFlow and Selenium
PPTX
Better End-to-End Testing with Page Objects Model using Protractor
PDF
Practical Tips & Tricks for Selenium Test Automation
PDF
Better Page Object Handling with Loadable Component Pattern - SQA Days 20, Be...
PPTX
Cypress workshop for JSFoo 2019
PDF
Mastering UI automation at Scale: Key Lessons and Best Practices (By Fernando...
PDF
How to Use Selenium, Successfully
PDF
Cypress - Best Practices
PPTX
Introduction to cypress in Angular (Chinese)
PDF
Selenium Tips & Tricks
PPTX
Beyond the Release: CI That Transforms Organizations
PDF
Automated Web Testing using JavaScript
PPTX
Web automation with Selenium for software engineers
PPTX
Angular Unit Testing
Automated Acceptance Tests in .NET
Agile Testing
Test Your Own Stuff - Scrum Atlanta 2015
BDD for APIs
Automated Acceptance Tests & Tool choice
How to make your functional tests really quick
BDD with SpecFlow and Selenium
Better End-to-End Testing with Page Objects Model using Protractor
Practical Tips & Tricks for Selenium Test Automation
Better Page Object Handling with Loadable Component Pattern - SQA Days 20, Be...
Cypress workshop for JSFoo 2019
Mastering UI automation at Scale: Key Lessons and Best Practices (By Fernando...
How to Use Selenium, Successfully
Cypress - Best Practices
Introduction to cypress in Angular (Chinese)
Selenium Tips & Tricks
Beyond the Release: CI That Transforms Organizations
Automated Web Testing using JavaScript
Web automation with Selenium for software engineers
Angular Unit Testing
Ad

Viewers also liked (6)

PDF
WordPress: SEO
PPTX
Repository design pattern in laravel - Samir Poudel
PPTX
Нюансы создания интернет-магазина на WordPress
PDF
WordPress: SEO. Ловим на живца.
PDF
Ведение бизнеса на основе WordPress
PDF
Object Oriented Design Principles
WordPress: SEO
Repository design pattern in laravel - Samir Poudel
Нюансы создания интернет-магазина на WordPress
WordPress: SEO. Ловим на живца.
Ведение бизнеса на основе WordPress
Object Oriented Design Principles
Ad

Similar to Validation for APIs in Laravel 4 (9)

PDF
Comprehensive Validation with Laravel 4
DOCX
Ultimate Laravel Performance Optimization Guide
PPTX
Crafting beautiful software
PPTX
Software Development with PHP & Laravel
PDF
Validations 101
PDF
Building RESTful APIs with Laravel A Complete Guide.pdf
PDF
Form Validation in Flutter with Laravel Form Validation Syntax
DOC
Wheels
PPTX
Top 10 Expert Tips for Writing Clean & Maintainable Code in Laravel
Comprehensive Validation with Laravel 4
Ultimate Laravel Performance Optimization Guide
Crafting beautiful software
Software Development with PHP & Laravel
Validations 101
Building RESTful APIs with Laravel A Complete Guide.pdf
Form Validation in Flutter with Laravel Form Validation Syntax
Wheels
Top 10 Expert Tips for Writing Clean & Maintainable Code in Laravel

Recently uploaded (20)

PDF
02. INDUSTRIAL REVOLUTION & Cultural, Technical and territorial transformatio...
PPTX
1. Effective HSEW Induction Training - EMCO 2024, O&M.pptx
PDF
IMDb_Product_Teardown_product_management
PDF
Snapchat product teardown product management
PDF
B461227.pdf American Journal of Multidisciplinary Research and Review
PPT
linux chapter 1 learning operating system
PDF
Disaster Management_Lecture_ PPT_Dr. Kunjari Mog, NITH.pdf
PDF
Operating systems-POS-U1.2.pdf cse gghhu
PPTX
Cloud Security and Privacy-Module-1.pptx
PDF
Project_Mgmt_Institute_- Marc Marc Marc.pdf
PDF
The Journal of Finance - July 1993 - JENSEN - The Modern Industrial Revolutio...
PDF
Thesis of the Fruit Harvesting Robot .pdf
PDF
ITEC 1010 - Information and Organizations Database System and Big data
PDF
PhD defense presentation in field of Computer Science
PPTX
Downstream processing_in Module1_25.pptx
PDF
IoT-Based Hybrid Renewable Energy System.pdf
PDF
BBC NW_Tech Facilities_30 Odd Yrs Ago [J].pdf
PDF
ForSee by Languify Teardown final product management
PPTX
Ingredients of concrete technology .pptx
PDF
1.-fincantieri-investor-presentation2.pdf
02. INDUSTRIAL REVOLUTION & Cultural, Technical and territorial transformatio...
1. Effective HSEW Induction Training - EMCO 2024, O&M.pptx
IMDb_Product_Teardown_product_management
Snapchat product teardown product management
B461227.pdf American Journal of Multidisciplinary Research and Review
linux chapter 1 learning operating system
Disaster Management_Lecture_ PPT_Dr. Kunjari Mog, NITH.pdf
Operating systems-POS-U1.2.pdf cse gghhu
Cloud Security and Privacy-Module-1.pptx
Project_Mgmt_Institute_- Marc Marc Marc.pdf
The Journal of Finance - July 1993 - JENSEN - The Modern Industrial Revolutio...
Thesis of the Fruit Harvesting Robot .pdf
ITEC 1010 - Information and Organizations Database System and Big data
PhD defense presentation in field of Computer Science
Downstream processing_in Module1_25.pptx
IoT-Based Hybrid Renewable Energy System.pdf
BBC NW_Tech Facilities_30 Odd Yrs Ago [J].pdf
ForSee by Languify Teardown final product management
Ingredients of concrete technology .pptx
1.-fincantieri-investor-presentation2.pdf

Validation for APIs in Laravel 4

  • 1. Validation for APIs Good validation practises. API focused. Kirk Bushell
  • 2. Who the hell am I? • Technical Lead for Tectonic Digital (www.tectonic.com.au) • Software architect for http://awardforce.com • Technical writer (see: http://kirkbushell.me) • Open source contributor (Laravel 3/4, various other projects) • http://github.com/kirkbushell • Also known as Oddman on IRC, forums.etc. • @kirkbushell
  • 4. This is my first talk.
  • 6. In addition... • I'll assume you know a couple of things about validation and • You know or at least understand some of the concepts of Laravel 4, including: • Dependency injection and • The IoC feature • I start work at 4.30am (apologies if I'm not quite with it)
  • 7. Why? • There's been a lot of talk in the community the last 6 months about validation • How we can do it well - lots of different opinions • I have a pretty strong opinion on this matter
  • 8. What we're going to cover • A brief history of MVC, the repository pattern and why validation should be its own domain • Implementing validation within an API context • Using exceptions for greater readability • Catching exceptions to generate API responses automagically • The end result - cleaner code
  • 9. What I'm not going to talk about • RESTful APIs • The view layer
  • 10. A brief history of everything MVC. • A blessing to web development (and software development in general) • Fat controllers, skinny models • Skinny controllers, fat models • Validation tied up in models (along with everything else) • We still seem to be stuck on the previous point.
  • 11. Introducing.. the repository pattern? • Helped clean up models • Query building and object management • So, what about validation?
  • 12. Validate all the things! • Validation within models breaks the single responsibility principle • Validation in models doesn't make much sense if you're using the repository pattern • Implemented via the controller or a service (such as a user registration service)
  • 14. The validate method Please read Jason Lewis' article: http://jasonlewis.me/article/laravel- advanced-validation // Validate function from article protected function validate() { $this->validator = Validator::make($this->input, $this->rules); if ($this->validator->fails()) { throw new ValidateException($this->validator); } }
  • 15. ValidateException class ValidateException extends Exception { protected $validator; public function __construct(Validator $validator) { $this->message = 'Validation has failed, or something.'; $this->validator = $validator; } public function getErrors() { return $this->validator->messages(); } }
  • 16. Our code, our rules Implement our own custom rules for user registration: // UserValidator class class UserValidator extends Validator { public function register() { $this->rules = [ 'email' => ['required', 'email'], 'password' => ['required'] ]; $this->validate(); } }
  • 17. Validate! Within our controller, load up our validator and validate the input. // UserController public function postRegister() { $input = Input::get(); App::make('UserValidator', [$input])->register(); return User::create($input); }
  • 18. Now what? • When validation fails it will throw an exception: if ($this->validator->fails()) { throw new ValidateException($this->validator); } • We need to catch that exception and return a nice status code and error message, along with any validation errors. • Laravel 4 provides an excellent way of managing this.
  • 19. Laravel 4 error handling Create an error handler that is specific to validation exceptions: App::error(function(ValidateException $exception) { $errorResponse = [ 'message' => $exception->getMessage(), 'errors' => $exception->getErrors() ]; return Response::json($errorResponse, 422); // Unprocessable entity });
  • 20. In conclusion • Complex validation should be in its own domain • Helps to clean up our code, making it more readable • Let the framework handle exceptions for you! • Best for large applications (not so applicable to small apps)
  • 22. You can catch me at the following online locales: • http://kirkbushell.me • http://github.com/kirkbushell • @kirkbushell