Question

I get the error when trying to make a post call to /api/subject/search

I assume it's a simple syntax error I'm missing

I have my api routes defined below

Route::group(array('prefix' => 'api'), function()
{
    Route::post('resource/search', 'ResourceController');
    Route::resource('resource', 'ResourceController');


    Route::post('subject/search', 'SubjectController');
    Route::resource('subject', 'SubjectController');

    Route::resource('user', 'UserController');

    Route::controller('/session', 'SessionController');
    Route::post('/login', array('as' => 'session', 'uses' => 'SessionController@Store'));
});

And my controller is mostly empty

class SubjectController extends \BaseController 
{
    public function search()
    {
        $subjects = [];
        if((int)Input::get('grade_id') < 13 && (int)Input::get('grade_id') > 8)
            $subjects = Subject::where('name', 'like', '%HS%')->get();
        else
            $subjects = Subject::where('name', 'not like', '%HS%')->get();

        return Response::json([
            'success' => true,
            'subjects' => $subjects->toArray()
        ]);
    }
    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function index()
    {
            //
    }

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

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

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

    /**
     * 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($id)
    {
            //
    }

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

}
Was it helpful?

Solution

You need to specify the method.

try

Route::post('subject/search', 'SubjectController@search');

See the named route example: Laravel Docs

OTHER TIPS

In your case I think search is not resolved by the controller to load the search() method. You are also sending a POST for search functionality and I guess it's better to do a GET request since POST and PUT are for storing data.

Conventions
When creating API's it's a good thing to stick to naming conventions and patterns.

Solution
Your route could be simpler like this: api.yourdomain.com/api/subject?search=term1,term2. Doing this with a GET query makes it going to the index() method. There you can check the GET params and do your search stuff and return.

Check this for the cleanest and truely RESTful way to make an API in Laravel:

I got same error when accessing object at index of an empty array in view blade php file.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top