Laravel 路由将变量传递给控制器

Posted

技术标签:

【中文标题】Laravel 路由将变量传递给控制器【英文标题】:Laravel route pass variable to controller 【发布时间】: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 对于这些静态路由,他们没有。 【参考方案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);

【讨论】:

您好,欢迎来到 ***。实际上,您的方式是一种不推荐的方式,尽管它达到了结果。但是,如果您的控制器需要在构造函数中注入一些依赖项,您将无法自动解析它。在这种情况下,App::make() 是你最好的朋友。话虽如此,请考虑使用比“你都错了”更好的方式与人交谈。

以上是关于Laravel 路由将变量传递给控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何有效地将子域名传递给 Laravel 中的控制器和视图

Laravel - 将变量从中间件传递到控制器/路由

在 laravel 刀片路由中使用 JavaScript 变量

如何使用laravel中的控制器将多个变量传递给视图

Laravel 5:在路由中获取 ajax 数据并传递给控制器

将 laravel 变量传递给 jquery 数组