Nas Atchia
Nas Atchia

Reputation: 407

Laravel Form PUT method not working

I created a form to update the role model but on clicking on the save button, it does not appear to submit to the controller method. Even the validation errors message does not appear if the name input field is invalid. Below you can find the code used for the form.

Form:

{!! Form::model($role, ['route' => ['roles.update', $role->id], 'method' => 'put']) !!}

   @include('roles.fields')

{!! Form::close() !!}

The fields for the form are:

<!-- Name Field -->
<div class="form-group col-sm-6">
   {!! Form::label('name', 'Name:') !!}
   {!! Form::text('name', null, ['class' => 'form-control']) !!}
</div>

<!-- Display Name Field -->
<div class="form-group col-sm-6">
   {!! Form::label('display_name', 'Display Name:') !!}
   {!! Form::text('display_name', null, ['class' => 'form-control']) !!}
</div>

<!-- Description Field -->
<div class="form-group col-sm-12 col-lg-12">
   {!! Form::label('description', 'Description:') !!}
   {!! Form::textarea('description', null, ['class' => 'form-control',   'rows' => '5']) !!}
</div>

<!-- Submit Field -->
<div class="form-group col-sm-12">
   {!! Form::submit('Save', ['class' => 'btn btn-primary']) !!}
   <a href="{!! route('roles.index') !!}" class="btn btn-  default">Cancel</a>
</div>

Request:

namespace App\Http\Requests;

use App\Http\Requests\Request;
use App\Models\Role;

class UpdateRoleRequest extends Request
{

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
     public function authorize()
     {
         return true;
     }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
     public function rules()
     {
         return Role::$rules;
     }
}

Controller:

/**
 * Update the specified Role in storage.
 *
 * @param  int              $id
 * @param UpdateRoleRequest $request
 *
 * @return Response
 */
public function update($id, UpdateRoleRequest $request)
{
    $role = $this->roleRepository->findWithoutFail($id);

    if (empty($role)) {
        Flash::error('Role not found');

        return redirect(route('roles.index'));
    }

    $role = $this->roleRepository->update($request->all(), $id);

    Flash::success('Role updated successfully.');

    return redirect(route('roles.index'));
}

Model:

<?php

namespace App\Models;

use Eloquent as Model;
use Zizaco\Entrust\EntrustRole;
use Illuminate\Database\Eloquent\SoftDeletes;

class Role extends EntrustRole
{
    use SoftDeletes;

    public $table = 'roles';

    protected $dates = ['deleted_at'];

    public $fillable = [
        'name',
        'display_name',
        'description'
    ];

    /**
     * The attributes that should be casted to native types.
     *
     * @var array
     */
    protected $casts = [
        'name' => 'string',
        'display_name' => 'string'
    ];

    /**
     * Validation rules
     *
     * @var array
     */
    public static $rules = [
        'name' => 'required|unique:roles'
    ];
}

Please help if possible. Thanks!

Upvotes: 6

Views: 16976

Answers (2)

Vrian7
Vrian7

Reputation: 598

For those people that work with HTML and laravel 5.2:

<form method="post" ... > {{ method_field('PUT') }} ... </form>

Hope this help people.

Upvotes: 7

Pawel Bieszczad
Pawel Bieszczad

Reputation: 13325

You cant use put as the form method. Read the documentation about method spoofing in laravel

{!! Form::model($role, ['route' => ['roles.update', $role->id], 'method' => 'post']) !!}
   <input type="hidden" name="_method" value="PUT">

   @include('roles.fields')

{!! Form::close() !!}

Upvotes: 12

Related Questions