Hi! I'm Mohamed Said. I work at @laravelphp on weekdays and practise freediving on weekends. Find me as themsaid @twitter and @github.

Back to home

Coming up in laravel 5.3

laravel 5.3 is scheduled to be released in June 2016 based on a proposed release schedule, this post is a list of all the things you can expect in this release.

Implicit controller routes have been removed

Using Route::controller is no longer available in 5.3, the reasons for that change are stated in Pull Request #10777, here's part of it:

This method has quite a lot of issues and also makes routes definitions confusing as they are not directly referenced in routes file. This sometimes may lead to unexpected route definitions (e. g. if method like getFilesystem is added to parent or trait - developer mistake, but may be unnoticed).

It's more likely that this method will be available as a package, so it's up to you to decide if you're going to keep using it or switch to using explicit route definitions, however if you decided to switch it's better to start now.

The Query Builder returns a collection

As of 5.3, the query builder get() method will return an Illuminate\Support\Collection instead of an array. The Pros of such change, as listed by the PR creator, are:

  1. Makes it consistent with Eloquent. You'll find countless questions on StackOverflow asking why some collection method can't be called on a query builder result.
  2. It's just much cleaner than this: collect(DB::table('posts')->get()). Laravel prides itself on making all these tiny interactions more enjoyable. This should not be any different.
  3. Native PHP arrays are just useless.

So if you're expecting an array out of DB::get() anywhere in your application or tests you'll need to update your calls to be DB::get()->all() instead.

Removed functions

  • Str::randomBytes and Str::equals are removed in favour of the native PHP methods random_bytes() and hash_equals().
  • The lists() method is also removed from ELoquent Builder, Query Builder, and Collections. You may use the pluck() method directly.
  • array_build() helper is also removed from the framework as it's no longer used anywhere in the core.
  • Model's withHidden() method is removed in favour of makeVisible(), same goes for Eloquent Collection's withHidden(). So in order for you to make certain fields visible after defining them as hidden using the Model's hidden property, you'll need to use makeVisible().
  • The Collection::whereLoose() method was removed since Collection::where() now supports operators. See here.

New validate() method in Validator

The new method will throw a ValidationException if the Validations fails, here are the different ways you can use this method:

Using the Validation factory:

$validator = Validator::make($data, $rules);


Or on the Validator directly:

Validator::validate($data, $rules);

Or using the helper method:

validator($data, $rules)->validate();

Collection::where() accepts operators

In laravel 5.3 you're able to filter a collection using where() via operators, and also a major change is that the method performs a loose comparison when not given any operators:

$collection = collect([['score' => '3'], ['score' => 3]]);

// Loose comparison by default
$collection->where('score', 3);
// returns [['score' => '3'], ['score' => 3]]

$collection->where('score', '=', 3);
$collection->where('score', '==', 3);
// returns [['score' => '3'], ['score' => 3]]

$collection->where('score', '===', 3);
// returns [['score' => 3]]

Here's a list of all the operators you can use:

= == === <= >= < > <> != !==

With these operators available, the whereLoose() method was removed from the collection class as it's not needed anymore.

Model::firstOrCreate() accepts additional values

With this change you'll be able to do something like:

$user = User::firstOrCreate(
    ['github_id', $githubUser->id], 
    ['avatar' => $githubUser->avatar]

In case a user with the given github_id was found it'll be returned, if not a new user will be created with the given github_id and avatar.

PDO Integer Parameters are now bound as PARAM_INT

Before this change all query bindings were passed as strings, that was ok for most of the cases, however with the introduction of the JSON type in MySQL the need for handling integer values properly became important.

Now all integers and doubles will be bound using PDO::PARAM_INT, the rest of types will be bound as PDO::PARAM_STR as before.

Minimum PHP version

In 5.3 the framework only supports php 5.6, php 7.0, and hhvm.