Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
68.18% covered (warning)
68.18%
15 / 22
28.57% covered (danger)
28.57%
2 / 7
CRAP
0.00% covered (danger)
0.00%
0 / 1
PageController
68.18% covered (warning)
68.18%
15 / 22
28.57% covered (danger)
28.57%
2 / 7
13.22
0.00% covered (danger)
0.00%
0 / 1
 index
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 create
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 store
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 edit
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 update
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 destroy
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 validated
100.00% covered (success)
100.00%
13 / 13
100.00% covered (success)
100.00%
1 / 1
4
1<?php
2
3namespace App\Http\Controllers\admin;
4
5use App\Http\Controllers\Controller;
6use App\Models\Page;
7use Illuminate\Http\RedirectResponse;
8use Illuminate\Http\Request;
9use Illuminate\Validation\Rule;
10use Illuminate\View\View;
11use Illuminate\Support\Str;
12
13class PageController extends Controller
14{
15    public function index(): View
16    {
17        return view('admin.pages.index', ['pages' => Page::orderByRaw('position is null')->orderBy('position')->orderBy('title')->paginate(20)]);
18    }
19
20    public function create(): View
21    {
22        return view('admin.pages.form', ['page' => new Page(['status' => 'published'])]);
23    }
24
25    public function store(Request $request): RedirectResponse
26    {
27        $page = Page::create($this->validated($request));
28
29        return redirect()->route('admin.pages.edit', $page)->with('success', 'Page created successfully.');
30    }
31
32    public function edit(Page $page): View
33    {
34        return view('admin.pages.form', compact('page'));
35    }
36
37    public function update(Request $request, Page $page): RedirectResponse
38    {
39        $page->update($this->validated($request, $page));
40
41        return back()->with('success', 'Page updated successfully.');
42    }
43
44    public function destroy(Page $page): RedirectResponse
45    {
46        $page->delete();
47
48        return redirect()->route('admin.pages.index')->with('success', 'Page deleted.');
49    }
50
51    private function validated(Request $request, ?Page $page = null): array
52    {
53        $request->merge(['slug' => Str::slug($request->input('slug') ?: $request->input('title'))]);
54        $data = $request->validate([
55            'title' => ['required', 'string', 'max:180'],
56            'slug' => ['required', 'string', 'max:180', Rule::unique('pages', 'slug')->ignore($page?->id)],
57            'content' => ['nullable', 'string'],
58            'meta_title' => ['nullable', 'string', 'max:180'],
59            'meta_description' => ['nullable', 'string', 'max:500'],
60            'position' => ['nullable', 'integer', 'min:0'],
61            'status' => ['nullable', 'boolean'],
62        ]);
63        $data['status'] = $request->boolean('status') ? 'published' : 'draft';
64        $data['position'] = isset($data['position']) ? (int) $data['position'] : null;
65
66        return $data;
67    }
68}