简体   繁体   中英

pass 2 parameters from route to controller in Laravel 4

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)

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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM