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 刀片路由中使用 JavaScript 变量