5
votes

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.

2
show us your blade as well. Make sure your form is of post methodUnamata Sanatarai
I'm using POSTMAN chrome plugin to post it via this URL, I have same exact model called Contacts, on my other Laravel install and it runs smoothly. And yes <form method="post"> is in the blade form as well.D. Look
in postman check if you are sending form-data and not (for example) jsonUnamata Sanatarai
Nah buddy, I'm sending x-www-form-urlencoded, as I've stated in the previous comment I'm doing the same process on my other app and it works.D. Look
Can you show your route/resource definition?neochief

2 Answers

7
votes

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

0
votes

add CSRF field to your form

ex:

<form id="form-login" class="m-t form-horizontal" role="form" method="post" action="/login">
                                    {{csrf_field()}}