You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel的多个Blade视图中展示下拉列表

解决Laravel下拉列表多页面共享的问题

你目前的问题是下拉数据只传给了register.blade.php,login.blade.php拿不到$roll变量导致无法渲染,下面给你三种实用的解决方法:

方法一:视图共享(View Composers,推荐)

这是Laravel官方推荐的多视图共享数据的方案,一次配置后,指定的视图都会自动拿到数据。

  1. 创建视图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);
    }
}
  1. 注册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,可以把获取下拉数据的逻辑抽出来,在需要的控制器方法里调用。

  1. 抽离数据方法
    修改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'));
    }
}
  1. 修改路由
    把登录和注册的路由指向对应的方法:
// 注册页面路由
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 14:43:21