Apply The Open Closed Principle in Laravel | Part 1

14 Jul 2019 . Laravel . 5K views

I think one of the most popular design principles is Open Closed Principle that most of the PHP developers use in their project. I am going to show you how to use the Open Closed Principle in Laravel. In order to write deeply, this article might have a few sections. Today, I am going to show you the first part.

According to Wikipedia, the definition of the Open-Closed Principle is-

Software entities ... should be open for extension, but closed for modification."

Confused, right?

What is exactly Open-closed principles?

In my word, it tells you that, a method is open to adding new logic in your code (Open for extension), but you can not modify the existing code for adding new logic (Closed for modification).

Real-life Scenario

Imagine you have an admin panel, where you have to create CRUD system for Posts, Users, Categories and so on. To solve this issue, normally we create separate controllers for each and do individual CRUD operation on that, right? For example-

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UsersController extends Controller
{
    public function index()
    {
    	# code...
    }

    public function create()
    {
    	# code...
    }

    public function store(Request $request)
    {
    	# code...
    }

    public function show($id)
    {
    	# code...
    }

    public function edit(Request $request, $id)
    {
    	# code...
    }

    public function delete($id)
    {
    	# code...
    }
}

I am sure, many developers like me think this way. Actually nothing wrong with this concept.

But, I have a different opinion. This way might be ok if you write one CRUD controller/operation like users only. How about if you have more than one CRUD operation like users, posts, categories and so on?

In my opinion, of course, it's not a good practice to write your code this way if you have more than one CRUD implementation. To overcome this challenge, I suggest implementing Open-Closed Principles that allow us to write maintainable code. Let's draw the picture.

What we need?

We are going to implement this structure in Laravel. I expect you to have a Laravel installation. Now, we need to adjust database connection with Laravel in .env file. Then migrate the database with-

php artisan migrate

Then add some record into the users table.

Now we need the following structure in your App\ folder.

  • Interfaces/CrudInterface.php
  • Controllers/UsersController.php
  • Repositories/CrudRepository.php
  • Repositories/UsersRespository.php

Let's start-

First of all, let's update the route in web.php file-

<?php

Route::resource('users', 'UsersController');

Now let's create the UsersController-

php artisan make:controller UsersController

Now create a folder called Interfaces inside the Http folder and then add a file called CrudInterface. I have defined all the possible methods inside the interface. It should be like this-

<?php namespace App\Http\Interfaces;

use Illuminate\Http\Request;

interface CrudInterface{
	// Show list of the user
	public function index();

	// Show create form
	public function create();

    // Store a new record
    public function store(Request $request);

    // Show edit form
    public function edit($id);

    // Update an existing record.
    public function put(Request $request, $id);

    // Delete a record
    public function delete($id);
}

Now whoever wants to implement that, they need to follow this structure in their class. In our case, we want to implement CrudInterface in the UsersRepository. Then let's create UsersRepository inside Repositories folder.


<?php
namespace App\Http\Repositories;

use App\Http\Interfaces\CrudInterface;
use App\User;
use Illuminate\Http\Request;

class UsersRepository implements CrudInterface
{
    // Show list of the user
    public function index(){

    }

    // Show user create form
    public function create(){

    }

    // Store a new user record
    public function store(Request $request){

    }

    // Show User edit form
    public function edit($id){

    }

    // Update user's existing data.
    public function put(Request $request, $id){

    }

    // Delete a user
    public function delete($id){
        
    }
}

So far, the structure is clear enough, right? You will get the code in the GitHub repo.

Well, today I am going to stop here. I will continue the rest of the part in the next episode. If you have any confusion or query, let's discuss in the comment section.

Apply The Open Closed Principle in Laravel | Part 2

Thank you.