Question

I understand that when you do this in Laravel:

Route::get('news/read/{year}/{month}/{date}/{title}/{id}', 'PageController@index_page');

We can use all {var} name as parameters in the controller. But how if I only want to use {id} and {title} instead of all of them in the controller?

This is currently my controller:

public function index_page($year=null, $month=date, $date=null, $title=null, $id=null) {

    $plugin_files = $this->addJqueryPlugin(array('unslider'));

    $data['css_files'] = $this->addCSS(array('styles'));
    $data['js_files'] = $this->addJS(array('main'), false);

    $data['css_plugin'] = $plugin_files['css_files'];
    $data['js_plugin'] = $plugin_files['js_files'];

    if (is_null($id)) {
        $data['title'] = 'Homepage';
        $this->layout->content = View::make('page.home', $data);
    }
    else {
        $data['isModal'] = true;
        $data['title'] = ucwords(str_replace("-", " ", $title . '--' . $id));
        $this->layout->content = View::make('page.home', $data);
    }
}

I tried putting only $title and $id but it reads from {year} and {month} instead. Only solution I can think of is change the order of the route to news/read/{title}/{id}/{year}/{month}/{date}, but I'm trying to keep the format like the previous one, is it possible?

Was it helpful?

Solution

Firstly, this seems wrong

public function index_page($year=null, $month=date, $date=null, $title=null, $id=null)

Remember that the order of default parameters must be as last parameters of function - check PHP Manual example here for details. I assume you misspelled $month=date for $month='some_default_date_value' ?

Second, answering your questions, you've got at least 2 options here:

A. routing to different methods for different parameter count or order

//Routes
//different routes for different params
Route::get('news/read/{year}/{month}/{date}/{title}/{id}', 'PageController@indexFull'); 
Route::get('news/read-id/{id}/{title}', 'PageController@indexByIdAndTitle');
Route::get('news/read-some-more/{month}/{date}/{id}/{title}/{year}', 'PageController@indexByWeirdParamsOrder'); 


//Controller
//different methods for different routes
public function indexByIdAndTitle($id, $title){ return $this->indexFull($id,$title); } 
public function indexFull($id, $title, $year=null, $month=null, $date=null) { ... }
public function indexByWeirdParamsOrder($month, $date, $id, $title, $year) { ... }

B. changing the parameters order in route and using optional param / default value

//Routes 
Route::get('news/read/{id}/{title}/{year?}/{month?}/{date?}', 'PageController@indexFull'); 

//Controller
public function indexFull($id, $title, $year=null, $month=null, $date=null) { ... }

Last but not least, check the Laravel docs for routing and parameters.

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