如何在Laravel的多个Blade视图中展示下拉列表
解决Laravel下拉列表多页面共享的问题
你目前的问题是下拉数据只传给了register.blade.php,login.blade.php拿不到$roll变量导致无法渲染,下面给你三种实用的解决方法:
方法一:视图共享(View Composers,推荐)
这是Laravel官方推荐的多视图共享数据的方案,一次配置后,指定的视图都会自动拿到数据。
- 创建视图Composer类
在app/View/Composers目录下新建RollDropdownComposer.php(目录不存在就手动创建):
<?php namespace App\View\Composers; use App\Models\Roll; // 注意模型类名要大写开头,对应数据库表建议用复数rolls use Illuminate\View\View; class RollDropdownComposer { public function compose(View $view) { // 只获取需要的字段,提升性能 $rolls = Roll::select('roll_id', 'roll')->get(); // 把数据传给视图,变量名$roll $view->with('roll', $rolls); } }
- 注册Composer
打开app/Providers/AppServiceProvider.php,在boot方法里添加以下代码:
public function boot() { // 指定给auth目录下的login和register视图共享数据 view()->composer( ['auth.login', 'auth.register'], \App\View\Composers\RollDropdownComposer::class ); }
配置完成后,不管是登录还是注册页面,都会自动拿到$roll变量,你原来的DropDownController和对应路由如果只是用来传这个数据,就可以删掉了。
方法二:抽离数据逻辑,在控制器中复用
如果不想用视图Composer,可以把获取下拉数据的逻辑抽出来,在需要的控制器方法里调用。
- 抽离数据方法
修改DropDownController,新增一个静态方法用来获取下拉数据:
class DropDownController extends Controller { // 抽离公共方法,供其他控制器调用 public static function getRollDropdown() { return \App\Models\Roll::select('roll_id', 'roll')->get(); } // 注册页面方法 public function showRegisterForm() { $roll = self::getRollDropdown(); return view('auth.register', compact('roll')); } // 登录页面方法 public function showLoginForm() { $roll = self::getRollDropdown(); return view('auth.login', compact('roll')); } }
- 修改路由
把登录和注册的路由指向对应的方法:
// 注册页面路由 Route::get('register', [DropDownController::class, 'showRegisterForm']); // 登录页面路由 Route::get('login', [DropDownController::class, 'showLoginForm']);
如果你用的是Laravel默认的
Auth::routes()生成的路由,需要重写Auth控制器的方法:
在app/Http/Controllers/Auth/LoginController.php里添加:use App\Http\Controllers\DropDownController; public function showLoginForm() { $roll = DropDownController::getRollDropdown(); return view('auth.login', compact('roll')); }同样在
RegisterController.php里重写showRegistrationForm方法即可。
方法三:直接在视图中查询(不推荐)
这种方式虽然简单,但违背了MVC分层逻辑,视图里不该写业务代码,仅适合临时测试:
<div class="form-group"> <label>Users</label> <select name="roll"> <option value="" selected disabled>Select Users</option> @foreach(\App\Models\Roll::select('roll_id', 'roll')->get() as $row) <option value="{{$row->roll_id}}">{{$row->roll}}</option> @endforeach </select> <span class="text-danger"> @error('roll') {{ $message }} @enderror </span> </div>
注意事项
你的模型类名应该是大写开头的Roll,而不是小写的roll,Laravel模型遵循驼峰命名规范,否则会出现类找不到的错误。
内容的提问来源于stack exchange,提问作者Muhammad Tufail
相关产品推荐
相关产品推荐

