如何在Laravel 6中按区域设置切换视图而非逐短语翻译?
在Laravel 6中按区域设置加载不同视图的方案
嘿,好消息!Laravel 6本身就内置了支持按区域设置加载不同视图的机制,完全不用额外装工具包就能满足你的需求,而且实现起来简洁可靠。下面一步步给你讲清楚:
一、原生视图本地化的实现方式
Laravel的视图加载器会自动优先查找对应区域设置的视图文件,你只需要按照特定的目录结构来组织视图就行:
1. 视图目录结构
把不同区域的视图放在resources/views下的对应语言子目录里,比如:
resources/ └── views/ ├── en/ │ ├── welcome.blade.php │ └── dashboard/ │ └── index.blade.php ├── zh/ │ ├── welcome.blade.php │ └── dashboard/ │ └── index.blade.php └── welcome.blade.php <!-- 兜底视图,如果找不到对应区域的就用这个 -->
这样当你的应用当前区域设置为zh时,调用view('welcome')会自动加载resources/views/zh/welcome.blade.php;如果是en就加载en目录下的,要是某个区域没有对应的视图文件,就会回退到根目录的默认视图。
2. 设置当前区域
在控制器或者中间件里设置当前的区域设置,比如:
// 在控制器方法里设置 public function index() { app()->setLocale('zh'); // 也可以从请求参数/用户配置/会话里获取区域值 return view('welcome'); }
更优雅的方式是用中间件来统一处理区域设置,比如创建一个SetLocale中间件:
<?php namespace App\Http\Middleware; use Closure; class SetLocale { public function handle($request, Closure $next) { // 可以从URL参数、请求头、用户会话/配置里获取区域值 $locale = $request->get('locale', 'en'); // 验证是否是允许的区域,避免恶意输入 if (in_array($locale, ['en', 'zh', 'ja'])) { app()->setLocale($locale); } return $next($request); } }
然后把这个中间件注册到app/Http/Kernel.php的web中间件组里,这样每次请求都会自动设置对应的区域。
二、自定义视图加载逻辑(针对特殊场景)
如果原生的目录结构满足不了你的需求(比如视图放在其他路径),可以用以下两种方式扩展:
1. 使用视图命名空间
在AppServiceProvider的boot方法里注册不同区域的视图命名空间:
public function boot() { $this->loadViewsFrom(resource_path('views/en'), 'en'); $this->loadViewsFrom(resource_path('views/zh'), 'zh'); }
然后在控制器里根据区域调用对应的命名空间视图:
public function index() { $locale = app()->getLocale(); return view("{$locale}::welcome"); }
2. 自定义视图查找逻辑
如果需要更复杂的视图匹配规则,你可以扩展Laravel的视图加载器,但一般原生方式和命名空间就足够覆盖大部分场景了,除非有特殊业务需求。
三、实用小技巧
- 做一个区域白名单验证,避免加载不存在的视图目录,防止报错
- 把公共组件(比如导航栏、页脚)放在根视图目录,在不同区域的视图里用
@include引用,减少重复代码 - 可以结合Laravel的
session保存用户选择的区域,下次访问自动加载对应视图
内容的提问来源于stack exchange,提问作者Luca C.
相关产品推荐
相关产品推荐

