CrudResource
является фундаментальной частью "MoonShine для Laravel".
Важно понимать, что ядро MoonShine не зависит от Laravel и тем более от моделей Eloquent.
Но в реализации для Laravel мы предоставляем готовый ModelResource
для работы с моделями и соответствующие type-casts
.
MoonShine очень гибкий и вы можете создать собственный ресурс для работы с любыми источниками данных.
CrudResource
предоставляет базовую структуру для работы с данными, не привязываясь к конкретной реализации.
Это позволяет:
- работать с любыми источниками данных (базы данных, API, файлы и т.д.),
- создавать собственные реализации для специфических задач,
- использовать единый интерфейс независимо от источника данных.
Для создания собственного ресурса достаточно расширить CrudResource
и реализовать абстрактные методы.
namespace App\MoonShine\Resources;
use MoonShine\Contracts\Core\DependencyInjection\FieldsContract;
use MoonShine\Laravel\Resources\CrudResource;
final class RestCrudResource extends CrudResource
{
public function findItem(bool $orFail = false): mixed
{
}
public function getItems(): mixed
{
}
public function massDelete(array $ids): void
{
}
public function delete(mixed $item, ?FieldsContract $fields = null): bool
{
}
public function save(mixed $item, ?FieldsContract $fields = null): mixed
{
}
}
namespaces
namespace App\MoonShine\Resources;
use MoonShine\Contracts\Core\DependencyInjection\FieldsContract;
use MoonShine\Laravel\Resources\CrudResource;
final class RestCrudResource extends CrudResource
{
public function findItem(bool $orFail = false): mixed
{
// ...
}
public function getItems(): mixed
{
// ...
}
public function massDelete(array $ids): void
{
// ...
}
public function delete(mixed $item, ?FieldsContract $fields = null): bool
{
// ...
}
public function save(mixed $item, ?FieldsContract $fields = null): mixed
{
// ...
}
}
namespace App\MoonShine\Resources;
use MoonShine\Contracts\Core\DependencyInjection\FieldsContract;
use MoonShine\Laravel\Resources\CrudResource;
final class RestCrudResource extends CrudResource
{
public function findItem(bool $orFail = false): mixed
{
// ...
}
public function getItems(): mixed
{
// ...
}
public function massDelete(array $ids): void
{
// ...
}
public function delete(mixed $item, ?FieldsContract $fields = null): bool
{
// ...
}
public function save(mixed $item, ?FieldsContract $fields = null): mixed
{
// ...
}
}
namespaces
namespace App\MoonShine\Resources;
use MoonShine\Contracts\Core\DependencyInjection\FieldsContract;
use MoonShine\Laravel\Resources\CrudResource;
final class RestCrudResource extends CrudResource
{
public function findItem(bool $orFail = false): mixed
{
// ...
}
public function getItems(): mixed
{
// ...
}
public function massDelete(array $ids): void
{
// ...
}
public function delete(mixed $item, ?FieldsContract $fields = null): bool
{
// ...
}
public function save(mixed $item, ?FieldsContract $fields = null): mixed
{
// ...
}
}
namespace App\MoonShine\Resources;
use MoonShine\Contracts\Core\DependencyInjection\FieldsContract;
use MoonShine\Laravel\Resources\CrudResource;
final class RestCrudResource extends CrudResource
{
public function findItem(bool $orFail = false): mixed
{
// ...
}
public function getItems(): mixed
{
// ...
}
public function massDelete(array $ids): void
{
// ...
}
public function delete(mixed $item, ?FieldsContract $fields = null): bool
{
// ...
}
public function save(mixed $item, ?FieldsContract $fields = null): mixed
{
// ...
}
}
Вот пример реализации ресурса для работы с REST API
:
namespace App\MoonShine\Resources;
use Illuminate\Http\Client\Response;
use Illuminate\Support\Facades\Http;
use MoonShine\Contracts\Core\DependencyInjection\FieldsContract;
use MoonShine\Laravel\Resources\CrudResource;
final class RestCrudResource extends CrudResource
{
public function getItems(): iterable
{
yield from Http::get('https://jsonplaceholder.typicode.com/todos')->json();
}
public function findItem(bool $orFail = false): array
{
yield from Http::get('https://jsonplaceholder.typicode.com/todos/' . $this->getItemID())->json();
}
public function massDelete(array $ids): void
{
$this->beforeMassDeleting($ids);
foreach ($ids as $id) {
$this->delete(['id' => $id]);
}
$this->afterMassDeleted($ids);
}
public function delete(mixed $item, ?FieldsContract $fields = null): bool
{
return Http::delete('https://jsonplaceholder.typicode.com/todos/' . $item['id'])->successful();
}
public function save(mixed $item, ?FieldsContract $fields = null): mixed
{
$data = request()->all();
if ($item['id'] ?? false) {
return Http::put('https://jsonplaceholder.typicode.com/todos/' . $item['id'], $data)->json();
}
$this->isRecentlyCreated = true;
return Http::post('https://jsonplaceholder.typicode.com/todos', $data)->json();
}
}
namespaces
namespace App\MoonShine\Resources;
use Illuminate\Http\Client\Response;
use Illuminate\Support\Facades\Http;
use MoonShine\Contracts\Core\DependencyInjection\FieldsContract;
use MoonShine\Laravel\Resources\CrudResource;
final class RestCrudResource extends CrudResource
{
public function getItems(): iterable
{
yield from Http::get('https://jsonplaceholder.typicode.com/todos')->json();
}
public function findItem(bool $orFail = false): array
{
yield from Http::get('https://jsonplaceholder.typicode.com/todos/' . $this->getItemID())->json();
}
public function massDelete(array $ids): void
{
$this->beforeMassDeleting($ids);
foreach ($ids as $id) {
$this->delete(['id' => $id]);
}
$this->afterMassDeleted($ids);
}
public function delete(mixed $item, ?FieldsContract $fields = null): bool
{
return Http::delete('https://jsonplaceholder.typicode.com/todos/' . $item['id'])->successful();
}
public function save(mixed $item, ?FieldsContract $fields = null): mixed
{
$data = request()->all();
if ($item['id'] ?? false) {
return Http::put('https://jsonplaceholder.typicode.com/todos/' . $item['id'], $data)->json();
}
$this->isRecentlyCreated = true;
return Http::post('https://jsonplaceholder.typicode.com/todos', $data)->json();
}
}
namespace App\MoonShine\Resources;
use Illuminate\Http\Client\Response;
use Illuminate\Support\Facades\Http;
use MoonShine\Contracts\Core\DependencyInjection\FieldsContract;
use MoonShine\Laravel\Resources\CrudResource;
final class RestCrudResource extends CrudResource
{
public function getItems(): iterable
{
yield from Http::get('https://jsonplaceholder.typicode.com/todos')->json();
}
public function findItem(bool $orFail = false): array
{
yield from Http::get('https://jsonplaceholder.typicode.com/todos/' . $this->getItemID())->json();
}
public function massDelete(array $ids): void
{
$this->beforeMassDeleting($ids);
foreach ($ids as $id) {
$this->delete(['id' => $id]);
}
$this->afterMassDeleted($ids);
}
public function delete(mixed $item, ?FieldsContract $fields = null): bool
{
return Http::delete('https://jsonplaceholder.typicode.com/todos/' . $item['id'])->successful();
}
public function save(mixed $item, ?FieldsContract $fields = null): mixed
{
$data = request()->all();
if ($item['id'] ?? false) {
return Http::put('https://jsonplaceholder.typicode.com/todos/' . $item['id'], $data)->json();
}
$this->isRecentlyCreated = true;
return Http::post('https://jsonplaceholder.typicode.com/todos', $data)->json();
}
}
namespaces
namespace App\MoonShine\Resources;
use Illuminate\Http\Client\Response;
use Illuminate\Support\Facades\Http;
use MoonShine\Contracts\Core\DependencyInjection\FieldsContract;
use MoonShine\Laravel\Resources\CrudResource;
final class RestCrudResource extends CrudResource
{
public function getItems(): iterable
{
yield from Http::get('https://jsonplaceholder.typicode.com/todos')->json();
}
public function findItem(bool $orFail = false): array
{
yield from Http::get('https://jsonplaceholder.typicode.com/todos/' . $this->getItemID())->json();
}
public function massDelete(array $ids): void
{
$this->beforeMassDeleting($ids);
foreach ($ids as $id) {
$this->delete(['id' => $id]);
}
$this->afterMassDeleted($ids);
}
public function delete(mixed $item, ?FieldsContract $fields = null): bool
{
return Http::delete('https://jsonplaceholder.typicode.com/todos/' . $item['id'])->successful();
}
public function save(mixed $item, ?FieldsContract $fields = null): mixed
{
$data = request()->all();
if ($item['id'] ?? false) {
return Http::put('https://jsonplaceholder.typicode.com/todos/' . $item['id'], $data)->json();
}
$this->isRecentlyCreated = true;
return Http::post('https://jsonplaceholder.typicode.com/todos', $data)->json();
}
}
namespace App\MoonShine\Resources;
use Illuminate\Http\Client\Response;
use Illuminate\Support\Facades\Http;
use MoonShine\Contracts\Core\DependencyInjection\FieldsContract;
use MoonShine\Laravel\Resources\CrudResource;
final class RestCrudResource extends CrudResource
{
public function getItems(): iterable
{
yield from Http::get('https://jsonplaceholder.typicode.com/todos')->json();
}
public function findItem(bool $orFail = false): array
{
yield from Http::get('https://jsonplaceholder.typicode.com/todos/' . $this->getItemID())->json();
}
public function massDelete(array $ids): void
{
$this->beforeMassDeleting($ids);
foreach ($ids as $id) {
$this->delete(['id' => $id]);
}
$this->afterMassDeleted($ids);
}
public function delete(mixed $item, ?FieldsContract $fields = null): bool
{
return Http::delete('https://jsonplaceholder.typicode.com/todos/' . $item['id'])->successful();
}
public function save(mixed $item, ?FieldsContract $fields = null): mixed
{
$data = request()->all();
if ($item['id'] ?? false) {
return Http::put('https://jsonplaceholder.typicode.com/todos/' . $item['id'], $data)->json();
}
$this->isRecentlyCreated = true;
return Http::post('https://jsonplaceholder.typicode.com/todos', $data)->json();
}
}
Если вам требуется полный контроль над ресурсом, вместо наследования от CrudResource
, вы можете реализовать интерфейс CrudResourceContract
.
Это даст вам максимальную гибкость в реализации всех необходимых методов.