Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel POST call returns index() function instead of store()

I'm writing my first app in laravel, it's really nice environment for new laravel developers. To shorten the story: I've created two eloquent models via php artisan commands and created corresponding controllers the same way. One of those is "Members" model, I've created public functions inside the class of the controller, but when I try to POST to the route that should use store() function that route actually uses index() function.

Controller:

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Member;
use Response;

class MemberController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function index()
    {
        $members = Member::all();
        return Response::json([
            'data' => $this->transformCollection($members)
        ], 200);
    }

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

    /**
     * @param Request $request
     * @return mixed
     */
    public function store(Request $request)
    {
        if(! $request->email){
            return Response::json([
                'error' => [
                    'message' => 'Please Provide email'
                ]
            ], 422);
        }
        $Member = Member::create($request->all());

        return Response::json([
            'message' => 'Member Created Succesfully',
            'data' => $this->transform($Member)
        ]);

    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return Response
     */
    public function show($id)
    {
        $Member = Member::find($id);

        if(!$Member){
            return Response::json([
                'error' => [
                    'message' => 'Member does not exist'
                ]
            ], 404);
        }

        return Response::json([
            'data' => $this->transform($Member)
        ], 200);
    }

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

    /**
     * Update the specified resource in storage.
     *
     * @param  int  $id
     * @return Response
     */
    public function update(Request $request, $id)
    {
        if(! $request->user_id){
            return Response::json([
                'error' => [
                    'message' => 'Please Provide user_id'
                ]
            ], 422);
        }

        $Member = Member::find($id);
        if($request->email){
            $Member->email = $request->email;
        }
        if($request->first_name){
            $Member->first_name = $request->first_name;
        }
        if($request->last_name){
            $Member->last_name = $request->last_name;
        }
        if($request->phone){
            $Member->phone = $request->phone;
        }
        if($request->address_one){
            $Member->address_one = $request->address_one;
        }
        if($request->address_two){
            $Member->address_two = $request->address_two;
        }
        if($request->zip_code){
            $Member->zip_code = $request->zip_code;
        }
        if($request->city){
            $Member->city = $request->city;
        }
        if($request->county){
            $Member->county = $request->county;
        }
        if($request->state_region){
            $Member->state_region = $request->state_region;
        }
        if($request->country){
            $Member->country = $request->country;
        }
        if($request->job_title){
            $Member->job_title = $request->job_title;
        }
        if($request->company){
            $Member->company = $request->company;
        }
        if($request->clearance_level){
            $Member->clearance_level = $request->clearance_level;
        }
        $Member->save();
        return Response::json([
            'message' => 'Member Updated Succesfully',
            'data' => $this->transform($Member)
        ]);
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return Response
     */
    public function destroy($id)
    {
        Member::destroy($id);
    }

    /**
     * @Description Data transform
     * @param $contacts
     * @return array
     */
    private function transformCollection($contacts)
    {
        return array_map([$this, 'transform'], $contacts->toArray());
    }

    /**
     * @Description Data transform
     * @param $contact
     * @return array
     */

    private function transform($contact)
    {
        return [
            'id' => $contact['id'],
            'fname' => $contact['first_name'],
            'lname' => $contact['last_name'],
            'email' => $contact['email'],
            'address' => $contact['address_one']
        ];
    }
}

My model is:

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;

class Member extends Model
{
    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'members';
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'email',
        'first_name',
        'last_name',
        'phone',
        'address_one',
        'address_two',
        'zip_code',
        'city',
        'county',
        'state_region',
        'country',
        'job_title',
        'company',
        'clearance_level',
    ];

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */
    protected $hidden = [

    ];
}

My php artisan route:list is:

+--------+-----------+-------------------------------+------------------------+--------------------------------------------------------+------------+
| Domain | Method    | URI                           | Name                   | Action                                                 | Middleware |
+--------+-----------+-------------------------------+------------------------+--------------------------------------------------------+------------+
|        | GET|HEAD  | /                             |                        | Closure                                                |            |
|        | POST      | api/v1/members                | api.v1.members.store   | App\Http\Controllers\MemberController@store            |            |
|        | GET|HEAD  | api/v1/members                | api.v1.members.index   | App\Http\Controllers\MemberController@index            |            |
|        | GET|HEAD  | api/v1/members/create         | api.v1.members.create  | App\Http\Controllers\MemberController@create           |            |
|        | DELETE    | api/v1/members/{members}      | api.v1.members.destroy | App\Http\Controllers\MemberController@destroy          |            |
|        | GET|HEAD  | api/v1/members/{members}      | api.v1.members.show    | App\Http\Controllers\MemberController@show             |            |
|        | PUT|PATCH | api/v1/members/{members}      | api.v1.members.update  | App\Http\Controllers\MemberController@update           |            |
|        | GET|HEAD  | api/v1/members/{members}/edit | api.v1.members.edit    | App\Http\Controllers\MemberController@edit             |            |
|        | GET|HEAD  | auth/login                    |                        | App\Http\Controllers\Auth\AuthController@getLogin      | web,guest  |
|        | POST      | auth/login                    |                        | App\Http\Controllers\Auth\AuthController@postLogin     | web,guest  |
|        | GET|HEAD  | auth/logout                   |                        | App\Http\Controllers\Auth\AuthController@getLogout     | web,guest  |
|        | POST      | auth/register                 |                        | App\Http\Controllers\Auth\AuthController@postRegister  | web,guest  |
|        | GET|HEAD  | auth/register                 |                        | App\Http\Controllers\Auth\AuthController@getRegister   | web,guest  |
|        | POST      | password/email                |                        | App\Http\Controllers\Auth\PasswordController@postEmail | web,guest  |
|        | GET|HEAD  | password/email                |                        | App\Http\Controllers\Auth\PasswordController@getEmail  | web,guest  |
|        | POST      | password/reset                |                        | App\Http\Controllers\Auth\PasswordController@postReset | web,guest  |
|        | GET|HEAD  | password/reset/{token}        |                        | App\Http\Controllers\Auth\PasswordController@getReset  | web,guest  |
+--------+-----------+-------------------------------+------------------------+--------------------------------------------------------+------------+

Route definition:

Route::group(['prefix' => 'api/v1'], function(){       
    Route::resource('members', 'MemberController');
});

I tried both ‍mysite.us/api/v1/members and mysite.us/api/v1/members/

they both return index() on POST.

like image 349
D. Look Avatar asked Mar 23 '16 09:03

D. Look


1 Answers

Your problem has been solved by @Arangor here

Quote:

The problem was adding a trailing '/' to the URL. So, instead of using this URL:

mydomain.com/api/v1/messages/

I tried with this one:

mydomain.com/api/v1/messages

and it worked

like image 163
Danil Pyatnitsev Avatar answered Oct 27 '22 10:10

Danil Pyatnitsev