feat: guess Model class automagically

This commit is contained in:
Phan An 2020-12-23 12:03:22 +01:00
parent 5293bd9da0
commit ef7d00e16a
11 changed files with 58 additions and 45 deletions

View file

@ -0,0 +1,32 @@
<?php
namespace App\Http\Controllers\API;
use App\Repositories\AlbumRepository;
use App\Repositories\ArtistRepository;
use App\Repositories\PlaylistRepository;
use App\Repositories\SongRepository;
class SearchController extends Controller
{
private $songRepository;
private $albumRepository;
private $artistRepository;
private $playlistRepository;
public function __construct(
SongRepository $songRepository,
AlbumRepository $albumRepository,
ArtistRepository $artistRepository,
PlaylistRepository $playlistRepository
) {
$this->songRepository = $songRepository;
$this->albumRepository = $albumRepository;
$this->artistRepository = $artistRepository;
$this->playlistRepository = $playlistRepository;
}
public function index()
{
}
}

View file

@ -9,17 +9,19 @@ use Throwable;
abstract class AbstractRepository implements RepositoryInterface
{
/** @var string */
private $modelClass;
/** @var Model */
protected $model;
/** @var Guard */
protected $auth;
abstract public function getModelClass(): string;
public function __construct()
public function __construct(?string $modelClass = null)
{
$this->model = app($this->getModelClass());
$this->modelClass = $modelClass ?: self::guessModelClass();
$this->model = app($this->modelClass);
// This instantiation may fail during a console command if e.g. APP_KEY is empty,
// rendering the whole installation failing.
@ -29,6 +31,11 @@ abstract class AbstractRepository implements RepositoryInterface
}
}
private static function guessModelClass(): string
{
return preg_replace('/(.+)\\\\Repositories\\\\(.+)Repository$/m', '$1\Models\\\$2', static::class);
}
public function getOneById($id): ?Model
{
return $this->model->find($id);

View file

@ -2,15 +2,12 @@
namespace App\Repositories;
use App\Models\Album;
use App\Models\Song;
use App\Repositories\Traits\Searchable;
class AlbumRepository extends AbstractRepository
{
public function getModelClass(): string
{
return Album::class;
}
use Searchable;
/** @return array<int> */
public function getNonEmptyAlbumIds(): array

View file

@ -2,16 +2,10 @@
namespace App\Repositories;
use App\Models\Artist;
use App\Models\Song;
class ArtistRepository extends AbstractRepository
{
public function getModelClass(): string
{
return Artist::class;
}
/** @return array<int> */
public function getNonEmptyArtistIds(): array
{

View file

@ -12,11 +12,6 @@ class InteractionRepository extends AbstractRepository
{
use ByCurrentUser;
public function getModelClass(): string
{
return Interaction::class;
}
/** @return Collection|array<Interaction> */
public function getUserFavorites(User $user): Collection
{

View file

@ -4,16 +4,13 @@ namespace App\Repositories;
use App\Models\Playlist;
use App\Repositories\Traits\ByCurrentUser;
use App\Repositories\Traits\Searchable;
use Illuminate\Support\Collection;
class PlaylistRepository extends AbstractRepository
{
use ByCurrentUser;
public function getModelClass(): string
{
return Playlist::class;
}
use Searchable;
/** @return Collection|array<Playlist> */
public function getAllByCurrentUser(): Collection

View file

@ -7,8 +7,6 @@ use Illuminate\Database\Eloquent\Model;
interface RepositoryInterface
{
public function getModelClass(): string;
public function getOneById($id): ?Model;
/** @return Collection|array<Model> */

View file

@ -2,15 +2,8 @@
namespace App\Repositories;
use App\Models\Setting;
class SettingRepository extends AbstractRepository
{
public function getModelClass(): string
{
return Setting::class;
}
/** @return array<mixed> */
public function getAllAsKeyValueArray(): array
{

View file

@ -3,10 +3,13 @@
namespace App\Repositories;
use App\Models\Song;
use App\Repositories\Traits\Searchable;
use App\Services\HelperService;
class SongRepository extends AbstractRepository
{
use Searchable;
private $helperService;
public function __construct(HelperService $helperService)
@ -16,11 +19,6 @@ class SongRepository extends AbstractRepository
$this->helperService = $helperService;
}
public function getModelClass(): string
{
return Song::class;
}
public function getOneByPath(string $path): ?Song
{
return $this->getOneById($this->helperService->getFileHash($path));

View file

@ -0,0 +1,8 @@
<?php
namespace App\Repositories\Traits;
trait Searchable
{
}

View file

@ -2,12 +2,6 @@
namespace App\Repositories;
use App\Models\User;
class UserRepository extends AbstractRepository
{
public function getModelClass(): string
{
return User::class;
}
}