Laravel is web application framework helps for building modern and full stack web applications.It has powerful features like thorough dependency injection, an expressive database abstraction layer, queues and scheduled jobs, unit and integration testing, and more.
Laravel 7 was released on March 3rd, 2020 continues the improvements made in Laravel 6.x by introducing Laravel Sanctum, routing speed improvements, custom Eloquent casts, Blade component tags, fluent string operations, a developer focused HTTP client, first-party CORS support, improved scoping for route model binding, stub customization, database queue improvements, multiple mail drivers, query-time casts, a new artisan test command, and a variety of other bug fixes and usability improvements.
Laravel 8 released on September 8th, 2020 the improvements made in Laravel 7.x by introducing Laravel Jetstream, model factory classes, migration squashing, job batching, improved rate limiting, queue improvements, dynamic Blade components, Tailwind pagination views, time testing helpers, improvements to artisan serve, event listener improvements, and a variety of other bug fixes and usability improvements.
app/Models Directory
Laravel 7 has no Models directory, and it become incovinient when number of models used in projects exceeds, especially in larger projects. While the artisan:make model command will create the model in the app/Models directory in Laravel 8.
New Landing Page
Laravel 8 comes with a new landing page for a brand new install compared to Laravel 7.
Controllers Routing Namespacing
In Laravel 7, the RouteServiceProvider had an attribute called namespace that was used to prefix the controllers in the routes files. That created a problem when trying to use a callable syntax on controllers, causing Laravel to mistakenly double prefix it.
In Laravel 7 the $namespace property was set to App\Http\Controllers. This change means that controller route definitions will no longer include automatic namespace prefixing.
// routes/web.php
Route::get('/posts', 'AdminController@index');
In Laravel 8 this attribute was removed and now import and use it without the issue. It can also be used for single action controllers that have the __invoke method.
// routes/web.php
use App\Http\Controllers\AdminController;
Route::get('/posts', [AdminController::class, 'index']);
Maintenance Mode
In Laravel 7 , have to specify the IPs that would still be allowed to access the application with the allow option:
php artisan down --allow=127.0.0.1 --allow=192.168.0.0/16
In Laravel 8,no longer need to allow certain IPs explicitly. Instead, you can use the secret option to create a maintenance mode bypass token:
php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515"
You can then access your application while in maintenance mode by appending the token to your application's URL, e.g., https://webrins.com/163087842a-246b-4b66-afa1-dd72a4c43515. The bypass cookie will be saved to your browser, and you can continue navigating your application from its normal URL, e.g., https://webrins.com.
Better Rate Limiting
Laravel includes a middleware to rate limit access to routes within your application. To get started, assign the throttle middleware to a route or a group of routes. The throttle middleware accepts two parameters that determine the maximum number of requests that can be made in a given number of minutes.
Rate limiting in Laravel 7
Route::middleware('auth:api', 'throttle:10,1')->group(function () {
Route::get('/login', function () {
//
});
});
Rate limiting in Laravel 8
In Laravel 8, can define rate limiters in app/Providers/RouteServiceProvider.php using the for method of the RateLimiter facade. The for method will accept a name and a Closure, which returns the rate limiting details that set up.
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;
RateLimiter::for('login', function (Request $request) {
return Limit::perMinute(10);
});
You can now apply this pre-configured rate limiter to routes with throttle: followed by the rate limiter name.
Route::middleware(['throttle:login'])->group(function () {
Route::post('/login', function () {
//
});
Route::post('/register', function () {
//
});
});
Blade component attributes
If you extended a Blade component (e.g. having a component called DangerButton, that extended another component called Button) in Laravel 7, the child button wouldn't have had the $attributes passed down to it. That has changed in Laravel 8 - all child components will the $attributes available, making it easier to build extended components.
Cleaner syntax for closure based event listeners
In Laravel 7 when registering a closure based event listener, you had to first define the event class, then register the closure, and probably type hint the event class for the closure e.g.:
Event::listen(OrderSoftware::class, function(OrderSoftware $event) {
// Do something
});
In Laravel 8, you'll be able to skip the first definition of the event class as the framework will be able to infer it from the type hinted argument - e.g.:
Event::listen(function(OrderSoftware $event) {
// Do something
});
Laravel JetStream & Laravel Fortify
Laravel 7 had a package called laravel/ui whcih provided basic authentication scaffolding - giving you the front (Vue & Bootstrap 4) & back end code for a fully working login system for your application.
In Laravel 8, Laravel JetStream - a new open source package for Laravel 8 to give you an even bigger head start with your applications.
It's a scaffolding package that will set you up with complete front & back end code for lots of common functionality in web applications, including:
Model factory classes
User factory in Laravel 7.x:
// database/factories/UserFactory.php
use Faker\Generator as Faker;
use Illuminate\Support\Str;
$factory->define(App\User::class, function (Faker $faker) {
return [
'name' => $faker->name,
'email' => $faker->unique()->safeEmail,
'email_verified_at' => now(),
'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
'remember_token' => Str::random(10),
];
});
User factory in Laravel 8:
// database/factories/UserFactory.php
namespace Database\Factories;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;
class UserFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = User::class;
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
return [
'name' => $this->faker->name,
'email' => $this->faker->unique()->safeEmail,
'email_verified_at' => now(),
'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
'remember_token' => Str::random(10),
];
}
}
In Laravel 8, factories are now classes that extend the base Laravel factory class. Glancing at the default file, you'll see the model property and definition method. The definition method then returns the model attributes.
Compare this to Laravel 7 and below, where the UserFactory is defined with a Closure and returns the specified model attributes.Both of these still have access to Faker, as expected. Let's look at the difference between using factories in Laravel 7 versus Laravel 8.
Using factories in Laravel 7:
Before this update, you would use the factory helper function in your seeder files to generate model instances.
// database/seeds/UserSeeder.php
class UserSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
// Create three App\User instances
$users = factory(App\User::class, 3)->create();
}
}
Using factories in Laravel 8:
With Laravel 8, you can use the factory directly on the model instance. This is because the default models now include a HasFactory trait, as shown in the simplified code below.
// database/seeders/UserSeeder.php
class UserSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
// Create three App\User instances
User::factory(3)->create();
}
}
// app/Models/User.php
Migration Squashing
In Laravel 7, have to scroll for five minutes when you open up your migrations folder
But using migration squashing feature in Laravel 8 , you can now condense your migration files into a single SQL file with the following commands:
php artisan schema:dump
php artisan schema:dump --prune
In Laravel 8, Laravel will write the new schema file to database/schema. Then when you run your migrations, Laravel will run the SQL from the schema file first before moving on to anything created later in the migrations folder.
I hope you understand all the differences laravel 7 and laravel 8.For more details go tohttps://laravel.com/