arch/repositories

Central repositories passing and receiving data between controller and model

1.5.1 2017-03-13 13:57 UTC

This package is auto-updated.

Last update: 2024-03-23 12:50:36 UTC


README

Laravel Package for Central repositories passing and receiving data from database. This package react as a bridge between Controller, Model and database. All the reusable code should located in one place and called when needed.

Package Installation

  1. Package can be installed using composer, just require it :

    composer require arch/repositories

  2. After install, add ArchServiceProvider to provider array in config/app.php as follow :

'providers' => [
  ............
  Arch\Repositories\ServiceProvider\ArchServiceProvider::class
];

Canal, Repositories and Model Installation

Before everything can be used, we must create Canal and Repositories for the application and make use of trait class for the Model.

1) Generate Repositories

Repositories is a normal php class having all the functionalities to play with the Laravel Query Builder for database querying. You can find out all the available method at Available method section. Use below command for generating repositories :

php artisan shareable:repositories <RepositoriesName> --model=<modelName>

eg : 

php artisan shareable:repositories UserRepositories --model=User

RepositoriesName - Repositories name

modelName - Model name. This model were tied with repositories.

This command will create Repositories file inside App\Repositories directory on the fly. One repositories should have one model that tied with it. For ease of use, create repositories with descriptive name. Eg : UserRepositories, then we know that this repositories belongs to User model.

2) Generate Canal

Canal is a normal php class having all the reusable method that were created to call inside the controller. We didn't call the model directly inside controller instead we use this Canal class for that purpose to manage data passing/retreiving. This class should have methods that call Repositories's method.

php artisan shareable:canal <CanalName>

eg : 

php artisan shareable:canal UserModuleCanal

CanalName - Canal name.

This command will create Canal file inside App\Canal directory on the fly. This class should contains all the reusable code. As example we have UserModule for simple/complex crud operation, user permission and anything else. Then, all the methods can be placed inside UserModuleCanal, and UserModuleCanal can call any of Repositories's method inside of it. Later on, if we have two controller for the Web application and Api stuff with the same behaviour, we can just call the UserModuleCanal for both controller as they all share the same functionality.

3) Make use of traits inside Model

Last, include trait Arch\Util\Instantiate inside our Model that tied with the Repositories as follow :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Arch\Util\Instantiate;

class User extends Model {
   use Instantiate;    
}

Follow these 3 steps for another module. Done!

Usage Example

  1. First, include Canal class inside Controller, eg : UserController :
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Canal\UserModuleCanal as UserCanal; // Canal class

class UserController extends Controller
{
    private $userModule = null;
    
    public function __construct () {
        // instantiate and assign to class member
        $this->userModule = new UserCanal;
    }
    // retrieving all users
    public function index () {
    	
    	dd( $this->userModule->getAllUser() );

    }
}
  1. Create reusable code inside Canal class, eg : UserModuleCanal :
<?php

namespace App\Canal;

use App\Repositories\UserRepositories as UserRepo; // include Repositories
use DB; // for creating custom query


class UserCanal {	
	
	// write method to call Repositories class
	public function getAllUser () {

		$user = new UserRepo; // Instantiate UserRepo object
		return $user->all();  // call UserRepo method and pass data back to Controller
        
	}

}
  1. Simple example of Repositories, eg : UserRepositories :
<?php

namespace App\Repositories;

use Arch\Repositories\Shareables\BaseShareables as BaseAbstract;
use App\User; // Model tied with this repositories
use DB;       // custom database querying

class UserRepositories extends BaseAbstract {	
	
	public function __construct() {
		// Assign to parent Model for data fetching
		$this->model = User::getInstance();
	}
	
    // At here we didn't create all() method, basically we didnt
    // create any method inside this repositories 
    // as all the laravel Query method already
    // available inside this repositories
    // by include this BaseShareables class
    // unless you need complex query that BaseShareables didnt provided for you
    
    // You can do any custom query from database in here
    // by creating custom method, later on, we can call
    // this method inside `Canal` class
}
  1. Map the route to that controller and you're good to go.

Built-in Utilities/Libraries

  • Encryption (Using laravel encryption and Hashids by @ivanakimov)
  • MultiCurl
  • More utilities and libraries will added in future........

1) Encryption

Require the util inside controller directly after namespace keyword :

use Arch\Libs\Fence

Usage example :

a) Encrypt data

Return encrypted data

$encrypted = Fence::encrypt( $var );

b) Decrypt data

Return decrypted data

$encrypted = Fence::decrypt( $var );

c) Hash

Return hashed data

$hashed = Fence::hash( $var );

d) Compare

Return decrypted Data if success, otherwise false

$hashed = 'KJNksdsjdhjunKLJ....';
$encrypted = 'SDxkzjxncjn...';
$encrypted = Fence::compare( $encrypted,$hashed );

e) Encode(Hashids)

Return encrypted data

$encode = Fence::encode( $var ); // produce 15 length alpha numeric characters

f) Decode(Hashids)

Return decrypted data

$decode = Fence::decode( $var );

g) Match(Hashids)

Return decrypted Data if success, otherwise false

$encode = 'KJNksdsjdhjunKLJ....';
$hashed = 'SDxkzjxncjn...';
$hashed = Fence::match( $encode, $hashed );

2) MultiCurl

This util is same with MultiCurl as this package were required its automatically at package installation using composer. Require the util inside controller directly after namespace keyword :

use Arch\Libs\MultiCurl

Usage example : Example can be found directly at MultiCurl. The only different is you need to require the util using use Arch\Libs\MultiCurl instead of individual use Arch\MultiCurl\MultiCurl;. But both are the same. The choices is yours.

Supports

  • Well, just open an issues

Contribute

Feel free to fork and create PR

Authors