Laravel 10.x karkasas. Valdikliai ir CRUD funkcijos
Valdikliai palaiko ryšį ir valdo duomenis tarp naudotojo ir sistemos.
Autorių valdiklis
Sukurkime pirmą valdiklį, kuris valdys autorius. Komandinėje eilutėje įveskite:
Kadangi valdiklis
Atsidarykite naršyklėje adresą http://localhost:8000/authors. Čia dar nematysite jokių autorių, nes jie nėra įrašyti į duomenų bazę. Tai galite atlikti rankiniu būdu arba pereikime prie administravimo panelės kūrimo, kad galėtume išsaugoti duomenis per bibliotekos sistemą.
Iš pradžių kataloge
Komanda nuo ankstesnės skiriasi tuo, kad vietoj
PASTABA. Nekeiskite šių metodų pavadinimų, nes tai yra standartiniai Laravel metodai ir juos pakeitus sistema neveiks tinkamai. Tačiau jūs galite kurti savo metodus. Sekančiose pamokose išmoksime tai padaryti.
Kadangi valdiklis
Metodas
Metodas
Atsidarykite failą
Dabar atsidarykite maršrutų failąMetodas
Metodas
Valdiklyje
Naujo įrašo įvedimui ir esamo įrašo redagavimui galima naudoti dvi skirtingas formas, tačiau skirtumas tarp jų yra nedidelis, todėl patogu naudoti vieną formą. Iš pradžių katalogeMetodas
Metodas
Valdiklyje
Metodas
Metodas
MetodasMetodas
Metodas
ValdiklyjeMetodas
Metodas
Valdiklyje
Maršrutų faileMetodas
Metodas
Valdiklyje
Maršrutų faileMetodas
Metodas
Valdiklyje
Maršrutų faile
Leidėjų valdiklis
Leidėjų valdiklį, vaizdus ir maršrutus sukurkite tokiu pačiu principu, kaip autorių objektui.
Žanrų valdiklis
Žanrų valdiklį, vaizdus ir maršrutus sukurkite tokiu pačiu principu, kaip autorių objektui.
Knygų valdiklis
Objektas
Toliau kataloge
Vaizdo
Daugiau apie valdiklius skaitykite oficialioje Laravel 10.x dokumentacijoje, skiltyje Controllers.
Autorių valdiklis AuthorsController
Sukurkime pirmą valdiklį, kuris valdys autorius. Komandinėje eilutėje įveskite:
php artisan make:controller AuthorsController --invokable
invokable
reiškia, kad šis valdiklis turės tik vieną metodą. Šiuo atveju jis atvaizduos visų autorių sąrašą.Kadangi valdiklis
AuthorsController
naudos Author
modelį, tai turime jį nurodyti panaudojant use
sakinį. Atsidarykite naujai sukurtą failą ../library/app/Http/Controllers/AuthorsController.php
ir po eilute use Illuminate\Http\Request;
įrašykite eilutę:
use App\Models\Author;
Taip pat metode __invoke()
įrašykite tokį kodą:
$authors = Author::all()->sortBy("last_name"); // naudojam modelį Author; ši eilutė įvykdo SQL užklausą "SELECT * FROM `authors`"; taip pat išrūšiuojam autorius pagal pavardę
return view('user.authors.index', compact('authors')); // nurodom kokiame vaizde bus atvaizduojami duomenys ir perduodam duomenis (masyvą authors) vaizdui
Kaip galite pastebėti, autoriai bus atvaizduojami vaizde user.authors.index
, todėl atitinkamai kataloge ../library/resources/views/user
sukurkite katalogą authors
, o jame failą index.blade.php
. Atsidarykite šį failą ir įrašykite jame tokį kodą:
@extends('layouts.app')
@section('title', 'Authors')
@section('content')
@foreach($authors as $author)
<p>{{ $author->first_name }} {{ $author->middle_name }} {{ $author->last_name }}</p>
@endforeach
@endsection
Dabar atsidarykite maršrutų failą ../library/routes/web.php
ir po eilute Route::view('/admin', 'admin.dashboard');
įrašykite tokį kodą:
Route::get('/authors', App\Http\Controllers\AuthorsController::class);
Šiam maršrutui nenurodome vaizdo, nes jis jau nurodytas valdiklyje, todėl nurodome tik valdiklio klasę AuthorsController::class
. Kadangi šis valdiklis turi tik vieną veiksmą (metodą __invoke()
), tai jo nurodyti nereikia.Atsidarykite naršyklėje adresą http://localhost:8000/authors. Čia dar nematysite jokių autorių, nes jie nėra įrašyti į duomenų bazę. Tai galite atlikti rankiniu būdu arba pereikime prie administravimo panelės kūrimo, kad galėtume išsaugoti duomenis per bibliotekos sistemą.
Iš pradžių kataloge
../library/app/Http/Controllers
sukurkite katalogą Admin
, o tada komandinėje eilutėje įveskite:
php artisan make:controller Admin/AuthorsController --resource
Ši komanda kataloge ../library/app/Http/Controllers/Admin/
sukurs failą AuthorsController.php
.Komanda nuo ankstesnės skiriasi tuo, kad vietoj
--invoke
parametro panaudotas parametras --resource
. Tai reiškia, kad automatiškai sukurtas valdiklis turės standartinius metodus index()
, create()
, store()
, show()
, edit()
, update()
ir destroy()
.PASTABA. Nekeiskite šių metodų pavadinimų, nes tai yra standartiniai Laravel metodai ir juos pakeitus sistema neveiks tinkamai. Tačiau jūs galite kurti savo metodus. Sekančiose pamokose išmoksime tai padaryti.
Kadangi valdiklis
AuthorsController
naudos Author
modelį, tai turime jį nurodyti panaudojant use
sakinį. Atsidarykite naujai sukurtą failą ../library/app/Http/Controllers/Admin/AuthorsController.php
ir valdiklyje AuthorsController
po eilute use Illuminate\Http\Request;
įterpkite eilutę:
use App\Models\Author;
CRUD funkcijos
Standartinės CRUD (create, read, update ir delete) funkcijos turi analogus Laravel karkase:Standartinė funkcija | Metodai Laravel karkase |
---|---|
Create | create() ir store() metodai |
Read | index() ir show() metodai |
Update | edit() ir update() metodai |
Delete | destroy() metodas |
Metodas index()
Metodas index()
naudojamas visų duomenų atvaizdavimui.Atsidarykite failą
../library/app/Http/Controllers/Admin/AuthorsController.php
ir metode index()
įrašykite kodą:
$authors = Author::all();
return view('admin.authors.index', compact('authors'));
Vaizdas admin.authors.index
naudos Laravel Collective paketą, todėl įsidiekite jį komandinėje eilutėje įvesdami:
composer require laravelcollective/html
Toliau kataloge ../library/resources/views/admin/
sukurkite katalogą authors
, o jame - vaizdą index.blade.php
. Atsidarykite šį failą ir įrašykite į jį tokį kodą:
@extends('layouts.admin')
@section('title', 'Authors')
@section('content')
<div class="card">
<div class="card-header">
<a href="{{ url('admin/authors/create') }}" class="btn btn-primary"><i class="fas fa-plus"></i> Add author</a>
</div>
<div class="card-body">
@if(Session::has('success'))
<div class="alert alert-success alert-dismissible fade show" role="alert">
{{ Session::get('success') }}
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
@php
Session::forget('success');
@endphp
</div>
@endif
<div class="table-responsive">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>ID</th>
<th>First name</th>
<th>Middle name</th>
<th>Last Name</th>
<th>Gender</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
@foreach($authors as $author) {{-- iš valdiklio gavom autorių masyvą $authors; kadangi tai masyvas, reikia jį išskaidyti elementais --}}
<tr>
<td>{{ $author->id }}</td>
<td>{{ $author->first_name }}</td>
<td>{{ $author->middle_name }}</td>
<td>{{ $author->last_name }}</td>
<td>{{ $author->gender == 1 ? 'Man' : 'Woman' }}</td> {{-- jeigu gender=1, tai spausdinam Man, kitu atveju spausdinam Woman --}}
<td>
<a href="{{ url('admin/authors/'.$author->id.'/edit') }}" class="btn btn-primary btn-sm"><i class="fas fa-edit"></i> Edit</a>
<a href="{{ url('admin/authors/'.$author->id) }}" class="btn btn-success btn-sm"><i class="fas fa-eye"></i> View</a>
{!! Form::open(['method'=>'DELETE', 'url' => ['admin/authors', $author->id], 'style' => 'display:inline']) !!}
{!! Form::button('<i class="fas fa-trash-alt"></i> Delete', ['class' => 'btn btn-danger btn-sm', 'type' => 'submit']) !!}
{!! Form::close() !!}
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
@endsection
Šis vaizdas atvaizduos visus autorius vienoje lentelėje, vėlesnėse pamokose sužinosite, kaip pasidaryti puslapiavimą.Dabar atsidarykite maršrutų failą
../library/routes/web.php
ir gale failo įrašykite tokį kodą:
Route::get('/admin/authors', [App\Http\Controllers\Admin\AuthorsController::class, 'index']);
Skirtingai nuo anksčiau aprašyto maršruto, šiame iškvietus valdiklio klasę nurodome veiksmą index
, t. y. į kurį metodą turi kreiptis valdiklis (šiuo atveju į metodą index()
).
Metodas create()
Metodas create()
naudojamas naujo įrašo formos atvaizdavimui.Valdiklyje
Admin/AuthorsController
metode create()
įveskite:
return view('admin.authors.form');
Šis metodas tiesiog grąžins vaizdą admin.authors.form
.Naujo įrašo įvedimui ir esamo įrašo redagavimui galima naudoti dvi skirtingas formas, tačiau skirtumas tarp jų yra nedidelis, todėl patogu naudoti vieną formą. Iš pradžių kataloge
../library/resources/views/admin/authors/
sukurkite naują failą form.blade.php
, o tada įveskite jame kodą:
@extends('layouts.admin')
@section('title', 'Authors')
@section('content')
<div class="card">
<div class="card-header">
<h6 class="m-0 font-weight-bold text-primary">
@if(isset($author))
Edit exist author
@else
Create new author
@endif
</h6>
</div>
<div class="card-body">
{{-- Form::model ir Form::open metodai automatiškai prideda prie formos CSRF žetoną, todėl atskirai jo aprašyti nereikia --}}
@if(isset($author))
{{-- Esamo įrašo redagavimo forma --}}
{!! Form::model($author, ['url' => ['admin/authors', $author->id], 'method' => 'patch']) !!}
@else
{{-- Naujo įrašo įvedimo forma; metodo nereikia nurodyti, nes pagal nutylėjimą jis yra 'post' --}}
{!! Form::open(['url' => 'admin/authors']) !!}
@endif
<div class="form-group">
{!! Form::label('first_name', 'First name: ', ['class' => 'col-sm-3']) !!}
<div class="col-sm-6">
{!! Form::text('first_name', null, ['class' => 'form-control', 'required' => 'required']) !!}
</div>
</div>
<div class="form-group">
{!! Form::label('middle_name', 'Middle name: ', ['class' => 'col-sm-3']) !!}
<div class="col-sm-6">
{!! Form::text('middle_name', null, ['class' => 'form-control']) !!}
</div>
</div>
<div class="form-group">
{!! Form::label('last_name', 'Last name: ', ['class' => 'col-sm-3']) !!}
<div class="col-sm-6">
{!! Form::text('last_name', null, ['class' => 'form-control', 'required' => 'required']) !!}
</div>
</div>
<div class="form-group">
<div class="col-sm-6">
<div class="form-check form-check-inline">
{!! Form::radio('gender', '1', false, ['class' => 'form-check-input']) !!}
{!! Form::label('gender', 'Man', ['class' => 'form-check-label']) !!}
</div>
<div class="form-check form-check-inline">
{!! Form::radio('gender', '2', false, ['class' => 'form-check-input']) !!}
{!! Form::label('gender', 'Woman', ['class' => 'form-check-label']) !!}
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-3 col-sm-3">
{!! Form::submit('Save', ['class' => 'btn btn-primary form-control']) !!}
</div>
</div>
{!! Form::close() !!}
</div>
</div>
@endsection
Maršrutų faile web.php
įrašykite naują maršrutą:
Route::get('/admin/authors/create', [App\Http\Controllers\Admin\AuthorsController::class, 'create']);
Metodas store()
Metodas store()
naudojamas duomenų išsaugojimui.Valdiklyje
Admin/AuthorsController
metode store()
įveskite:
Author::create($request->all()); // įvykdoma SQL užklausa, kuri išsaugo duomenis DB
// grįžtama į nuorodą 'admin/authors'; sesijoje išsaugome pranešimą 'success', kurio reikšmė yra tekstas 'Author added successfully.'
return redirect('admin/authors')->with('success', 'Author added successfully.');
Metodas create()
įvykdo SQL užklausą, kuri išsaugo duomenų bazėje duomenis, gautus iš HTTP užklausos. HTTP užklausos duomenys yra saugomi $request
objekte.Metodas
all()
leidžia gauti visus HTML formoje įvestus duomenis.Metodas
redirect()
grąžina naudotoją į visų autorių sąrašą su pranešimu success
, išsaugotu sesijoje. Šiems pranešimams saugoti naudojamas metodas with()
.Metodas
all()
naudojamas tada, kai formoje įvestų duomenų nereikia apdoroti. Tačiau pasitaiko atvejų, kai duomenis prieš išsaugant duomenų bazėje reikia apdoroti. Pavyzdžiui, galime parašyti kodą, kuris užtikrins, kad autoriaus vardas, antras vardas ir pavardė bus išsaugoti iš didžiųjų raidžių, tam naudosime standartinę PHP funkciją ucfirst()
:
Author::create([
'first_name' => ucfirst($request->first_name),
'middle_name' => ucfirst($request->middle_name),
'last_name' => ucfirst($request->last_name),
'gender' => $request->gender
]);
Maršrutų faile web.php
įrašykite naują maršrutą:
Route::post('/admin/authors', [App\Http\Controllers\Admin\AuthorsController::class, 'store']);
Metodas show()
Metodas show()
naudojamas vieno pasirinkto įrašo atvaizdavimui.Valdiklyje
Admin/AuthorsController
metode show()
įveskite:
$author = Author::findOrFail($id); // įvykdoma SQL užklausa, kuri išrenka vieną įrašą iš lentelės pagal ID reikšmę
return view('admin.authors.show', compact('author'));
Metodo findOrFail()
pagalba pagal $id
reikšmę išrenkamas iš autorių lentelės atitinkamas įrašas. Gauti įrašo duomenys išsaugomi masyve $author
. Pasirinkto įrašo informacija atvaizduojama admin.authors.show
vaizde, kuriam yra perduodamas masyvas $author
. Šio vaizdo dar neturime, todėl kataloge ../library/resources/views/admin/authors/
sukurkite naują failą show.blade.php
ir įveskite jame kodą:
@extends('layouts.admin')
@section('title', 'Authors')
@section('content')
<div class="card">
<div class="card-header">
<a href="{{ url('/admin/authors/'.$author->id.'/edit') }}" class="btn btn-primary"><i class="fas fa-edit"></i> Edit author</a>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-bordered">
<tbody>
<tr>
<td>ID</td>
<td>{{ $author->id }}</td>
</tr>
<tr>
<td>First name</td>
<td>{{ $author->first_name }}</td>
</tr>
<tr>
<td>Middle name</td>
<td>{{ $author->middle_name }}</td>
</tr>
<tr>
<td>Last name</td>
<td>{{ $author->last_name }}</td>
</tr>
<tr>
<td>Gender</td>
<td>{{ $author->gender == 1 ? 'Man' : 'Woman' }}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
@endsection
Maršrutų faile web.php
įrašykite naują maršrutą:
Route::get('/admin/authors/{id}', [App\Http\Controllers\Admin\AuthorsController::class, 'show']);
Metodas edit()
Metodas edit()
naudojamas esamo įrašo redagavimo formos atvaizdavimui.Valdiklyje
Admin/AuthorsController
metode edit()
įveskite:
$author = Author::findOrFail($id);
return view('admin.authors.form', compact('author'));
Šis metodas grąžina tą pačią formą kaip ir metodo create()
atveju. Skirtumas tik tas, kad šis metodas gauna redaguojamo įrašo $id
reikšmę tam, kad žinotume kokį konkrečiai įrašą redaguosime.Maršrutų faile
web.php
įrašykite naują maršrutą:
Route::get('/admin/authors/{id}/edit', [App\Http\Controllers\Admin\AuthorsController::class, 'edit']);
Metodas update()
Metodas update()
naudojamas duomenų atnaujinimui.Valdiklyje
Admin/AuthorsController
metode update()
įveskite:
$author = Author::findOrFail($id);
$author->update($request->all()); // įvykdoma SQL užklausa, kuri atnaujina duomenis DB
return redirect('admin/authors')->with('success', 'Author updated successfully.');
Šis metodas negrąžina jokio vaizdo, nes atnaujinus duomenis grįžtama į visų autorių sąrašą su pranešimu success
, išsaugotu sesijoje.Maršrutų faile
web.php
įrašykite naują maršrutą:
Route::patch('/admin/authors/{id}', [App\Http\Controllers\Admin\AuthorsController::class, 'update']);
Metodas destroy()
Metodas destroy()
naudojamas duomenų pašalinimui.Valdiklyje
Admin/AuthorsController
metode destroy()
įveskite:
$author = Author::findOrFail($id);
$author->delete(); // įvykdoma SQL užklausa, kuri pašalina duomenis iš DB
return redirect('admin/authors')->with('success', 'Author deleted successfully.');
Šis metodas negrąžina jokio vaizdo, nes pašalinus duomenis grįžtama į visų autorių sąrašą su pranešimu, išsaugotu sesijoje.Maršrutų faile
web.php
įrašykite naują maršrutą:
Route::delete('/admin/authors/{id}', [App\Http\Controllers\Admin\AuthorsController::class, 'destroy']);
Leidėjų valdiklis PublishersController
Leidėjų valdiklį, vaizdus ir maršrutus sukurkite tokiu pačiu principu, kaip autorių objektui.
Žanrų valdiklis GenresController
Žanrų valdiklį, vaizdus ir maršrutus sukurkite tokiu pačiu principu, kaip autorių objektui.
Knygų valdiklis BooksController
Objektas Book
yra sudėtingesnis, todėl toliau pateikiama, kaip sukurti jo valdiklį, vaizdus ir maršrutus.
Iš pradžių komandinėje eilutėje sukurkite BooksController
valdiklį su parametru --resource
:
php artisan make:controller Admin/BooksController --resource
Šio valdiklio išeities kodas:
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Book;
use App\Models\Publisher;
use App\Models\Genre;
use Illuminate\Http\Request;
class BooksController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$books = Book::all();
return view('admin.books.index', compact('books'));
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
$publishers = Publisher::pluck('title', 'id'); // sukuriamas knygų leidėjų masyvas iš publishers lentelės
$publishers->prepend('---Please select---', 0); // pirmo masyvo elemento reikšmė bus '---Please select---'
$publishers->all();
$genres = Genre::pluck('title', 'id'); // sukuriamas knygų žanrų masyvas iš genres lentelės
$genres->prepend('---Please select---', 0); // pirmo masyvo elemento reikšmė bus '---Please select---'
$genres->all();
$years = array_combine(range(date("Y"), 1900), range(date("Y"), 1900)); // sukuriamas asociatyvus metų masyvas nuo 1900 iki einamųjų metų
$years = array('0' => '---Please select---') + $years; // pirmo masyvo elemento reikšmė bus '---Please select---'
// vaizdui perduodami visi trys masyvai: leidėjų, žanrų ir metų
// šie masyvai reikalingi tam, kad vaizde jų reikšmes galima būtų atvaizduoti <select> lauke
return view('admin.books.form', compact('publishers', 'genres', 'years'));
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
Book::create($request->all());
return redirect('admin/books')->with('success', 'Book added successfully.');
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
$book = Book::findOrFail($id);
return view('admin.books.show', compact('book'));
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
$publishers = Publisher::orderBy('title', 'asc')->pluck('title', 'id');
$publishers->prepend('---Please select---', 0);
$publishers->all();
$genres = Genre::orderBy('title', 'asc')->pluck('title', 'id');
$genres->prepend('---Please select---', 0);
$genres->all();
$years = array_combine(range(date("Y"), 1900), range(date("Y"), 1900));
$years = array('0' => '---Please select---') + $years;
$book = Book::findOrFail($id);
return view('admin.books.form', compact('book', 'publishers', 'genres', 'years'));
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
$book = Book::findOrFail($id);
$book->update($request->all());
return redirect('admin/books')->with('success', 'Book updated successfully.');
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
$book = Book::findOrFail($id);
$book->delete();
return redirect('admin/books')->with('success', 'Book deleted successfully.');
}
}
Atkreipkite dėmesį į create()
ir edit()
metodus, juose sukuriami $publishers
, $genres
ir $years
masyvai, kurie perduodami į formos vaizdą. Šie masyvai reikalingi tam, kad vaizde jų reikšmes galima būtų atvaizduoti <select> lauke.Toliau kataloge
../library/resources/views/admin/books/
sukurkite vaizdus index.blade.php
, form.blade.php
ir show.blade.php
.Vaizdo
index.blade.php
programinis kodas:
@extends('layouts.admin')
@section('title', 'Books')
@section('content')
<div class="card">
<div class="card-header">
<a href="{{ url('admin/books/create') }}" class="btn btn-primary"><i class="fas fa-plus"></i> Add book</a>
</div>
<div class="card-body">
@if(Session::has('success'))
<div class="alert alert-success alert-dismissible fade show" role="alert">
{{ Session::get('success') }}
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
@php
Session::forget('success');
@endphp
</div>
@endif
<div class="table-responsive">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>ID</th>
<th>Title</th>
<th>ISBN</th>
<th>Year</th>
<th>Pages</th>
<th>Quantity</th>
<th>Publisher</th>
<th>Genre</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
@foreach($books as $book)
<tr>
<td>{{ $book->id }}</td>
<td>{{ $book->title }}</td>
<td>{{ $book->isbn }}</td>
<td>{{ $book->year }}</td>
<td>{{ $book->pages }}</td>
<td>{{ $book->quantity }}</td>
<td>{{ $book->publisher->title }}</td>
<td>{{ $book->genre->title }}</td>
<td>
<a href="{{ url('admin/books/'.$book->id.'/edit') }}" class="btn btn-primary btn-sm"><i class="fas fa-edit"></i> Edit</a>
<a href="{{ url('admin/books/'.$book->id) }}" class="btn btn-success btn-sm"><i class="fas fa-eye"></i> View</a>
{!! Form::open(['method'=>'DELETE', 'url' => ['admin/books', $book->id], 'style' => 'display:inline']) !!}
{!! Form::button('<i class="fas fa-trash-alt"></i> Delete', ['class' => 'btn btn-danger btn-sm', 'type' => 'submit']) !!}
{!! Form::close() !!}
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
@endsection
Vaizdo show.blade.php
programinis kodas:
@extends('layouts.admin')
@section('title', 'Books')
@section('content')
<div class="card">
<div class="card-header">
<a href="{{ url('/admin/books/'.$book->id.'/edit') }}" class="btn btn-primary"><i class="fas fa-edit"></i> Edit book</a>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-bordered">
<tbody>
<tr>
<td>ID</td>
<td>{{ $book->id }}</td>
</tr>
<tr>
<td>Title</td>
<td>{{ $book->title }}</td>
</tr>
<tr>
<td>Description</td>
<td>{{ $book->description }}</td>
</tr>
<tr>
<td>ISBN</td>
<td>{{ $book->isbn }}</td>
</tr>
<tr>
<td>Year</td>
<td>{{ $book->year }}</td>
</tr>
<tr>
<td>Pages</td>
<td>{{ $book->pages }}</td>
</tr>
<tr>
<td>Quantity</td>
<td>{{ $book->quantity }}</td>
</tr>
<tr>
<td>Publisher</td>
<td>{{ $book->publisher->title }}</td>
</tr>
<tr>
<td>Genre</td>
<td>{{ $book->genre->title }}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
@endsection
Vaizdo form.blade.php
programinis kodas:
@extends('layouts.admin')
@section('title', 'Books')
@section('content')
<div class="card">
<div class="card-header">
<h6 class="m-0 font-weight-bold text-primary">
@if(isset($book))
Edit exist book
@else
Create new book
@endif
</h6>
</div>
<div class="card-body">
@if(isset($book))
{!! Form::model($book, ['url' => ['admin/books', $book->id], 'method' => 'patch']) !!}
@else
{!! Form::open(['url' => 'admin/books']) !!}
@endif
<div class="form-group">
{!! Form::label('title', 'Title: ', ['class' => 'col-sm-3']) !!}
<div class="col-sm-6">
{!! Form::text('title', null, ['class' => 'form-control', 'required' => 'required']) !!}
</div>
</div>
<div class="form-group">
{!! Form::label('description', 'Description: ', ['class' => 'col-sm-3']) !!}
<div class="col-sm-6">
{!! Form::textarea('description', null, ['class' => 'form-control']) !!}
</div>
</div>
<div class="form-group">
{!! Form::label('isbn', 'ISBN: ', ['class' => 'col-sm-3']) !!}
<div class="col-sm-6">
{!! Form::text('isbn', null, ['class' => 'form-control', 'required' => 'required']) !!}
</div>
</div>
<div class="form-group">
{!! Form::label('year', 'Year: ', ['class' => 'col-sm-3']) !!}
<div class="col-sm-6">
{!! Form::select('year', $years, null, ['class' => 'form-control', 'required' => 'required']) !!}
</div>
</div>
<div class="form-group">
{!! Form::label('pages', 'Pages: ', ['class' => 'col-sm-3']) !!}
<div class="col-sm-6">
{!! Form::text('pages', null, ['class' => 'form-control', 'required' => 'required']) !!}
</div>
</div>
<div class="form-group">
{!! Form::label('quantity', 'Quantity: ', ['class' => 'col-sm-3']) !!}
<div class="col-sm-6">
{!! Form::text('quantity', null, ['class' => 'form-control', 'required' => 'required']) !!}
</div>
</div>
<div class="form-group">
{!! Form::label('publisher_id', 'Publisher: ', ['class' => 'col-sm-3']) !!}
<div class="col-sm-6">
{!! Form::select('publisher_id', $publishers, null, ['class' => 'form-control', 'required' => 'required']) !!}
</div>
</div>
<div class="form-group">
{!! Form::label('genre_id', 'Genre: ', ['class' => 'col-sm-3']) !!}
<div class="col-sm-6">
{!! Form::select('genre_id', $genres, null, ['class' => 'form-control', 'required' => 'required']) !!}
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-3 col-sm-3">
{!! Form::submit('Save', ['class' => 'btn btn-primary form-control']) !!}
</div>
</div>
{!! Form::close() !!}
</div>
</div>
@endsection
Tada atsidaryite maršrutų failą ir nurodykite knygų maršrutus:
Route::get('/admin/books', [App\Http\Controllers\Admin\BooksController::class, 'index']);
Route::get('/admin/books/create', [App\Http\Controllers\Admin\BooksController::class, 'create']);
Route::post('/admin/books', [App\Http\Controllers\Admin\BooksController::class, 'store']);
Route::get('/admin/books/{id}', [App\Http\Controllers\Admin\BooksController::class, 'show']);
Route::get('/admin/books/{id}/edit', [App\Http\Controllers\Admin\BooksController::class, 'edit']);
Route::patch('/admin/books/{id}', [App\Http\Controllers\Admin\BooksController::class, 'update']);
Route::delete('/admin/books/{id}', [App\Http\Controllers\Admin\BooksController::class, 'destroy']);
Daugiau apie valdiklius skaitykite oficialioje Laravel 10.x dokumentacijoje, skiltyje Controllers.