PHP code example of ttpn18121996 / simple-repository
1. Go to this page and download the library: Download ttpn18121996/simple-repository library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
namespace App\Repositories\Eloquent;
use App\Models\Province;
use App\Repositories\Contracts\ProvinceRepository as ProvinceRepositoryContract;
class ProvinceRepository implements ProvinceRepositoryContract
{
public function getDataSource()
{
return new Province();
}
public function all()
{
return $this->getDataSource()->all();
}
}
namespace App\Repositories\Api;
use App\Repositories\Contracts\ProvinceRepository as ProvinceRepositoryContract;
use Illuminate\Support\Facades\Http;
class ProvinceRepository implements ProvinceRepositoryContract
{
public function getDataSource()
{
return Http::baseUrl('https://api.domain.example');
}
public function all()
{
$response = $this->getDataSource()->get('/provinces');
return $response->success() ? $response->collection() : collect();
}
}
use SimpleRepository\Concerns\HasFilter;
class UserService extends Service
{
use HasFilter;
}
use Illuminate\Contracts\Database\Query\Builder;
use SimpleRepository\FilterAdapter;
use SimpleRepository\FilterDTO;
protected function buildFilter(Builder $query, array|FilterDTO $filters = []): Builder
{
$filters = $filters instanceof FilterDTO ? $filters : FilterAdapter::makeDTO($filters);
// ...
}
use App\Models\User;
use App\Repositories\Eloquent\UserRepository as UserRepositoryContract;
use SimpleRepository\Concerns\HasEloquentSupport;
class UserRepository implements UserRepositoryContract
{
use HasEloquentSupport;
protected ?string $modelName = User::class;
}
protected function buildRelationships(): Builder
{
return $this->model()->with(['roles', 'permissions']);
}
// Get a paginated list of users with roles and permissions for each user.
$users = app(\App\Repositories\Contracts\UserRepository::class)->getPagination($filters);
class UserController
{
public function index(Request $request)
{
$users = $this->userService
->useAuthUser($request->user())
->getList($request->query());
...
}
}
class UserService extends Service
{
public function getList(array $filters = [])
{
if ($this->authUser()->can('view_user')) {
// Do something
}
...
}
}
$this->buildFilter(query: $query, filters: [
'search' => [ // Relative search (operator "like")
'field_1' => 'value1',
'field_2' => 'value2',
],
'or_search' => [ // Relative search (operator "like"). Use the "orWhere" method
'field_1' => 'value1',
'field_2' => 'value2',
],
'filter' => [ // Absolute search (operator "=")
'field_1' => 'value1',
'field_2' => 'value2',
],
'or_filter' => [ // Absolute search (operator "="). Use the "orWhere" method
'field_1' => 'value1',
'field_2' => 'value2',
],
'sort' => [ // Sort data
'field' => 'field_name',
'direction' => 'asc' // asc | desc
],
// If the value is null, the records that have not been deleted will be queried.
// Otherwise, the query will be based on the column name with the value not null.
'deleted' => 'deleted_at', // by default is null
]);
use SimpleRepository\FilterAdapter;
public function index(Request $request)
{
$filterDTO = FilterAdapter::makeDTO($request);
}
namespace App\Services;
class UserService extends Service
{
protected array $transferredFields = [
'name' => 'users.name',
'role_name' => 'roles.name',
];
}
namespace App\Services;
class UserService extends Service
{
protected function getTransferredField(string $field): string
{
return [
'name' => 'users.name',
'role_name' => 'roles.name',
][$field] ?? $field;
}
}
namespace App\Services;
use App\Models\User;
class UserService extends Service
{
public function __construct(
public User $user,
) {
}
public function getById($id)
{
return $this->user->find($id);
}
}
namespace App\Services;
use App\Models\User;
use SimpleRepository\Attributes\ModelFactory;
class UserService extends Service
{
#[ModelFactory(User::class)]
public ?User $user = null;
public function getById($id)
{
return $this->getModel('user')->find($id);
}
}
use SimpleRepository\Concerns\Safetyable;
class MyClass
{
use Safetyable;
public function doSomething($params)
{
return $this->handleSafely(function () {
// Do something
return $data;
}, 'Do something');
}
}
class UserService extends Service
{
#[ModelFactory(User::class)]
protected ?User $user = null;
public function create(array $data)
{
return $this->handleSafely(function () use ($data) {
$user = $this->getModel('user', $data);
$user->save();
return $user;
}, 'Create user');
}
}
return [
...
'log_channel' => 'stack',
];
namespace App\Services\UserService;
public function sampleMethod()
{
/**
* @var \App\Services\RoleService
*/
$roleService = $this->getService('RoleService');
}
namespace App\Services\UserService;
use App\Services\RoleService;
use SimpleRepository\Attributes\ServiceFactory;
class UserService extends Service
{
#[ServiceFactory(RoleService::class)]
public ?RoleService $role = null;
public function sampleMethod()
{
/**
* @var \App\Services\RoleService
*/
$roleService = $this->getService('role');
}
}