在Laravel中间件中设置全局变量与文本方向
解决Laravel中全局设置文本方向(RTL/LTR)的问题
嘿,既然你已经有了处理语言设置的中间件,那直接在这个中间件里扩展功能就行,完全不用在每个控制器里重复操作,给你两种实用的方案:
方案一:使用视图共享(View::share)
这是最直接的方式,在你的语言中间件里,设置完locale后,判断当前语言是否属于RTL方向,然后把这个状态共享给所有Blade视图:
public function handle($request, Closure $next) { $langSetting = SystemSetting::find('System Language'); $locale = $langSetting->value; \App::setLocale($locale); // 定义需要RTL的语言列表,根据你的需求添加更多语言代码 $rtlLanguages = ['ar', 'fa', 'he', 'ur']; $isRtl = in_array($locale, $rtlLanguages); // 把RTL状态共享给所有视图,这样所有Blade都能直接用$RTL变量 \Illuminate\Support\Facades\View::share('RTL', $isRtl); return $next($request); }
这样你原来的Blade代码完全不用改,直接就能用$RTL变量判断加载对应的CSS文件。
方案二:存入应用配置(config)
如果你不仅需要在视图里用,还可能在控制器、模型等其他地方用到RTL状态,推荐把它存入应用配置:
public function handle($request, Closure $next) { $langSetting = SystemSetting::find('System Language'); $locale = $langSetting->value; \App::setLocale($locale); $rtlLanguages = ['ar', 'fa', 'he', 'ur']; $isRtl = in_array($locale, $rtlLanguages); // 把RTL状态存入临时配置,全局可访问 config(['app.rtl' => $isRtl]); return $next($request); }
对应的Blade代码可以改成这样:
@if (config('app.rtl')) {{ Html::style('css/rtl/app-rtl.css') }} @else {{ Html::style('css/app.css') }} @endif
最后要注意的点
确保你的这个中间件已经添加到app/Http/Kernel.php的$middlewareGroups['web']数组里,这样每次Web请求都会执行这个中间件,全局生效。
内容的提问来源于stack exchange,提问作者Patriot
相关产品推荐
相关产品推荐

