Laravel 如何在不更改url的情况下将变量从刀片服务器发送到控制器

Laravel 如何在不更改url的情况下将变量从刀片服务器发送到控制器,laravel,laravel-blade,laravel-6,laravel-controller,laravel-route,Laravel,Laravel Blade,Laravel 6,Laravel Controller,Laravel Route,我有一张书单。我想选择一本特定的书来显示它的信息。要做到这一点,我想通过href将书的id发送给我的控制器,使其通过路由 比如我有 <div class="body text-center"> <a href="{{HERE!}}"><h6><b>{{($book->getName())}}</b></h6></a> </div> 你可以这样试试 <form action

我有一张书单。我想选择一本特定的书来显示它的信息。要做到这一点,我想通过href将书的id发送给我的控制器,使其通过路由

比如我有

 <div class="body text-center">
 <a href="{{HERE!}}"><h6><b>{{($book->getName())}}</b></h6></a>
 </div> 

你可以这样试试

    <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;
    }

这里有两个命题:

  • 第一个是在URL中使用图书名称
  • 第二种方法是通过POST请求访问书籍而不更改URL
使用
spatie/laravel slaggable

创建图书时,将从
name
自动生成slug

您的migration.php

Schema::create('books',函数(Blueprint$table){
$table->bigIncrements('id');
$table->string('slug')->unique()->index();
$table->string('name');
// ...
$table->timestamps();
});
web.php

//根据需要更改URI`{book}`是检索该书所必需的。
路线::获取('/books',books\BookController@index')->name('book.index');
路由::获取('/books/{book}','books\BookController@show')->name('book.show');
Book.php

使用空间\slagable\HasSlug;
使用空间\Sluggable\SlugOptions;
类目扩展模型
{
使用HasSlug;
受保护的$guarded=[];
公共函数getSlugOptions()
{
//适应你想要的
返回选项::创建()
->generateSlugsFrom('名称')
->saveSlugsTo('slug'))
->不要生成lugsonUpdate();
}
公共函数getRouteKeyName()
{
返回“slug”;
}
}
BookController.php

类BookController扩展控制器
{
公共职能指数()
{
返回视图('book.index');
}
公共活动展览(图书$Book)
{
//$book正在使用模型绑定进行检索:https://laravel.com/docs/5.8/routing#route-模型绑定
返回视图('book.show',压缩视图('book');
}
}
index.blade.php



使用POST请求(URI不变)且不使用SLUG

我不建议将此用于用户体验

  • 用户无法为该书添加书签或与其他人共享链接
  • 刷新页面时,它将提示用户是否要重新提交表单请求
web.php

Route::get('/books',books\BookController@index')->name('book.index');
路线::post(“/books”,“books”\BookController@show')->name('book.show');
BookController.php

类BookController扩展控制器
{
公共职能指数()
{
返回视图('book.index');
}
公共活动展览(
{
$book=book::findOrFail(请求('book_id'));
返回视图('book.show',压缩视图('book');
}
}
index.blade.php


@csrf
{{$book->getName()}
可以删除默认按钮样式,使其看起来像链接

我不确定你想要什么。您不想更改URL,但想添加ID。(可能是POST请求?)。路由是否也应返回
索引
?url:/books->显示所有书籍的位置我选择其中一本书,并希望显示的url变为:/{book name}/info或just/info,我还想将所选图书的id发送到控制器Bookcontroller。如果您希望URL中的图书名称是推荐的,那么您需要一个可接受的名称吗?我不知道。我还要看一看,我不建议像
/info
这样的URL不使用
id
slug
,因为在我看来,当尝试访问资源时,它提供了一个糟糕的用户体验。好的,但我不想在url上显示id。是否可以发送id并保留url“/information”或发送id并将url更改为“/bookName/information”?我会按照您所说的更新我的答案,因此请检查
    <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;
    }