Laravel 5.6路由中调用控制器前设置Locale的问题排查
解决Laravel路由中先设置Locale再调用控制器方法的问题
你之前的两种写法之所以无效,是因为对Laravel路由回调的返回值逻辑理解有误:
- 第一种写法里,
return action('controller@method')本质是生成控制器方法对应的URL字符串并返回,框架会直接把这个字符串输出给浏览器,而不会实际调用控制器的方法。 - 第二种写法返回
['uses' => 'controller@method']的数组,这是定义路由时的语法(比如Route::get('/path', ['uses' => 'controller@method'])),但在路由回调函数里返回这个数组,框架并不会识别并执行对应的控制器方法。
下面给你两种靠谱的解决方案,优先推荐第一种,更符合Laravel的设计规范:
方案一:使用路由中间件(推荐,可复用)
中间件是Laravel里专门用来处理请求前后逻辑的机制,非常适合这种“在控制器执行前统一处理Locale”的场景:
- 生成Locale中间件:在终端执行命令创建中间件文件
php artisan make:middleware SetLocale
- 编写中间件逻辑:打开
app/Http/Middleware/SetLocale.php,在handle方法里添加设置Locale的代码:
<?php namespace App\Http\Middleware; use Closure; class SetLocale { public function handle($request, Closure $next) { // 这里替换成你设置Locale的逻辑,比如从请求参数、会话读取等 desired_function(); return $next($request); // 继续执行后续的控制器逻辑 } }
- 注册中间件:打开
app/Http/Kernel.php,在$routeMiddleware数组里添加这个中间件的注册:
protected $routeMiddleware = [ // ... 其他已有的中间件 'setlocale' => \App\Http\Middleware\SetLocale::class, ];
- 在路由中使用中间件:给目标路由加上这个中间件,这样请求进来时会先执行中间件的Locale设置,再调用控制器方法:
Route::get('/path', 'YourController@method')->middleware('setlocale');
方案二:在路由回调中直接调用控制器方法
如果只是临时场景,不想用中间件,也可以手动在回调里实例化控制器并调用方法:
Route::get('/path', function(){ desired_function(); // 先设置Locale // 实例化控制器并调用方法,注意替换成你控制器的完整命名空间 $controller = app()->make(\App\Http\Controllers\YourController::class); return $controller->method(); // 调用控制器的对应方法 });
或者更简洁的写法:
Route::get('/path', function(){ desired_function(); return app(\App\Http\Controllers\YourController::class)->method(); });
注意:控制器类名一定要写完整的命名空间(比如\App\Http\Controllers\YourController),不然框架可能找不到对应的类哦。
内容的提问来源于stack exchange,提问作者Patriot
相关产品推荐
相关产品推荐

