Orvyl
Orvyl

Reputation: 2785

Laravel 4: Resource controller with prefix

In my route.php i have:

Route::group(array('prefix'=>'admin'),function(){
     Route::resource('products','AdminProductsController');
});

But when I do the STORE function which is a POST, it throws a MethodNotAllowedHttpException but it works well for the all the GET function.

The value of my form's action is {{ URL::to('admin/products/store') }}.

AdminProductsController.php is in controller/admin directory.

Please help.

Controller:

<?php

class AdminProductsController extends BaseController {

/**
 * Display a listing of the resource.
 *
 * @return Response
 */
public function index()
{
    return 'Yow';
}

/**
 * Show the form for creating a new resource.
 *
 * @return Response
 */
public function create()
{
    $url = URL::to('admin/products/store');

    return<<<qaz
    <form method="post" action="{$url}">
        <input type="hidden" name="hehehe" value="dfsgg" />
        <input type="submit" />
    </form>
qaz;
}

/**
 * Store a newly created resource in storage.
 *
 * @return Response
 */
public function store()
{
    return 'whahaha';
}

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

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

/**
 * Update the specified resource in storage.
 *
 * @param  int  $id
 * @return Response
 */
public function update($id)
{
    //
}

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

}

Upvotes: 2

Views: 2633

Answers (2)

Andreyco
Andreyco

Reputation: 22862

The trick is in the Route used in your example.

Try this

<form method="post" action="{{ URL::route('admin.products.store') }}">

Now you should be good to go!

Advice: get a look at url/actions/named routes in Laravel - may be usefull.

Upvotes: 1

msturdy
msturdy

Reputation: 10794

From the Laravel docs, the store action is accessed via the root path of the Controller (in your case /admin/products), but is triggered by the POST verb, rather than GET, which triggers the index action.

In other words, if you update the $url you're setting as the form's action in your create() action:

public function create()
{
    $url = URL::to('admin/products');

    return<<<qaz
    <form method="post" action="{$url}">
        <input type="hidden" name="hehehe" value="dfsgg" />
        <input type="submit" />
    </form>
qaz;
}

And that Should Just Work. :)

Check out the table of Verb | Path | Action | Route Name in that link above for more details. The path column shows where you can access the actions.

Upvotes: 0

Related Questions