【问题标题】:Laravel - Removing model id from address bar while using RESTful controllerLaravel - 使用 RESTful 控制器时从地址栏中删除模型 ID
【发布时间】:2017-01-22 23:09:36
【问题描述】:

在查看或编辑模型的详细信息时,是否有任何辅助函数不允许我们在地址栏中看到模型的 ID?

例如如果我尝试使用id 1 编辑用户的详细信息,浏览器中的地址会显示: myapp.dev/users/1/edit

我宁愿它显示为myapp.dev/users/edit

知道该怎么做吗?

【问题讨论】:

  • 那么应用程序如何知道您正在编辑 id = 1 的用户,而不是 id = 2 的用户?还有一个问题:你为什么要这么做?
  • 我将使用类似Route::get('users/{id}/edit', 'UserController@edit');的路由
  • 我只是不希望用户能够输入将他们带到其他用户页面的查询。我可以用中间件做到这一点吗?
  • 所以是自己编辑页面吗?
  • @zerkms 是的,允许用户通过在地址栏中的id 中插入另一个数字来编辑自己的页面,而不是其他人

标签: php laravel rest


【解决方案1】:

然后使用 POST

<form action="{{ route('user.edit', $user->id) }}" method="POST">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
    <button type="submit" class="btn ">Edit
</form>

你需要在路由中做一些修改

Route::post('users/{id}/edit', 'UserController@edit');

【讨论】:

    【解决方案2】:

    我认为可以做一个“正常”的路线:

    Route::get('users/edit', 'UserController@edit');
    

    以及控制器中的方法:

    public function edit(){
        $user = Auth::user();
        return view('users.edit',['user' => $user]);
    }
    

    当您的控制器中有$user 时,您还可以使用关系找到属于他的其他模型。但是,我也同意这不是最好的主意。最好在路径中提供iduser


    实际上,您需要像这样在每条路线中登录用户。所以你的路由也应该使用auth中间件:

    Route::get('users/edit', 'UserController@edit')->middleware('auth');
    

    【讨论】:

    • 我在控制器的构造函数中使用auth中间件
    【解决方案3】:

    我不认为有一个辅助函数可以做到这一点。

    如果您只想从 url 中删除 id,则可以使用 HTML5。有这个功能可以让你change the URL without reloading the page:

    window.history.pushState(“object or string”, “Title”, “/new-url”);
    

    但也许这不是你想要的。也许你只是不希望用户更改该 ID 以访问其他用户帐户。所以你可以使用一个叫做Authorization的东西。这允许您阻止用户做他们不允许做的事情。

    【讨论】:

      【解决方案4】:

      我想建议您使用Laravel Hashids,这里是installation steps。安装后添加服务提供商并做供应商发布

      在生成 URL 之前简单地对 id 进行编码

      $encoded = Hashids::encode($id);
      

      然后,您的网址将是

      http://mywebsite.com/users/e3423gsf562/edit

      这里,URL中的长度和字母数字字符串可以在config/hashids.php文件下配置

      然后在您的控制器中,您可以对它们进行解码并使用它。

      $id = collect(Hashids::decode($id))->first();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-12
        • 1970-01-01
        • 2012-06-13
        • 2019-12-05
        • 1970-01-01
        • 2017-07-12
        • 1970-01-01
        相关资源
        最近更新 更多