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

未定义常量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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:51:07