Robin
Robin

Reputation: 1587

Laravel MethodNotAllowedHttpException after post

I want to post something into the database... But it doesn't work...

I created previous a post form, that works well, but now it doesn't work for another one?!

So here is my Route::group

Route::group(array('before' => 'auth', 'prefix' => 'admin'), function()
{
        Route::resource('/', 'AdminController');
        Route::resource('news', 'AdminNewsController');
        Route::resource('calendar', 'AdminCalendarController');
});

The Model Calendar

<?php

use Illuminate\Database\Eloquent\SoftDeletingTrait;

class Calendar extends Eloquent {

    protected $table = 'event';
    public $timestamps = false;

    use SoftDeletingTrait;

    protected $dates = ['deleted_at'];

}

And the create.blade.php

<div class="portlet-body form">
                        {{ Form::open(['method' => 'post', 'role' => 'form', 'files' => true]) }}

                                <div class="form-body">
                                    <div class="form-group">
                                        <label>Naam</label>
                                        <input type="text" class="form-control" name="name" placeholder="Naam van de rally/event">
                                    </div>

                                    <div class="form-group">
                                        <label>Korte info</label>
                                        <textarea class="form-control" name="short_info" id="text_editor" rows="5" placeholder="Mag nie té lang zijn...">
                                        </textarea>
                                    </div>


                                    <div class="form-group">
                                        <label>Afbeelding / logo evenement</label>
                                    </div>
                                        <div class="form-group">
                                            <div class="fileinput fileinput-new" data-provides="fileinput"><input type="hidden">
                                                <div class="fileinput-new thumbnail" style="width: 200px; height: 150px;">
                                                    <img src="{{ Config::get('app.url') }}/public/img/10877743_338215636368840_1736631818_n.png" alt="">
                                                </div>
                                                <div class="fileinput-preview fileinput-exists thumbnail" style="max-width: 200px; max-height: 150px; line-height: 10px;">
                                                </div>
                                                <div>
                                                    <span class="btn default btn-file">
                                                        <span class="fileinput-new">
                                                             Selecteer een afbeelding
                                                        </span>
                                                        <span class="fileinput-exists">
                                                             Verander
                                                        </span>
                                                        {{ Form::file('img') }}
                                                    </span>
                                                    <a href="#" class="btn default fileinput-exists" data-dismiss="fileinput">
                                                         Verwijder
                                                    </a>
                                                </div>
                                            </div>
                                        </div>


                                    <div class="form-group">
                                        <label>Doen we podium?</label>
                                        <div class="radio-list">

                                            <label class="radio-inline">
                                            <span>
                                            {{ Form::radio('podium', 'true') }}
                                            </span>
                                            <b style="color:green">Ja</b>
                                            </label>

                                            <label class="radio-inline">
                                            <span>
                                            {{ Form::radio('podium', 'false', true) }}
                                            </span>
                                            <b style="color:red">Nee</b>
                                            </label>


                                        </div>
                                    </div>

                                    <div class="form-group">
                                        <label>Studio aanwezig?</label>
                                        <div class="radio-list">

                                            <label class="radio-inline">
                                            <span>
                                            {{ Form::radio('studio', 'true') }}
                                            </span>
                                            <b style="color:green">Ja</b>
                                            </label>

                                            <label class="radio-inline">
                                            <span>
                                            {{ Form::radio('studio', 'false', true) }}
                                            </span>
                                            <b style="color:red">Nee</b>
                                            </label>


                                        </div>
                                    </div>

                                    <div class="form-group">
                                        <label>Is er rallyradio?</label>
                                        <div class="radio-list">

                                            <label class="radio-inline">
                                            <span>
                                            {{ Form::radio('radio', 'true') }}
                                            </span>
                                            <b style="color:green">Ja</b>
                                            </label>

                                            <label class="radio-inline">
                                            <span>
                                            {{ Form::radio('radio', 'false', true) }}
                                            </span>
                                            <b style="color:red">Nee</b>
                                            </label>


                                        </div>
                                    </div>

                                    <div class="form-group">
                                        <label>Website</label>
                                        <input type="text" class="form-control" name="site" placeholder="Website van het evenement">
                                    </div>

                                    <div class="form-group">
                                        <label class="control-label">Start datum</label>
                                        <input type="date" name="start_date" class="form-control" placeholder="dd/mm/yyyy">
                                    </div>

                                    <div class="form-group">
                                        <label class="control-label">Eind datum</label>
                                        <input type="date" name="expire_date" class="form-control" placeholder="dd/mm/yyyy">
                                    </div>

                                </div>

                                <div class="form-actions">
                                    <input type="submit" class="btn green" value="Oplsaan" />
                                </div>

                            {{ Form::close() }}
                        </div>

Also my controller AdminCalendarController.php

public function store()
    {
        $rules = array(
            'name'              => 'required',
            'short_info'        => 'required',
            'podium'            => 'required',
            'radio'             => 'required',
            'studio'            => 'required',
            'site'              => 'required',
            'start_date'        => 'required',
            'expire_date'       => 'required'
            );
        $validator = Validator::make(Input::all(), $rules);

        //process the storage
        if ($validator->fails())
        {
            Session::flash('error_message', 'Fout:' . $validator->errors());
            return Redirect::to('admin/calendar/create')->withErrors($validator);
        }else{

            //store
            $event                          = new Calendar;
            $event->rally_name              = Input::get('name');
            $event->short_info              = Input::get('short_info');
            $event->is_podium               = Input::get('podium');
            $event->is_studio               = Input::get('studio');
            $event->is_radio                = Input::get('radio');
            $event->website                 = Input::get('site');
            $event->image                   = Input::file('img')->getClientOriginalName();
            $event->posted_by               = Auth::user()->username;
            $event->start_date              = strtotime(Input::get('start_date'));
            $event->expire                  = strtotime(Input::get('expire_date'));
            $event->published_at            = time();
            $event->save();

            //save the image
            $destinationPath = 'public/img/uploads';

            if (Input::hasFile('img'))
            {
                $file = Input::file('img');
                $file->move('public/img/uploads', $file->getClientOriginalName());
            }
            //redirect
            Session::flash('success', 'Evenement succesvol aangemaakt!');
            return Redirect::to('admin/calendar/create');

        }

The rendered HTML (view-source):

<form method="POST" action="http://192.168.0.233/RPR/calendar" accept-charset="UTF-8" role="form" enctype="multipart/form-data"><input name="_token" type="hidden" value="tS5YojudgN6wGJpq59IYlN4DdiqW9o45pIrDvR7X">

                                <div class="form-body">
                                    <div class="form-group">
                                        <label>Naam</label>
                                        <input type="text" class="form-control" name="name" placeholder="Naam van de rally/event">
                                    </div>

                                    <div class="form-group">
                                        <label>Korte info</label>
                                        <textarea class="form-control" name="short_info" id="text_editor" rows="5" placeholder="Mag nie té lang zijn...">
                                        </textarea>
                                    </div>


                                    <div class="form-group">
                                        <label>Afbeelding / logo evenement</label>
                                    </div>
                                        <div class="form-group">
                                            <div class="fileinput fileinput-new" data-provides="fileinput"><input type="hidden">
                                                <div class="fileinput-new thumbnail" style="width: 200px; height: 150px;">
                                                    <img src="http://192.168.0.233/RPR/public/img/10877743_338215636368840_1736631818_n.png" alt="">
                                                </div>
                                                <div class="fileinput-preview fileinput-exists thumbnail" style="max-width: 200px; max-height: 150px; line-height: 10px;">
                                                </div>
                                                <div>
                                                    <span class="btn default btn-file">
                                                        <span class="fileinput-new">
                                                             Selecteer een afbeelding
                                                        </span>
                                                        <span class="fileinput-exists">
                                                             Verander
                                                        </span>
                                                        <input name="img" type="file">
                                                    </span>
                                                    <a href="#" class="btn default fileinput-exists" data-dismiss="fileinput">
                                                         Verwijder
                                                    </a>
                                                </div>
                                            </div>
                                        </div>


                                    <div class="form-group">
                                        <label>Doen we podium?</label>
                                        <div class="radio-list">

                                            <label class="radio-inline">
                                            <span>
                                            <input name="podium" type="radio" value="true">
                                            </span>
                                            <b style="color:green">Ja</b>
                                            </label>

                                            <label class="radio-inline">
                                            <span>
                                            <input checked="checked" name="podium" type="radio" value="false">
                                            </span>
                                            <b style="color:red">Nee</b>
                                            </label>


                                        </div>
                                    </div>

                                    <div class="form-group">
                                        <label>Studio aanwezig?</label>
                                        <div class="radio-list">

                                            <label class="radio-inline">
                                            <span>
                                            <input name="studio" type="radio" value="true">
                                            </span>
                                            <b style="color:green">Ja</b>
                                            </label>

                                            <label class="radio-inline">
                                            <span>
                                            <input checked="checked" name="studio" type="radio" value="false">
                                            </span>
                                            <b style="color:red">Nee</b>
                                            </label>


                                        </div>
                                    </div>

                                    <div class="form-group">
                                        <label>Is er rallyradio?</label>
                                        <div class="radio-list">

                                            <label class="radio-inline">
                                            <span>
                                            <input name="radio" type="radio" value="true">
                                            </span>
                                            <b style="color:green">Ja</b>
                                            </label>

                                            <label class="radio-inline">
                                            <span>
                                            <input checked="checked" name="radio" type="radio" value="false">
                                            </span>
                                            <b style="color:red">Nee</b>
                                            </label>


                                        </div>
                                    </div>

                                    <div class="form-group">
                                        <label>Website</label>
                                        <input type="text" class="form-control" name="site" placeholder="Website van het evenement">
                                    </div>

                                    <div class="form-group">
                                        <label class="control-label">Start datum</label>
                                        <input type="date" name="start_date" class="form-control" placeholder="dd/mm/yyyy">
                                    </div>

                                    <div class="form-group">
                                        <label class="control-label">Eind datum</label>
                                        <input type="date" name="expire_date" class="form-control" placeholder="dd/mm/yyyy">
                                    </div>

                                </div>

                                <div class="form-actions">
                                    <input type="submit" class="btn green" value="Oplsaan" />
                                </div>

                            </form>

In my other form post, I got exactly the same, but this one doesn't work, the other one does...

Upvotes: 0

Views: 336

Answers (1)

Arthur Samarcos
Arthur Samarcos

Reputation: 3299

By using

Route::resource('calendar', 'AdminCalendarController')

You are automatically setting a CRUD set of route rules.

Your create form has it's set action to itself.

Form::open(['method' => 'post', 'role' => 'form', 'files' => true])

So when you submit your are using POST on '/calendar/create', when you should be using POST on /calendar.

And that's why you are getting the MethodNotAllowedHttpException. There is no POST route to 'calendar/create'.

Try doing this (remember you are using a group 'admin' prefix):

Form::open(['method' => 'post', 'url' => url('admin/calendar'), 'role' => 'form', 'files' => true])

or

Form::open(['method' => 'post', 'url' => action('AdminCalendarController@store'), 'role' => 'form', 'files' => true])

PS: By looking at your code I know you are aware of what CRUD/REST is, but I gave some explanation to help others.

Upvotes: 2

Related Questions