Laravel教程:在Blade视图与控制器中使用语言文件短变量名
如何在Laravel的Blade视图与控制器中使用语言文件的短变量名?
嘿,我来给你分享几个实用的方法,帮你摆脱冗长的语言键名调用,用更短的方式引用语言文件内容:
方法一:通过视图共享(View Composers)注入变量
这个方法适合把特定语言文件的所有内容一次性注入到视图里,直接用变量名调用就行:
创建视图Composer类
在app/View/Composers目录下新建LoginLangComposer.php(如果没有View/Composers目录就手动创建):namespace App\View\Composers; use Illuminate\View\View; use Illuminate\Support\Facades\Lang; class LoginLangComposer { public function compose(View $view) { // 加载account/login语言文件的所有键值对 $loginLang = Lang::get('account/login'); // 把每个语言键单独绑定为视图变量,比如$text_login、$error_login foreach ($loginLang as $key => $value) { $view->with($key, $value); } } }注册视图Composer
打开app/Providers/AppServiceProvider.php,在boot方法里注册刚才的Composer:use App\View\Composers\LoginLangComposer; use Illuminate\Support\Facades\View; public function boot() { // 只绑定到welcome视图 View::composer('welcome', LoginLangComposer::class); // 如果要让所有视图都能用,改成下面这行 // View::composer('*', LoginLangComposer::class); }在Blade里直接调用变量
现在你可以在welcome.blade.php里直接用短变量名了:<a href="{{ route('login') }}">{{ $text_login }}</a> <a href="{{ route('register') }}">{{ $text_register }}</a> @if($errors->has('login')) <p class="text-red-500">{{ $error_login }}</p> @endif
方法二:自定义辅助函数,预设语言前缀
如果想在控制器和视图里都用短调用,自定义辅助函数是个不错的选择:
创建辅助函数文件
在app/Helpers目录下新建LangHelper.php:if (!function_exists('__login')) { /** * 快速调用account/login语言文件的内容 */ function __login($key, $replace = [], $locale = null) { // 自动拼接account/login前缀 return __("account/login.$key", $replace, $locale); } }让Laravel自动加载这个文件
打开项目根目录的composer.json,在autoload的files数组里添加这个文件路径:"autoload": { "files": [ "app/Helpers/LangHelper.php" ], // 保留原来的autoload内容... }更新自动加载
在终端运行以下命令,让Composer更新自动加载规则:composer dump-autoload在视图和控制器里使用
Blade视图里:<a href="{{ route('login') }}">{{ __login('text_login') }}</a>控制器里:
return back()->withErrors(['login' => __login('error_login')]);
方法三:将常用语言项移到根语言文件(适合全局通用文本)
如果这些文本是全局常用的,你可以把它们移到根目录的语言文件里,比如resources/lang/en/messages.php:
// resources/lang/en/messages.php return [ 'text_login' => 'Login', 'text_register' => 'Register', 'error_login' => 'These credentials do not match our records.', ];
然后直接用__('text_login')调用就行,不过这个方法更适合全局通用的文本,如果只是登录模块专用,前两种方法更灵活。
内容的提问来源于stack exchange,提问作者ronrun
相关产品推荐
相关产品推荐

