【问题标题】:laravel route api request working without any restriction for methodlaravel route api请求工作没有任何方法限制
【发布时间】:2020-03-12 20:52:20
【问题描述】:

我是 laravel 框架的初学者,在构建简单的 api 路由时,我遇到了一个问题: 我已经在 api.php 中创建了

Route::resource('userss','User\UserController');

用户控制器具有标准的 api 方法(索引、存储、显示等) 之后我用这个命令列出了路线:

php artisan list:route

我得到了如下图所示的结果

路由/api.php

use Illuminate\Http\Request;
Route::resource('userss','User\UserController');

用户控制器.php

namespace App\Http\Controllers\User;
use App\Http\Controllers\Controller;
use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Validator;

class UserController extends Controller
{

public $successStatus = 200;
public $appNameToken = 'stiskAppNameToken';
/**
 * Display a listing of the resource.
 *
 * @return \Illuminate\Http\Response
 */
public function index()
{
    //

    $users = User::all();
    return response()->json(['data'=> $users],200);
}

/**
 * Show the form for creating a new resource.
 *
 * @return \Illuminate\Http\Response
 */
public function create()
{
    //
}

/**
 * Store a newly created resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function store(Request $request)
{
    //


    $rules = [
    'name' => 'required|min:4',
    'username' => 'required|min:4|unique:users',
    'email' => 'required|email|unique:users',
    'password' => 'required|min:4|confirmed',
    'status' => 'required',
    'dept_id' => 'required'

    ];

    $this->validate($request,$rules);

    $data = $request->all();
    $data['password'] = bcrypt($request->password);
    $data['verified'] = User::USER_VERIFIED;
    $data['verification_token'] = User::generateVerificationCode();

   $user = User::create($data);
   return response()->json(['data' => $user],201);
}

/**
 * Display the specified resource.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function show($id)
{
    //
    $user = User::findOrFail($id);
    return response()->json(['data'=>$user],200);

}

/**
 * Show the form for editing the specified resource.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function edit($id)
{
    //
}

/**
 * Update the specified resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function update(Request $request, $id)
{
    //
}

/**
 * Remove the specified resource from storage.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function destroy($id)
{
    //
}

}

但现在的问题是每次我从邮递员向mylocal.test/userss/ 提出请求时 使用不同的方法(PUT、POST、GET 等) 我得到了一个用户列表(执行了索引方法!)

有什么问题? 为什么所有方法请求都会执行@index 方法体。

我已经在渲染函数中处理了MethodNotAllowedHttpException 但没办法

假设Route::resource('userss','User\UserController'); 处理这样的问题? 并将我的请求路由到控制器中的正确方法?

更新: 我认为问题出在邮递员或我的本地网络服务器中 同样在使用身份验证后,您将不会遇到此问题 谢谢大家

【问题讨论】:

  • 所有Route::resource 所做的就是注册您正在显示的那些路线,仅此而已
  • 你是否在这个资源之前有一个通配符路由来捕获所有请求并返回用户列表?分享web.php 内容可能会有所帮助。并且控制器代码不会被共享:)
  • @Fadi Ramzi,请您也出示一下您的 Controller 吗?
  • 请向您展示 UserController 的存储功能。
  • @lagbox 是的,我知道,但我找不到问题 :(

标签: php laravel postman


【解决方案1】:

如果您在api.php 中正确定义路由,则它应该在URI 前面有一个api/

请您仔细检查一下好吗?

+--------+-----------+--------------------------+----------------+--------------------------------------------------+--------------+
| Domain | Method    | URI                      | Name           | Action                                           | Middleware   |
+--------+-----------+--------------------------+----------------+--------------------------------------------------+--------------+
|        | GET|HEAD  | /                        |                | Closure                                          | web          |
|        | GET|HEAD  | api/user                 |                | Closure                                          | api,auth:api |
|        | GET|HEAD  | api/userss               | userss.index   | App\Http\Controllers\User\UserController@index   | api          |
|        | POST      | api/userss               | userss.store   | App\Http\Controllers\User\UserController@store   | api          |
|        | GET|HEAD  | api/userss/create        | userss.create  | App\Http\Controllers\User\UserController@create  | api          |
|        | GET|HEAD  | api/userss/{userss}      | userss.show    | App\Http\Controllers\User\UserController@show    | api          |
|        | PUT|PATCH | api/userss/{userss}      | userss.update  | App\Http\Controllers\User\UserController@update  | api          |
|        | DELETE    | api/userss/{userss}      | userss.destroy | App\Http\Controllers\User\UserController@destroy | api          |
|        | GET|HEAD  | api/userss/{userss}/edit | userss.edit    | App\Http\Controllers\User\UserController@edit    | api          |
+--------+-----------+--------------------------+----------------+--------------------------------------------------+--------------+

我克隆了您发布的控制器,但一切正常。
请参考下面的截图。

【讨论】:

  • 我已经从路由 url 中删除了 'api' middlware
  • 问题是,如果我尝试使用无效方法发出请求,我应该得到“方法不允许异常”,但是当例如选择 put 方法和 url mylocal.test/userss 时,我仍然得到用户列表请求应该是“GET”,而不是放置、发布、删除等......
【解决方案2】:

问题不是来自Route::resource(),因为它所做的只是为方法注册它们,但无论如何都要检查尝试手动注册 POST 或任何其他方法。
我认为问题出在控制器上,所以如果你能分享你拥有的控制器的代码,那将会很有帮助。

【讨论】:

  • 嗨 Abdusalam 我已经分享了它:)
【解决方案3】:

当您使用邮递员执行 GET 请求到 url mylocal.test/userss/ 时,您将获得所有用户,因为 /userss 链接到控制器功能索引,如果您想创建用户,您应该使用 /userss/create POST 请求,用于更新用户/{user_id} PUT 或 PATCH 方法等。从路由列表中,您可以清楚地看到方法和路由端点。

祝你好运。

【讨论】:

  • 嗨,我的朋友,我的问题不在于获取、创建、存储、索引等方法......我的问题是当我提出无效请求方法时,例如方法:删除,URL:mylocal.test/用户/我应该得到“不允许删除方法”,但发生的情况是我仍然毫无例外地获得所有用户
猜你喜欢
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多