Laravel Route::apiResource Post 查询无法正常工作

Posted

技术标签:

【中文标题】Laravel Route::apiResource Post 查询无法正常工作【英文标题】:Laravel Route::apiResource Post query didn't work properly 【发布时间】:2021-02-04 18:41:20 【问题描述】:

我使用 laravel 作为 api,但问题是当我想存储一个项目(模型:“Bataille”)时,我在路由“api/batailles/”上发出一个 Post 请求,但 laravel 执行 index()我的控制器的功能而不是 store() 功能...(所有其他路由都有效)

这是我的路线:

Route::apiResource('batailles', 'BatailleController');

这是我的路线清单:

    +--------+-----------+--------------------------+-------------------+-------------------------------------------------+------------+
| Domain | Method    | URI                      | Name              | Action                                          | Middleware |
+--------+-----------+--------------------------+-------------------+-------------------------------------------------+------------+
|        | GET|HEAD  | api/batailles            | batailles.index   | App\Http\Controllers\BatailleController@index   | api        |
|        | POST      | api/batailles            | batailles.store   | App\Http\Controllers\BatailleController@store   | api        |
|        | GET|HEAD  | api/batailles/bataille | batailles.show    | App\Http\Controllers\BatailleController@show    | api        |
|        | PUT|PATCH | api/batailles/bataille | batailles.update  | App\Http\Controllers\BatailleController@update  | api        |
|        | DELETE    | api/batailles/bataille | batailles.destroy | App\Http\Controllers\BatailleController@destroy | api        |
|        | GET|HEAD  | api/lieus                | lieus.index       | App\Http\Controllers\LieuxController@index      | api        |
|        | POST      | api/lieus                | lieus.store       | App\Http\Controllers\LieuxController@store      | api        |
|        | GET|HEAD  | api/lieus/lieu         | lieus.show        | App\Http\Controllers\LieuxController@show       | api        |
|        | PUT|PATCH | api/lieus/lieu         | lieus.update      | App\Http\Controllers\LieuxController@update     | api        |
|        | DELETE    | api/lieus/lieu         | lieus.destroy     | App\Http\Controllers\LieuxController@destroy    | api        |
+--------+-----------+--------------------------+-------------------+-------------------------------------------------+------------+

最后这是我的 BatailleController :

<?php

namespace App\Http\Controllers;

use App\Bataille;
use Illuminate\Http\Request;

class BatailleController extends Controller

    /**
     * Display a listing of the resource.
     *
     * @return string
     */
    public function index()
    
        return Bataille::all()->toJson();

    

    /**
     * Store a newly created resource in storage.
     *
     * @param \Illuminate\Http\Request $request
     * @return false|string
     */
    public function store(Request $request)
    
        $bataille = new Bataille([
            "nom"       =>$request->input("nom"),
            "date"      =>$request->input("date"),
            "lieus_id"  =>$request->input("lieus_id")
        ]);


        if($bataille->save()) 
            return json_encode([
                "method"=>"store",
                "status"=>"OK"
            ]);
         else 
            return json_encode([
                "method"=>"store",
                "status"=>"FAILED"
            ]);
        
    

    /**
     * Display the specified resource.
     *
     * @param \App\Bataille $bataille
     * @return string
     */
    public function show(Bataille $bataille)
    
        return Bataille::find($bataille->id)->toJSON();
    

    /**
     * Update the specified resource in storage.
     *
     * @param \Illuminate\Http\Request $request
     * @param \App\Bataille $bataille
     * @return false|string
     */
    public function update(Request $request, Bataille $bataille)
    
        $bataille1 = Bataille::find($bataille->id);


        if ($request->input("nom") != null) 
            $bataille1->nom = $request->input("nom");

        

        if ($request->input("date") != null) 
            $bataille1->date = $request->input("date");
        

        if ($request->input("lieus_id") != null) 
            $bataille1->lieus_id = $request->input("lieus_id");
        

       if ($bataille1->save()) 
            return json_encode([
                "method" => "update",
                "status" => "OK"
            ]);
         else 
            return json_encode([
                "method" => "update",
                "status" => "FAILED"
            ]);
        
    

    /**
     * Remove the specified resource from storage.
     *
     * @param \App\Bataille $bataille
     * @return false|string
     */
    public function destroy(Bataille $bataille)
    
        $batailled = Bataille::find($bataille->id);
        if($batailled->delete()) 
            return json_encode([
                "method"=>"destroy",
                "status"=>"OK"
            ]);
         else 
            return json_encode([
                "method"=>"destroy",
                "status"=>"FAILED"
            ]);
        
    


我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

您的路线:列表看起来不错。如果你点击 index() 那么你不是在发布,你是在获取。检查您的 ajax 调用。

【讨论】:

【参考方案2】:

确保您的请求设置为 POST 方法,因为资源中的路由具有相同的名称但它们在 HTTP 方法中不同,例如如果您使用 jQuery Ajax 设置方法来 POST

$.ajax(
    method: "POST",
    url: window.location.origin + "/api/batailles",
    data: 
        name: "John",
        location: "Boston"
    
)
.done(function(msg) 
    alert("Data Saved: " + msg);
);

【讨论】:

好的,谢谢你,我猜是邮递员没有发出帖子请求,用 axios 一切正常!

以上是关于Laravel Route::apiResource Post 查询无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:laravel 可翻译插件

win 怎么laravel命令

laravel 安装失败

laravel validator怎么验证整数

Laravel 图像规则验证不适用于 Laravel 8,但适用于 Laravel 7 |拉拉维尔 |图片 |验证

laravel和mongo怎么搭配使用