Как отправить переменную с блейда на контроллер без изменения URL-адреса
В клинке у меня есть список книг. Я хочу выбрать конкретную книгу, чтобы показать информацию о ней. И для этого я хочу отправить с href идентификатор книги на мой контроллер, проходящий через маршрут.
Например, у меня есть
<div class="body text-center">
<a href="{{HERE!}}"><h6><b>{{($book->getName())}}</b></h6></a>
</div>
В href я хочу добавить $bookId = $book->id и имя маршрута, чтобы я мог вызвать маршрут с определенным именем, которое вызывает метод в контроллере, который может использовать переменную $bookId
Route::get('/infromation','Books\BookController@index')->name('info');
2 ответа
Вот два предложения:
- Первый - использовать https://github.com/spatie/laravel-sluggable, чтобы имя книги было в URL-адресе.
- Второй - доступ к книге без изменения URL-адреса с помощью POST-запроса.
С помощью
spatie/laravel-sluggable
Слаг будет автоматически сгенерирован из name
когда книга создана.
ваш-migration.php
Schema::create('books', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('slug')->unique()->index();
$table->string('name');
// ...
$table->timestamps();
});
web.php
// Change the URIs as you want. `{book}` is mandatory to retrieve the book though.
Route::get('/books','Books\BookController@index')->name('book.index');
Route::get('/books/{book}','Books\BookController@show')->name('book.show');
Book.php
use Spatie\Sluggable\HasSlug;
use Spatie\Sluggable\SlugOptions;
class Book extends Model
{
use HasSlug;
protected $guarded = [];
public function getSlugOptions()
{
// Adapt with what you want
return SlugOptions::create()
->generateSlugsFrom('name')
->saveSlugsTo('slug')
->doNotGenerateSlugsOnUpdate();
}
public function getRouteKeyName()
{
return 'slug';
}
}
BookController.php
class BookController extends Controller
{
public function index()
{
return view('book.index');
}
public function show(Book $book)
{
// $book is retrieving using Model Binding: https://laravel.com/docs/5.8/routing#route-model-binding
return view('book.show', compact('book'));
}
}
index.blade.php
<div class="body text-center">
<a href="{{ route('book.show', $book) }}">
<h6><b>{{ $book->getName() }}</b></h6>
</a>
</div>
С использованием POST-запроса (URI не меняется) и без SLUG
Я бы не рекомендовал использовать это для удобства пользователей.
- Пользователь не может добавить книгу в закладки или поделиться ссылкой с кем-то другим.
- При обновлении страницы пользователю будет предложено повторно отправить запрос формы.
web.php
Route::get('/books','Books\BookController@index')->name('book.index');
Route::post('/books','Books\BookController@show')->name('book.show');
BookController.php
class BookController extends Controller
{
public function index()
{
return view('book.index');
}
public function show()
{
$book = Book::findOrFail(request('book_id'));
return view('book.show', compact('book'));
}
}
index.blade.php
<div class="body text-center">
<form action="{{ route('book.show') }}" method="POST">
@csrf
<input type="hidden" value="{{ $book->id }}" name="book_id">
<h6>
<button type="submit">
<b>{{ $book->getName() }}</b>
</button>
</h6>
</form>
</div>
Вы можете удалить стиль кнопки по умолчанию, чтобы он выглядел как ссылка /questions/6803652/udalit-polnyij-stil-knopki-html-otpravit/6803669#6803669
Вы можете попробовать вот так
<form action="/BookName/information/<?php echo $book->id; ?>" method="post">
<div class="body text-center">
<input type="hidden" name="book_id" value="{{ $book->id }}">
<a href="/information/<?php echo $book->id; ?>">
<button type="submit" name="book_information" class="btn btn-primary">
<h6>
<b>{{($book->getName())}}</b>
</h6>
</button>
</div>
</form>
// make route like this
Route::post('/BookName/information/{id}','Books\BookController@index');
// Access the that id in controller
public function index(Request $request)
{
echo $request->book_id;
}