【问题标题】:Redirect back to same page (with variables) on form submit in Laravel 5在 Laravel 5 中提交表单时重定向回同一页面(带有变量)
【发布时间】:2016-07-26 02:02:50
【问题描述】:

在我的页面 events.index 上,我首先显示登录用户的事件列表。

在我的索引页面上,我有一个带有选项/选择的表单,让用户选择并显示另一个用户的事件。当他提交该表单时,我希望我的索引函数(控制器)使用 $user_id 值(来自表单)并再次显示 events.index 页面,但针对该选定用户的事件。

我不确定最好的方法是什么:

  • 设置会话变量以保留 user_id 值?不知道如何使用表单来做到这一点。
  • 使用 get 方法提交表单(并获得丑陋的 ?user_id=1 URL)
  • 更改我的索引路由以接受 post 方法(尽管我已经采用了该 post/events 路由(通过 Route::post('events', 'EventsController@store'))

不确定什么是干净的方法:

我的事件/索引路线:

Route::get('events', [
'as' => 'event.index',
'uses' => 'EventsController@index'
]);

事件控制器

public function index()
{
    // How to get the $user_id value from form?

    if (empty($user_id)) 
    {
        $user_id = \Auth::user()->id;
    }

    $events = Event::where('events.user_id','=','$user_id');        
    $users  = User::all();

    return view('events.index')->with(['events' => $events])->with(['users' => $users]);
}

查看索引

{!! Form::open(['route' => 'events.index', 'method' => 'get']) !!}

    <select id="user_id" name="user_id">
    @foreach($users as $user)
        <option value="{{$user->id}}">{{$user->name}}</option>
    @endforeach
    </select>

{!! Form::submit('Show events for this user') !!}

{!! Form::close() !!}   


@foreach($events as $event)
     ...
@endforeach

【问题讨论】:

  • 我会使用选项#2,因为在我看来这是最简洁的方式:用户#1 查看用户#2 的事件,因此用户#1 应该位于类似 ?user=2 的 URL 上
  • 您可以只使用 javascript 进行过滤,除非您需要全局保存过滤器,例如,选择用户 A,然后其他页面也将按用户 A 过滤。在这种情况下,我会使用一个 ajax 帖子,用于保存用户过滤器值,并让您的所有查询都按此过滤器(如果已设置)。
  • @jakub_jo 不是说它不干净,而是它不会生成漂亮的 url。

标签: laravel laravel-5


【解决方案1】:

您可以从Request 对象中获取user_id,您只需将其注入到 index 方法中:

public function index(Request $request)
{
    $user_id = $request->get('user_id') ?: Auth::id();

    $events = Event::where('events.user_id','=','$user_id')->get();

    $users  = User::all();

    return view('events.index')->with(['events' => $events])->with(['users' => $users]);
}

【讨论】:

  • 是的,但这是否意味着我的路线需要从Route::getRoute::post
  • 好吧,我想我的意思是,为了隐藏 URL (?user_id=1) 的丑陋部分,我仍然需要更改我的表单和路由到 Post
  • 如果这是您的意图,那么您可以简单地在您的路线文件中添加另一行 Route::post('events', 'EventsController@index'); 或更改您现有的定义 Route::any(... 。在我看来,路线参数在需要时一点也不难看,而且节省大量不必要的代码。
  • 我可以将Route::get('events', 'EventsController@index') 更改为Route::post('events', 'EventsController@index'),但问题是我也有以下路线:Route::post('events', 'EventsController@store'),所以它们不能一起工作,因为它们具有相同的名称。感谢您的帮助
  • 那么你将不得不使用丑陋的网址:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 1970-01-01
  • 1970-01-01
  • 2019-08-31
相关资源
最近更新 更多