未定义常量post报错及Laravel分类菜单加载对应文章问题
解决两个问题:未定义常量报错 + 分类文章切换功能
一、先搞定 Use of undefined constant post - assumed 'post' 报错
这个错误其实很直白——你在代码里直接写了 post 却没加引号,PHP 把它当成未定义的常量解析了,而不是你想表达的字符串"post"。你得排查这几个地方:
- 控制器里有没有类似
return view(post);或者$query->where('type', post);的写法,要改成return view('post');或者$query->where('type', 'post'); - 视图文件里如果有
{{ post }}或者{{ $data[post] }},换成{{ 'post' }}或者{{ $data['post'] }} - 路由里要是出现
Route::get('/post', [PostController::class, post]);,改成Route::get('/post', [PostController::class, 'post']);
总结一句:所有要表示字符串"post"的地方,必须套上单引号或双引号,别让PHP误会成常量。
二、实现分类菜单切换文章功能
我分前端交互和后端接口两部分给你写具体实现(以Laravel框架为例):
1. 前端代码调整(视图文件)
先修正菜单的小笔误(ative应该是active),然后给分类链接加点击事件,用AJAX请求后端数据更新页面:
<!-- 分类菜单 --> <ul> @foreach($categories->get() as $category) <li class="{{ $loop->first ? 'active' : '' }}"> <!-- 默认第一个分类高亮,可按需调整 --> <a href="javascript:void(0)" class="category-link" data-category-id="{{ $category->id }}"> {{ $category->name }} </a> </li> @endforeach </ul> <!-- 文章展示区域 --> <div id="posts"> <!-- 初始加载最新文章,直接渲染即可 --> @foreach($latestPosts as $post) <div class="post-item"> <h3>{{ $post->title }}</h3> <p>{{ Str::limit($post->content, 100) }}</p> </div> @endforeach </div> <script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script> <script> $(document).ready(function() { // 点击分类链接触发逻辑 $('.category-link').click(function() { // 切换菜单高亮状态 $('.category-link').parent().removeClass('active'); $(this).parent().addClass('active'); // 获取当前分类ID let categoryId = $(this).data('category-id'); // 发送AJAX请求拿文章数据 $.ajax({ url: '/get-category-posts', // 后端接口地址 method: 'GET', data: { category_id: categoryId }, success: function(response) { // 更新文章展示区域内容 $('#posts').html(response); }, error: function() { alert('加载文章失败,请稍后重试'); } }); }); }); </script>
2. 后端代码实现
第一步:添加路由
在routes/web.php里加两个路由:一个负责加载初始页面,一个处理分类文章请求:
// 首页:加载分类列表和最新文章 Route::get('/', [PostController::class, 'index']); // 根据分类ID获取对应文章 Route::get('/get-category-posts', [PostController::class, 'getCategoryPosts']);
第二步:控制器方法编写
在app/Http/Controllers/PostController.php里实现对应逻辑:
use App\Models\Category; use App\Models\Post; class PostController extends Controller { // 初始页面加载逻辑 public function index() { $categories = Category::all(); $latestPosts = Post::orderBy('created_at', 'desc')->take(10)->get(); // 取最新10篇文章 return view('index', compact('categories', 'latestPosts')); } // 根据分类ID返回文章列表 public function getCategoryPosts() { $categoryId = request()->get('category_id'); // 查询该分类下的文章,按创建时间倒序排列 $posts = Post::where('category_id', $categoryId) ->orderBy('created_at', 'desc') ->get(); // 返回文章的HTML片段 return view('partials.posts', compact('posts')); } }
第三步:创建文章片段视图
新建resources/views/partials/posts.blade.php,专门渲染文章列表的HTML:
@foreach($posts as $post) <div class="post-item"> <h3>{{ $post->title }}</h3> <p>{{ Str::limit($post->content, 100) }}</p> </div> @endforeach @if($posts->isEmpty()) <p>该分类下暂无文章</p> @endif
这样一来,页面初始加载会显示最新文章,点击分类菜单后,会通过AJAX请求后端接口,把对应分类的文章更新到#posts区域,同时切换菜单的高亮状态,完全符合你的需求。
内容的提问来源于stack exchange,提问作者johnW
相关产品推荐
相关产品推荐

