Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
No results found
Show changes
Commits on Source (5)
{"version":1,"defects":{"CustomD\\LaravelHelpers\\Tests\\DateHandlingTest::testDatesBasedOnUserAndSystemTimezone":7,"CustomD\\LaravelHelpers\\Tests\\DateHandlingTest::testMultipleCarbonInstances":8,"CustomD\\LaravelHelpers\\Tests\\DateHandlingTest::testSetsViaMiddleware":8,"CustomD\\LaravelHelpers\\Tests\\DateHandlingTest::testSetsViaMiddlewareWithHeader":8,"CustomD\\LaravelHelpers\\Tests\\DatabaseMacrosTest::test_where_null_or_empty":8,"CustomD\\LaravelHelpers\\Tests\\DatabaseMacrosTest::test_or_where_null_or_empty":8,"CustomD\\LaravelHelpers\\Tests\\DatabaseMacrosTest::test_where_not_null_or_empty":8,"CustomD\\LaravelHelpers\\Tests\\DatabaseMacrosTest::test_or_where_not_null_or_empty":8,"CustomD\\LaravelHelpers\\Tests\\DatabaseMacrosTest::test_has_one_nullable":8,"CustomD\\LaravelHelpers\\Tests\\DatabaseMacrosTest::test_has_one_not_nullable":8,"CustomD\\LaravelHelpers\\Tests\\DatabaseMacrosTest::test_belongs_to_nullable":8,"CustomD\\LaravelHelpers\\Tests\\DatabaseMacrosTest::test_belongs_to_not_nullable":8,"CustomD\\LaravelHelpers\\Tests\\LaravelHelpersTest::testExecuteHelperCallsActionWithNoArgs":8,"CustomD\\LaravelHelpers\\Tests\\LaravelHelpersTest::testExecuteHelperCallsActionWithOneArg":8,"CustomD\\LaravelHelpers\\Tests\\LaravelHelpersTest::testExecuteHelperCallsActionWithOneArgAsArray":8,"CustomD\\LaravelHelpers\\Tests\\LaravelHelpersTest::testExecuteHelperCallsActionWithMultipleArgs":8,"CustomD\\LaravelHelpers\\Tests\\LaravelHelpersTest::testExecuteHelperCallsActionWithArrayAsArgs":8,"CustomD\\LaravelHelpers\\Tests\\StringMacrosTest::testReverseStringMacro":8,"CustomD\\LaravelHelpers\\Tests\\DatabaseMacrosTest::test_case_insensitive_iwhere":7},"times":{"CustomD\\LaravelHelpers\\Tests\\DatabaseMacrosTest::test_where_null_or_empty":0.027,"CustomD\\LaravelHelpers\\Tests\\DatabaseMacrosTest::test_or_where_null_or_empty":0.002,"CustomD\\LaravelHelpers\\Tests\\DatabaseMacrosTest::test_where_not_null_or_empty":0.002,"CustomD\\LaravelHelpers\\Tests\\DatabaseMacrosTest::test_or_where_not_null_or_empty":0.002,"CustomD\\LaravelHelpers\\Tests\\DatabaseMacrosTest::test_has_one_nullable":0.012,"CustomD\\LaravelHelpers\\Tests\\DatabaseMacrosTest::test_has_one_not_nullable":0.005,"CustomD\\LaravelHelpers\\Tests\\DatabaseMacrosTest::test_belongs_to_nullable":0.003,"CustomD\\LaravelHelpers\\Tests\\DatabaseMacrosTest::test_belongs_to_not_nullable":0.002,"CustomD\\LaravelHelpers\\Tests\\DateHandlingTest::testDatesBasedOnUserAndSystemTimezone":0.015,"CustomD\\LaravelHelpers\\Tests\\DateHandlingTest::testSetsViaMiddleware":0.001,"CustomD\\LaravelHelpers\\Tests\\DateHandlingTest::testSetsViaMiddlewareWithHeader":0,"CustomD\\LaravelHelpers\\Tests\\LaravelHelpersTest::testExecuteHelperCallsActionWithNoArgs":0.007,"CustomD\\LaravelHelpers\\Tests\\LaravelHelpersTest::testExecuteHelperCallsActionWithOneArg":0,"CustomD\\LaravelHelpers\\Tests\\LaravelHelpersTest::testExecuteHelperCallsActionWithOneArgAsArray":0,"CustomD\\LaravelHelpers\\Tests\\LaravelHelpersTest::testExecuteHelperCallsActionWithMultipleArgs":0,"CustomD\\LaravelHelpers\\Tests\\LaravelHelpersTest::testExecuteHelperCallsActionWithArrayAsArgs":0,"CustomD\\LaravelHelpers\\Tests\\StringMacrosTest::testReverseStringMacro":0,"CustomD\\LaravelHelpers\\Tests\\DateHandlingTest::testMultipleCarbonInstances":0,"CustomD\\LaravelHelpers\\Tests\\DatabaseMacrosTest::test_case_insensitive_iwhere":0.002}}
\ No newline at end of file
# [4.9.0](https://git.customd.com/composer/Laravel-Helpers/compare/v4.8.0...v4.9.0) (2023-11-02)
### Features
* base repository pattern ([05957a8](https://git.customd.com/composer/Laravel-Helpers/commit/05957a8844354aadfc9ebe1395208870d55bac7f))
# [4.8.0](https://git.customd.com/composer/Laravel-Helpers/compare/v4.7.0...v4.8.0) (2023-07-13)
......
......@@ -138,6 +138,8 @@ pubic function timezone(): Attribute
{
return Attribute::get(fn($value) => $value ?? config('app.user_timezone'));
}
```
Additinoally you can set defaults on the timezone via the attributes method or a setter or even in the migration.
3. in your app config file add the `user_timezone` parameter.
......
parameters:
ignoreErrors:
-
message: "#^Class CustomD\\\\LaravelHelpers\\\\Repository\\\\BaseRepository implements generic interface CustomD\\\\LaravelHelpers\\\\Repository\\\\BaseRepositoryInterface but does not specify its types\\: TModelClass$#"
count: 1
path: src/Repository/BaseRepository.php
-
message: "#^Method CustomD\\\\LaravelHelpers\\\\Repository\\\\BaseRepository\\:\\:setModel\\(\\) return type with generic class CustomD\\\\LaravelHelpers\\\\Repository\\\\BaseRepository does not specify its types\\: TModelClass$#"
count: 1
path: src/Repository/BaseRepository.php
-
message: "#^Method CustomD\\\\LaravelHelpers\\\\Repository\\\\BaseRepository\\:\\:setRequest\\(\\) return type with generic class CustomD\\\\LaravelHelpers\\\\Repository\\\\BaseRepository does not specify its types\\: TModelClass$#"
count: 1
path: src/Repository/BaseRepository.php
-
message: "#^Parameter \\#1 \\$modelClass of method CustomD\\\\LaravelHelpers\\\\Repository\\\\BaseRepository\\<TModelClass\\>\\:\\:setModel\\(\\) expects string, string\\|TModelClass of mixed given\\.$#"
count: 1
path: src/Repository/BaseRepository.php
-
message: "#^Type mixed in generic type Illuminate\\\\Database\\\\Eloquent\\\\Collection\\<int, mixed\\> in PHPDoc tag @return is not subtype of template type TModel of Illuminate\\\\Database\\\\Eloquent\\\\Model of class Illuminate\\\\Database\\\\Eloquent\\\\Collection\\.$#"
count: 2
path: src/Repository/BaseRepository.php
-
message: "#^Type mixed in generic type Illuminate\\\\Database\\\\Eloquent\\\\Collection\\<int, mixed\\> in PHPDoc tag @var is not subtype of template type TModel of Illuminate\\\\Database\\\\Eloquent\\\\Model of class Illuminate\\\\Database\\\\Eloquent\\\\Collection\\.$#"
count: 2
path: src/Repository/BaseRepository.php
-
message: "#^Method CustomD\\\\LaravelHelpers\\\\Repository\\\\BaseRepositoryInterface\\:\\:setModel\\(\\) return type with generic class CustomD\\\\LaravelHelpers\\\\Repository\\\\BaseRepository does not specify its types\\: TModelClass$#"
count: 1
path: src/Repository/BaseRepositoryInterface.php
-
message: "#^Method CustomD\\\\LaravelHelpers\\\\Repository\\\\BaseRepositoryInterface\\:\\:setRequest\\(\\) return type with generic class CustomD\\\\LaravelHelpers\\\\Repository\\\\BaseRepository does not specify its types\\: TModelClass$#"
count: 1
path: src/Repository/BaseRepositoryInterface.php
-
message: "#^Type mixed in generic type Illuminate\\\\Database\\\\Eloquent\\\\Collection\\<int, mixed\\> in PHPDoc tag @return is not subtype of template type TModel of Illuminate\\\\Database\\\\Eloquent\\\\Model of class Illuminate\\\\Database\\\\Eloquent\\\\Collection\\.$#"
count: 2
path: src/Repository/BaseRepositoryInterface.php
includes:
- ./vendor/nunomaduro/larastan/extension.neon
- ./phpstan-baseline.neon
parameters:
......
<?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;
}
/**
* Find multiple models by their primary keys.
*
* @param \Illuminate\Contracts\Support\Arrayable<array-key, mixed>|array<mixed> $ids
* @param array<int, (model-property<TModelClass>|'*')>|model-property<TModelClass>|'*' $columns
* @phpstan-return \Illuminate\Database\Eloquent\Collection<int, TModelClass>
*/
public function findMany($ids, $columns = ['*'])
{
/** @var \Illuminate\Database\Eloquent\Collection<int, TModelClass> */
$res = $this->getModel()->findMany($ids, $columns);
return $res;
}
/**
* Find a model by its primary key or throw an exception.
*
* @param mixed $id
* @param array<int, (model-property<TModelClass>|'*')>|model-property<TModelClass>|'*' $columns
* @phpstan-return ($id is (\Illuminate\Contracts\Support\Arrayable<array-key, mixed>|array<mixed>) ? \Illuminate\Database\Eloquent\Collection<int, TModelClass> : TModelClass)
*
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException
*/
public function findOrFail($id, $columns = ['*'])
{
/** @var \Illuminate\Database\Eloquent\Collection<int, TModelClass>|TModelClass */
$res = $this->getModel()->findOrFail($id, $columns);
return $res;
}
/**
* @phpstan-param array<model-property<TModelClass>, mixed> $attributes
* @phpstan-return TModelClass
*/
public function create(array $attributes = [])
{
/** @var TModelClass */
$res = $this->getModel()->create($attributes);
return $res;
}
/**
* @phpstan-param array<model-property<TModelClass>, mixed> $attributes
* @phpstan-return TModelClass
*/
public function make(array $attributes = [])
{
/** @var TModelClass */
$res = $this->getModel()->make($attributes);
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 = ['*']);
/**
* Find multiple models by their primary keys.
*
* @param \Illuminate\Contracts\Support\Arrayable<array-key, mixed>|array<mixed> $ids
* @param array<int, (model-property<TModelClass>|'*')>|model-property<TModelClass>|'*' $columns
* @phpstan-return \Illuminate\Database\Eloquent\Collection<int, TModelClass>
*/
public function findMany($ids, $columns = ['*']);
/**
* Find a model by its primary key or throw an exception.
*
* @param mixed $id
* @param array<int, (model-property<TModelClass>|'*')>|model-property<TModelClass>|'*' $columns
* @phpstan-return ($id is (\Illuminate\Contracts\Support\Arrayable<array-key, mixed>|array<mixed>) ? \Illuminate\Database\Eloquent\Collection<int, TModelClass> : TModelClass)
*
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException
*/
public function findOrFail($id, $columns = ['*']);
/**
* @phpstan-param array<model-property<TModelClass>, mixed> $attributes
* @phpstan-return TModelClass
*/
public function create(array $attributes = []);
/**
* @phpstan-param array<model-property<TModelClass>, mixed> $attributes
* @phpstan-return TModelClass
*/
public function make(array $attributes = []);
}
<?php
namespace App\Models\Repository;
use App\Models\User;
/**
* @template TModelClass of User
*/
class UserRepository extends BaseRepository
{
protected $model = User::class;
}