Skip to content

Commit b85cad6

Browse files
add cover image upload functionality using spatie media library
1 parent 719bc20 commit b85cad6

File tree

9 files changed

+867
-6
lines changed

9 files changed

+867
-6
lines changed

app/Http/Controllers/Api/PostController.php

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,22 @@ public function index(): AnonymousResourceCollection
1919
$posts = Post::with(['author', 'category'])
2020
->published()
2121
->latest()
22-
->paginate(20);
22+
->paginate(6);
2323

2424
return PostResource::collection($posts);
2525
}
2626

2727
public function store(StorePostRequest $request): PostResource
2828
{
2929
$data = $request->validated();
30-
auth()->user()->posts()->create($data);
30+
$post = auth()->user()->posts()->create($data);
3131

32-
return new PostResource($data->load(['author', 'category']));
32+
if ($request->hasFile('cover_image')) {
33+
$post->addMediaFromRequest('cover_image')
34+
->toMediaCollection('images');
35+
}
36+
37+
return new PostResource($post->load(['author', 'category']));
3338
}
3439

3540
public function show(Post $post): PostResource
@@ -44,11 +49,22 @@ public function show(Post $post): PostResource
4449
public function update(UpdatePostRequest $request, Post $post): PostResource
4550
{
4651
$post->update($request->validated());
52+
53+
if ($request->hasFile('cover_image')) {
54+
// Clear existing media in the collection
55+
$post->clearMediaCollection('images');
56+
57+
// Add new media
58+
$post->addMediaFromRequest('cover_image')
59+
->toMediaCollection('images');
60+
}
61+
4762
return new PostResource($post->load(['author', 'category']));
4863
}
4964

5065
public function destroy(Post $post): JsonResponse
5166
{
67+
$post->clearMediaCollection('images');
5268
$post->delete();
5369
return response()->json(['message' => 'Post deleted successfully'], 200);
5470
}

app/Http/Requests/Post/StorePostRequest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public function rules(): array
3131
'slug' => ['required', 'string', 'max:255', Rule::unique('posts', 'slug')],
3232
'excerpt' => ['required', 'string', 'max:255'],
3333
'content' => ['required', 'string'],
34+
'cover_image' => ['nullable', 'image', 'mimes:jpeg,png,webp', 'max:2048'],
3435
'status' => ['sometimes', new Enum(PostStatus::class)],
3536
'is_featured' => ['sometimes', 'boolean'],
3637
];

app/Http/Requests/Post/UpdatePostRequest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public function rules(): array
3636
],
3737
'excerpt' => ['required', 'string', 'max:255'],
3838
'content' => ['required', 'string'],
39+
'cover_image' => ['nullable', 'image', 'mimes:jpeg,png,webp', 'max:2048'],
3940
'status' => ['sometimes', new Enum(PostStatus::class)],
4041
'is_featured' => ['sometimes', 'boolean'],
4142
];

app/Http/Resources/PostResource.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public function toArray(Request $request): array
2020
'slug' => $this->slug,
2121
'excerpt' => $this->excerpt,
2222
'content' => $this->content,
23+
'image_url' => $this->cover_image,
2324
'status' => $this->status->value,
2425
'is_featured' => $this->is_featured,
2526
'author' => [

app/Models/Post.php

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@
1010
use Illuminate\Database\Eloquent\Model;
1111
use Illuminate\Database\Eloquent\Relations\BelongsTo;
1212
use Illuminate\Database\Eloquent\SoftDeletes;
13+
use Spatie\MediaLibrary\HasMedia;
14+
use Spatie\MediaLibrary\InteractsWithMedia;
1315

1416
#[ObservedBy(PostObserver::class)]
15-
class Post extends Model
17+
class Post extends Model implements HasMedia
1618
{
17-
use HasFactory, SoftDeletes;
19+
use HasFactory, SoftDeletes, InteractsWithMedia;
1820

1921
protected $fillable = [
2022
'title',
@@ -67,4 +69,9 @@ public function getRouteKeyName(): string
6769
{
6870
return 'slug';
6971
}
72+
73+
public function getCoverImageAttribute()
74+
{
75+
return $this->getFirstMediaUrl('images') ?: null;
76+
}
7077
}

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
"laravel/framework": "^12.0",
1515
"laravel/sanctum": "^4.0",
1616
"laravel/tinker": "^2.10.1",
17+
"spatie/laravel-medialibrary": "^11.12",
1718
"tightenco/ziggy": "^2.4"
1819
},
1920
"require-dev": {

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy