64

Hello I'm creating an API using REST and Laravel following this article.

Everything works well as expected.

Now, I want to map a GET request to recognise a variable using "?".

For example: domain/api/v1/todos?start=1&limit=2.

Below is the contents of my routes.php :

Route::any('api/v1/todos/(:num?)', array(
    'as'   => 'api.todos',
    'uses' => 'api.todos@index'
));

My controllers/api/todos.php :

class Api_Todos_Controller extends Base_Controller {

    public $restful = true;

    public function get_index($id = null) {
        if(is_null($id)) {
            return Response::eloquent(Todo::all(1));

        } else {
            $todo = Todo::find($id);
            if (is_null($todo)) {
                return Response::json('Todo not found', 404);
            } else {
                return Response::eloquent($todo);   
            }
        }
    }
}

How do I GET a parameter using "?" ?

Tony
  • 9,672
  • 3
  • 47
  • 75
justmyfreak
  • 1,260
  • 3
  • 16
  • 30

8 Answers8

73

Take a look at the $_GET and $_REQUEST superglobals. Something like the following would work for your example:

$start = $_GET['start'];
$limit = $_GET['limit'];

EDIT

According to this post in the laravel forums, you need to use Input::get(), e.g.,

$start = Input::get('start');
$limit = Input::get('limit');

See also: http://laravel.com/docs/input#input

adamdunson
  • 2,635
  • 1
  • 23
  • 27
  • 6
    You get way more functionality out of using Input::get, Input::has, Input::all, Input::file etc. The only time I recommend using a super global is when you are uploading an array of files then you do need to use $_FILES. – Michael J. Calkins Feb 27 '13 at 22:31
  • 3
    For anyone reading this in 2016, the right way of using Input in Laravel's >v5.0 is this http://stackoverflow.com/a/34642837/1067293 – Ramon Royo May 17 '16 at 10:42
  • 3
    This is not the Laravel way of getting request parameters – Peter Chaula Dec 20 '18 at 08:26
  • 1
    Specify please the source of `Input` – Akim Kelar Dec 18 '19 at 16:18
  • It looks like instead of `Input` you're supposed to use `$request->input()`: https://laravel.com/docs/8.x/requests#input. The shared link in the answer above 404s for me: http://laravel.com/docs/input#input – th3coop Jul 24 '21 at 18:47
  • 1
    never use php superglobals with laravel because you may change laravel configuration that is using them. – Yasser CHENIK May 24 '22 at 13:29
46

On 5.3-8.0 you reference the query parameter as if it were a member of the Request class.

1. Url

http://example.com/path?page=2

2. In a route callback or controller action using magic method Request::__get()

Route::get('/path', function(Request $request){
 dd($request->page);
}); 

//or in your controller
public function foo(Request $request){
 dd($request->page);
}

//NOTE: If you are wondering where the request instance is coming from, Laravel automatically injects the request instance from the IOC container
//output
"2"

###3. Default values We can also pass in a default value which is returned if a parameter doesn't exist. It's much cleaner than a ternary expression that you'd normally use with the request globals

   //wrong way to do it in Laravel
   $page = isset($_POST['page']) ? $_POST['page'] : 1; 
   
   //do this instead
   $request->get('page', 1);
  
   //returns page 1 if there is no page
   //NOTE: This behaves like $_REQUEST array. It looks in both the
   //request body and the query string
   $request->input('page', 1);

###4. Using request function

$page = request('page', 1);
//returns page 1 if there is no page parameter in the query  string
//it is the equivalent of
$page = 1; 
if(!empty($_GET['page'])
   $page = $_GET['page'];

The default parameter is optional therefore one can omit it

###5. Using Request::query()

While the input method retrieves values from entire request payload (including the query string), the query method will only retrieve values from the query string

//this is the equivalent of retrieving the parameter
//from the $_GET global array
$page = $request->query('page');

//with a default
$page = $request->query('page', 1);
 

###6. Using the Request facade

$page = Request::get('page');

//with a default value
$page = Request::get('page', 1);

You can read more in the official documentation https://laravel.com/docs/5.8/requests

Peter Chaula
  • 3,456
  • 2
  • 28
  • 32
11

We have similar situation right now and as of this answer, I am using laravel 5.6 release.

I will not use your example in the question but mine, because it's related though.

I have route like this:

Route::name('your.name.here')->get('/your/uri', 'YourController@someMethod');

Then in your controller method, make sure you include

use Illuminate\Http\Request;

and this should be above your controller, most likely a default, if generated using php artisan, now to get variable from the url it should look like this:

  public function someMethod(Request $request)
  {
    $foo = $request->input("start");
    $bar = $request->input("limit");

    // some codes here
  }

Regardless of the HTTP verb, the input() method may be used to retrieve user input.

https://laravel.com/docs/5.6/requests#retrieving-input

Hope this help.

Fil
  • 8,225
  • 14
  • 59
  • 85
9

This is the best practice. This way you will get the variables from GET method as well as POST method

    public function index(Request $request) {
            $data=$request->all();
            dd($data);
    }
//OR if you want few of them then
    public function index(Request $request) {
            $data=$request->only('id','name','etc');
            dd($data);
    }
//OR if you want all except few then
    public function index(Request $request) {
            $data=$request->except('__token');
            dd($data);
    }
Ronak Dattani
  • 466
  • 3
  • 9
6

Query params are used like this:

use Illuminate\Http\Request;

class MyController extends BaseController{

    public function index(Request $request){
         $param = $request->query('param');
    }
malhal
  • 26,330
  • 7
  • 115
  • 133
3

In laravel 5.3 $start = Input::get('start'); returns NULL

To solve this

use Illuminate\Support\Facades\Input;

//then inside you controller function  use

$input = Input::all(); // $input will have all your variables,  

$start = $input['start'];
$limit = $input['limit'];
Syed Waqas Bukhary
  • 5,130
  • 5
  • 47
  • 59
0

In laravel 5.3

I want to show the get param in my view

Step 1 : my route

Route::get('my_route/{myvalue}', 'myController@myfunction');

Step 2 : Write a function inside your controller

public function myfunction($myvalue)
{
    return view('get')->with('myvalue', $myvalue);
}

Now you're returning the parameter that you passed to the view

Step 3 : Showing it in my View

Inside my view you i can simply echo it by using

{{ $myvalue }}

So If you have this in your url

http://127.0.0.1/yourproject/refral/this@that.com

Then it will print this@that.com in you view file

hope this helps someone.

The Billionaire Guy
  • 3,382
  • 28
  • 31
0

It is not very nice to use native php resources like $_GET as Laravel gives us easy ways to get the variables. As a matter of standard, whenever possible use the resources of the laravel itself instead of pure PHP.

There is at least two modes to get variables by GET in Laravel ( Laravel 5.x or greater):

Mode 1

Route:

Route::get('computers={id}', 'ComputersController@index');

Request (POSTMAN or client...):

http://localhost/api/computers=500

Controler - You can access the {id} paramter in the Controlller by:

public function index(Request $request, $id){
   return $id;
}

Mode 2

Route:

Route::get('computers', 'ComputersController@index');

Request (POSTMAN or client...):

http://localhost/api/computers?id=500

Controler - You can access the ?id paramter in the Controlller by:

public function index(Request $request){
   return $request->input('id');
}
Fellipe Sanches
  • 7,395
  • 4
  • 32
  • 33