PHP code example of salehhashemi / laravel-repository
1. Go to this page and download the library: Download salehhashemi/laravel-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/ */
salehhashemi / laravel-repository example snippets
namespace App\Repositories;
use App\Filters\PostFilter;
use App\Models\Post;
use App\Repositories\Criteria\FeaturedPostCriteria;
use Illuminate\Contracts\Pagination\Paginator;
use Illuminate\Database\Eloquent\Collection as EloquentCollection;
use Salehhashemi\Repository\BaseEloquentRepository;
use Salehhashemi\Repository\Traits\Searchable;
/**
* @method \App\Models\Post getModel()
* @method \App\Models\Post|null findOne(int|string $primaryKey = null)
* @method \App\Models\Post findOneOrFail(int|string $primaryKey = null)
*/
class PostRepository extends BaseEloquentRepository implements PostRepositoryInterface
{
use Searchable;
protected function getFilterManager(): PostFilter
{
$filterManager = new PostFilter();
$filterManager->setQuery($this->getQuery());
return $filterManager;
}
public function findAllFeatured(): EloquentCollection
{
$this->addCriteria(new FeaturedPostCriteria());
return $this->findAll(['limit' => 20]);
}
public function searchVisible(array $queryParams, int $perPage): Paginator
{
$this->orderBy('sort');
$this->withCategories();
return $this->search($queryParams, $perPage);
}
public function findOnePublishedOrFail(int $postId): Post
{
$this->applyConditions([
'is_published' => 1,
]);
return $this->findOneOrFail($postId);
}
public function withComments(): static
{
return $this->with(['comments']);
}
public function withCategories(): static
{
return $this->with(['categories']);
}
/**
* {@inheritdoc}
*/
protected function getModelClass(): string
{
return Post::class;
}
}
declare(strict_types=1);
namespace App\Repositories;
use App\Models\Post;
use Illuminate\Contracts\Pagination\Paginator;
use Illuminate\Database\Eloquent\Collection as EloquentCollection;
use Salehhashemi\Repository\Contracts\RepositoryInterface;
use Salehhashemi\Repository\Contracts\SearchableRepositoryInterface;
/**
* @method \App\Models\Post|null findOne(int|string $primaryKey = null)
* @method \App\Models\Post findOneOrFail(int|string $primaryKey = null)
*/
interface PostRepositoryInterface extends RepositoryInterface, SearchableRepositoryInterface
{
public function findAllFeatured(): EloquentCollection;
public function searchVisible(array $queryParams, int $perPage): Paginator;
public function findOnePublishedOrFail(int $postId): Post;
/**
* @return $this
*/
public function withComments(): static;
/**
* @return $this
*/
public function withCategories(): static;
}
declare(strict_types=1);
namespace App\Filters;
use App\Models\Post;
use Illuminate\Database\Eloquent\Builder as QueryBuilder;
use Salehhashemi\Repository\BaseFilter;
class PostFilter extends BaseFilter
{
public function applyFilter(array $queryParams): QueryBuilder
{
$this
->whereLike('title', $queryParams['title'] ?? '', self::WILD_BOTH)
->whereValue('status', $queryParams['status'] ?? '')
->compare('amount', '<=' $queryParams['max_amount'] ?? '')
->dateFrom('created_at', $queryParams['created_from'] ?? '')
->dateTo('created_at', $queryParams['created_to'] ?? '');
if (! empty($queryParams['category_id'])) {
$this->getQuery()->whereHas('categories', function ($query) use ($queryParams) {
$query->where('categories.id', $queryParams['category_id']);
});
}
return $this->getQuery();
}
protected function getModelClass(): string
{
return Post::class;
}
}
namespace App\Repositories\Criteria;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Salehhashemi\Repository\Contracts\CriteriaInterface;
class FeaturedPostCriteria implements CriteriaInterface
{
/**
* {@inheritDoc}
*/
public function apply(Model $model, Builder $query): Builder
{
$query->where([
'posts.is_featured' => 1,
]);
return $query;
}
}
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Repositories\PostRepositoryInterface;
use App\Repositories\PostRepository;
class RepositoryServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->bind(
PostRepositoryInterface::class,
PostRepository::class
);
}
}
'providers' => [
// Other Service Providers
App\Providers\RepositoryServiceProvider::class,
],
public function index(Request $request, PostRepositoryInterface $postRepository): AnonymousResourceCollection
{
return PostCollectionResource::collection(
$postRepository
->search(
$request->query(),
$request->integer('limit'),
)
);
}