Как отправить переменную с блейда на контроллер без изменения 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;
    }
Другие вопросы по тегам