简体   繁体   中英

Laravel Route::apiResource Post query didn't work properly

I use laravel as an api but the problem is that when I want to store an item (Model : "Bataille"), i make a Post request on the route "api/batailles/" but laravel execute the index() function of my controller instead of the store() function... (all the others routes work)

This is my route :

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

This is my route list :

    +--------+-----------+--------------------------+-------------------+-------------------------------------------------+------------+
| 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        |
+--------+-----------+--------------------------+-------------------+-------------------------------------------------+------------+

and finally this is my 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"
            ]);
        }
    }
}

How do I can resolve the problem ?

Ensure that your request set to POST method because the routes in resources has the same name but they are different in HTTP methods for example if you use jQuery Ajax set method to POST

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

Your route:list looks good. If you are hitting index() then you are not POSTing, you are GETing. Check your ajax call.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM