0

Route

Route::get('/site/{site_name_en}/{id}', array( 'as' => 'profile-site', 'uses' => 'ProfileController@site' )); 

Controller

class ProfileController extends BaseController{ public function site($id, $site_name_en){ $site = Site::where('id', '=', $id) ->where('site_name_en', '=', $site_name_en); if($site->count()){ $site = $site->first(); return View::make('profile.site') ->with('site', $site); } return App::abort(404); } } 

What I'm trying to achieve is: that when I visit the following URL www.domain.com/site/abc/123456, it will shown the correct page based on the parameters. Is the where clause correct? (because I couldn't retrieve the value)

1 Answer 1

3

Your route

Route::get('/site/{site_name_en}/{id}', 

says the 1st parameter is site name, the second the id, but your controller function has the arguments swapped. You should call it:

public function site($site_name_en, $id){ // rest of code } 

parameters are automatically passed down in the order they are defined by the route, and are not recognized by the variable name (IIRC).

As for the rest of your function I can't really tell if you're doing right or not, but I can suggest this:

$site = Site::where('id', '=', $id) ->where('site_name_en', '=', $site_name_en) ->first(); if($site){ return View::make('profile.site'); } return App::abort(404); 

Alternatively, you could use firstOrFail(), which throws a ModelNotFoundException if the record is not found that you can catch with App::error() for example (an implementation is outlined in the manual)

Sign up to request clarification or add additional context in comments.

1 Comment

I'm sure the Damien Pirsy answer will solve the problem, but i suggest to add a route constraint, its only for security. laravel.com/docs/routing#route-parameters

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.