在Laravel 4中将2个参数从路由传递给控制器

在Laravel 4中将2个参数从路由传递给控制器

问题描述:

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)

路线 strong> p>

 路线:  :get('/ site / {site_name_en} / {id}',array(
'as'=>'profile-site',
'使用'=>'ProfileController @ site'
));  
  code>  pre> 
 
 

控制器 strong> p>

 类ProfileController扩展BaseController {
 
公共函数 site($ id,$ site_name_en){
 $ site = Site :: where('id','=',$ id)
  - > where('site_name_en','=',$ site_name_en); \  n 
 if($ site-> count()){
 $ site = $ site-> first(); 
返回View :: make('profile.site')
  - > with(  'site',$ site); 
} 
返回App :: abort(404); 
} 
} 
  code>  pre> 
 
 

我正在尝试 实现的是:当我访问以下URL www.domain.com/site/abc/123456 code>时,它将根据参数显示正确的页面。 where code>子句是否正确? (因为我无法检索该值) p> div>

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)