【问题标题】:Laravel route pass variable to controllerLaravel 路由将变量传递给控制器
【发布时间】:2015-01-06 19:07:56
【问题描述】:

如何将硬编码变量传递给控制器​​?

我的路线是:

Route::group(array('prefix' => $locale), function() {
    Route::get('/milk', array('as' => 'milk', 'uses' => 'ProductsController@index'));
});

我想做这样的事情:

Route::get('/milk', array('as' => 'milk', 'uses' => 'ProductsController@index(1)'));

但这不起作用。

如何做到这一点?


对不起,如果我没有解释清楚。

我希望简单地硬编码(由我设置)某些路线的 type_id,如下所示:

Route::get('/milk', array('as' => 'milk', 'uses' => 'ProductsController@index(1)'));
Route::get('/cheese', array('as' => 'cheese', 'uses' => 'ProductsController@index(2)'));
...

我的 ProductsController 供参考:

class ProductsController extends BaseController {

    public function index($type_id) {
        $Products = new Products;
        $products = $Products->where('type_id', $type_id)->get();
        return View::make('products.products', array('products' => $products));
    }

}

【问题讨论】:

  • 价值从何而来?如果它始终相同,您可以将其作为私有属性添加到您的控制器中。
  • @Jerodev 它被硬编码到路由中。例如牛奶是 1,橙汁是 2,bicuits 是 3 等等。这样我就可以拥有 SEO 友好的名称,否则会很容易,即 Route::get('/product/{id}.....
  • 这些值是否来自数据库?如果是这样,您在控制器中找不到产品的 id 吗?
  • @Jerodev 对于这些静态路由,他们没有。

标签: php laravel laravel-4 laravel-routing


【解决方案1】:

您可以为路由使用闭包,然后调用控制器操作:

Route::get('/milk', array('as' => 'milk', function(){
    return App::make('ProductsController')->index(1);
}));

但是,更好的方法是使用 where 条件,然后在控制器中进行类型到 ID 的转换。但是,您将丢失直接别名,并且在生成 URL 时必须将产品作为参数传递。

Route::get('{product}', array('as' => 'product', 'uses' => 'ProductsController@index'))
    ->where('product', '(milk|cheese)');

【讨论】:

    【解决方案2】:

    我已经使用它来将值传递给控制器​​...

    路线:

    Route::get('user/{user}/usermanage',  array('as' => 'userdata.usermanage',       'uses' => 'yourController@getUserDetails'));
    //{user} - holds some value...
    

    在控制器中:

    public function getUserDetails($id)
    {
        ...
    }
    

    如果想要动态:

    $var    =   "Lists"; 
    
    Route::get('something',        array('as' => 'something',      'uses' => 'yourController@get'.$var));
    

    希望这会有所帮助...

    【讨论】:

    • 也适用于 Lumen。不错!
    【解决方案3】:

    我觉得最整洁的方法可能是使用route constraints

    Route::get('{milk}', [ 'as' => 'milk', 'uses' => 'ProductsController@index' ])
         ->where('milk', 'milk'); // matches the named arg {milk} (param 1)
                                  // to the regex literal 'milk' (param 2)
    

    它有一些冗余,但如果你想纯粹从你的路线上做,我会选择这个。

    不过,为了使 SEO 友好的名称,您可以使用 Sluggable 为每个产品生成一个唯一的 slug,然后创建以下路由:

    Route::get('{product}', [ 'as' => 'product', 'before' => 'product-slug', 'uses' => 'ProductsController@index' ])
         ->where('product', '[a-z0-9]+[a-z0-9\-]*'); // valid slug syntax
    

    还有这个过滤器:

    Route::filter('product-slug', function($route) {
        $slug = $route->getParameter( 'slug' );
        if (is_numeric($slug)) { // if the slug is an ID
            $product = Product::findOrFail($slug); // try to find the product
            return Redirect::route('product', $product->slug); // and redirect to it
        }
    });
    

    【讨论】:

      【解决方案4】:

      在不弄乱网址的情况下,您实际上是这样做的:

      定义路线:

      Route::match(['GET', 'POST'], 'my-url', ['var_1'=>'hello', 'var_2'=>'world', 'prefix'=>'my-prefix', 'middleware'=>['web', 'mid2', 'mid3'], 'as'=>"my-route-name", 'uses'=>'myController@index']);
      

      现在在控制器中,在function __construct(Request $request)

      $req_action = @$request->route()->getAction();
      
      $var_1 = $var_2 = '';
      if(is_array($req_action) && !empty($req_action['var_1'])){
      $var_1 = (int)@$req_action['var_1'];
      }
      
      if(is_array($req_action) && !empty($req_action['var_2'])){
      $var_2 = @$req_action['var_2'];
      }
      

      【讨论】:

        【解决方案5】:

        对不起,你错了……

        Route::GET('/url-name', function(Request $request){
        
            // Pass in custom SEO DATA
            $seo = [
                'title' => 'Hello world',
                'description' => 'some Description'
        
            ];
        
             $c = new \App\Http\Controllers\MyController();
             return $c->index($request, $seo);
        });
        

        在控制器中......

        public function index(Request $request, $seo = null)
            {
        
                dd($seo);
        }
        

        【讨论】:

        • 您好,欢迎来到 Stackoverflow。实际上,您的方式是一种不推荐的方式,尽管它达到了结果。但是,如果您的控制器需要在构造函数中注入一些依赖项,您将无法自动解析它。在这种情况下,App::make() 是你最好的朋友。话虽如此,请考虑使用比“你都错了”更好的方式与人交谈。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-09
        • 2015-04-01
        • 2016-05-16
        • 2017-01-12
        • 2015-11-20
        • 2016-03-03
        • 2015-03-16
        相关资源
        最近更新 更多