Skip to content
Snippets Groups Projects
Commit 05957a88 authored by Craig Smith's avatar Craig Smith
Browse files

feat: base repository pattern

parent ae0ab914
Branches
Tags
No related merge requests found
Pipeline #44297 failed with stages
in 1 minute and 3 seconds
<?php
namespace CustomD\LaravelHelpers\Repository;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Http\Request;
/**
* @template TModelClass
*/
abstract class BaseRepository implements BaseRepositoryInterface
{
/**
*
* @var TModelClass|string
*/
protected $model;
protected Request $request;
/**
* Default attributes to automatically except from request treatments.
*
* @var array<int, string>
*/
protected array $defaultAttributesToExcept = ['_token', '_method'];
/**
* Automatically except defined $defaultAttributesToExcept from the request treatments.
*/
protected bool $exceptDefaultAttributes = true;
public function __construct()
{
if ($this->model) {
$this->setModel($this->model);
}
$this->setRequest(request());
}
public function setRequest(Request $request): BaseRepository
{
$this->request = $request;
return $this;
}
/**
* Find a model by its primary key.
*
* @param int|string $id
* @param array<int, (model-property<TModelClass>|'*')> $columns
* @phpstan-return TModelClass|null
*/
public function findOne(string|int $id, array $columns = ['*'])
{
/** @var TModelClass|null */
$res = $this->getModel()->find($id, $columns);
return $res;
}
/** @phpstan-return TModelClass */
public function getModel()
{
if ($this->model instanceof Model) {
return $this->model;
}
throw new ModelNotFoundException(
'You must declare your repository $model attribute with an Illuminate\Database\Eloquent\Model '
. 'namespace to use this feature.'
);
}
/**
* Set the repository model class to instantiate.
*
* @param string $modelClass
*
* @return BaseRepository
*/
public function setModel(string $modelClass): BaseRepository
{
$this->model = app($modelClass);
return $this;
}
}
<?php
namespace CustomD\LaravelHelpers\Repository;
use Illuminate\Support\Collection;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator;
/**
* @template TModelClass
*/
interface BaseRepositoryInterface
{
public function setModel(string $modelClass): BaseRepository;
public function setRequest(Request $request): BaseRepository;
/**
* Find a model by its primary key.
*
* @param int|string $id
* @param array<int, (model-property<TModelClass>|'*')> $columns
* @phpstan-return TModelClass|null
*/
public function findOne(string|int $id, array $columns = ['*']);
}
<?php
namespace App\Models\Repository;
use App\Models\User;
/**
* @template TModelClass of User
*/
class UserRepository extends BaseRepository
{
protected $model = User::class;
}
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment