Laravel5.8访问home视图报Undefined variable: post问题
Laravel5.8 home页面报Undefined variable: post问题排查
问题环境与现象
- 框架版本:Laravel Framework 5.8.38
- 异常表现:访问home页面(对应视图路径
C:\installationxampp\htdocs\samplelaravel1\resources\views\Admin\home.blade.php)时抛出Undefined variable: post错误;edit页面可正常读取数据库数据,仅home.blade.php遍历$post变量时提示未定义,尝试多种控制器传参写法均未解决。
原有业务代码
AdminController控制器代码
<?php namespace App\Http\Controllers; use App\Models\Post; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; class AdminController extends Controller { public function index(){ $data=DB::table('post')->get(); return view('admin.home',['post'=>$data]); } public function add(){ return view('admin.add'); } public function addpost(Request $request){ request()->validate([ 'title'=>'required|max:50', 'post'=>'required|max:500' ]); DB::table('post')->insert([ 'title'=>request('title'), 'post'=>request('post') ]); return view('admin.home'); } public function edit(Post $post){ return view('admin.edit',['post'=>$post]); } public function editpost(Request $request, Post $post){ request()->validate([ 'title'=>'required|max:50', 'post'=>'required|max:500' ]); DB::table('post')->update([ 'title'=>request('title'), 'post'=>request('post') ]); return redirect('home'); } public function deletepost(Post $post){ $post->delete(); return redirect('home'); } }
路由配置代码
<?php use App\Http\Controllers\AdminController; use App\Http\Controllers\LoginController; use App\Http\Controllers\LogoutController; use App\Http\Controllers\RegisterController; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', function () { return view('welcome'); }); Route::get('/home',[AdminController::class,'index']); Route::get('/add',[AdminController::class,'add'])->middleware('auth'); Route::post('/addpost',[AdminController::class,'addpost']); Route::get('/edit/{post}',[AdminController::class,'edit']); Route::post('/editpost/{post}',[AdminController::class,'editpost']); Route::get('/delete/{post}',[AdminController::class,'deletepost']); Route::post('/logout',[LogoutController::class,'logout']); Route::get('/login',[LoginController::class,'login'])->name('login'); Route::post('/logindetails',[LoginController::class,'logindetails']); Route::get('/register',[RegisterController::class,'register']); Route::post('/registerdetails',[RegisterController::class,'registerdetails']);
home.blade.php视图代码
<html> <head> </head> <body> @auth <a href="\home"><button>HOME</button></a> <a href="\add"><button>ADD</button><a> <form method="post" action="\logout" style="display:inline-block;"> @csrf <button>LOGOUT</button> </form> <!--here--> @endauth @guest <a href="\login"><button>LOGIN</button></a> <a href="\register"><button>REGISTER</button></a> @endguest @foreach($post as $data) <article> {{$data->title}}<br> {{$data->post}} @auth <a href="\edit\{{$data->id}}">edit</a>| <a href="\delete\{{$data->id}}">delete</a>@endauth </article> @endforeach </body> </html>
已尝试的无效传参写法
// 尝试1 public function index(){ $data=DB::table('post')->get(); return view('admin.home',compact('post')); } // 尝试2 public function index(){ $data=DB::table('post')->get(); return view('admin.home')->with(['posts' => $data]); } // 尝试3 public function index(){ $data['post']=DB::table('post')->get(); return view('admin.home',$data); }
问题根因
- 提交新增文章逻辑(
addpost方法)插入数据后,直接调用return view('admin.home')返回视图,没有向视图传递$post变量,是触发未定义错误的核心原因。 - 测试过的传参写法存在低级错误:
- 尝试1的
compact('post')要求方法内必须定义$post变量,但方法内实际定义的是$data,compact无法获取到对应值 - 尝试2传递的变量名为
$posts(复数),和视图内使用的$post(单数)变量名不匹配,视图无法读取
- 尝试1的
- 现有代码还存在严重逻辑bug:
editpost方法更新文章时没有加where条件,会将post表所有记录更新为提交的内容。
修复方案
- 修正
index方法传参,保证传递的变量名和视图调用一致,示例写法:public function index(){ $post = DB::table('post')->get(); return view('admin.home', compact('post')); } - 修正
addpost方法逻辑,插入数据后重定向到home路由,由index方法统一处理数据传递,和编辑、删除逻辑保持一致:public function addpost(Request $request){ $request->validate([ 'title'=>'required|max:50', 'post'=>'required|max:500' ]); DB::table('post')->insert([ 'title'=>$request->title, 'post'=>$request->post ]); return redirect('home'); } - 修正
editpost方法的更新逻辑,增加where条件指定更新的记录ID,避免全表误更新:public function editpost(Request $request, Post $post){ $request->validate([ 'title'=>'required|max:50', 'post'=>'required|max:500' ]); DB::table('post')->where('id', $post->id)->update([ 'title'=>$request->title, 'post'=>$request->post ]); return redirect('home'); }
内容的提问来源于stack exchange,提问作者dark phoenix
相关产品推荐
相关产品推荐

