0

0

Laravel 管理后台集成:内容管理最佳实践

霞舞

霞舞

发布时间:2025-10-18 09:02:01

|

992人浏览过

|

来源于php中文网

原创

laravel 管理后台集成:内容管理最佳实践

本文档旨在指导开发者如何在 Laravel 框架下构建一个内容管理系统(CMS),并解决在前端页面展示管理后台数据时遇到的“Undefined variable”错误。我们将以博文管理和关于我们信息管理为例,详细讲解后台数据录入、编辑、展示的完整流程,并提供关键代码示例和注意事项,帮助开发者快速搭建可维护、易扩展的内容管理系统。

问题分析与解决方案

出现 Undefined variable: aboutresult 错误的原因是在 user.english.index 视图中使用了 $aboutresult 变量,但在对应的控制器方法 EngHafizController@home 中,只将 $result 变量传递给了视图。

正确的做法是将 $aboutresult 和 $result 两个变量都传递给 user.english.index 视图。修改后的 EngHafizController@home 方法如下:

get();
        $data['result'] = DB::table('posts')->get();
        return view('user.english.index', $data);
    }

    // ... 其他方法
}

解释:

  • $data['aboutresult'] = DB::table('abouts')->get();:从 abouts 表中获取所有数据,并将其赋值给 $data 数组中的 aboutresult 键。
  • $data['result'] = DB::table('posts')->get();:从 posts 表中获取所有数据,并将其赋值给 $data 数组中的 result 键。
  • return view('user.english.index', $data);:将包含 aboutresult 和 result 键的 $data 数组传递给 user.english.index 视图。

内容管理系统构建步骤

以下将更详细地介绍如何构建一个完整的内容管理系统,包括后台管理和前台展示两部分。

1. 数据库设计

首先,需要设计数据库表结构。根据需求,我们创建了 posts 表用于存储博文信息,abouts 表用于存储“关于我们”信息。

posts 表结构:

字段名 数据类型 说明
id INT 主键,自增
title VARCHAR(255) 标题 1
description TEXT 描述 1
title2 VARCHAR(255) 标题 2
description2 TEXT 描述 2
image VARCHAR(255) 图片 1 文件名
image2 VARCHAR(255) 图片 2 文件名
created_at TIMESTAMP 创建时间
updated_at TIMESTAMP 更新时间

abouts 表结构:

字段名 数据类型 说明
id INT 主键,自增
title3 VARCHAR(255) 标题
heading3 VARCHAR(255) 标题
description3 TEXT 描述
image3 VARCHAR(255) 图片文件名
created_at TIMESTAMP 创建时间
updated_at TIMESTAMP 更新时间

可以使用 Laravel 的 Migration 来创建这些表:

php artisan make:migration create_posts_table
php artisan make:migration create_abouts_table

然后在对应的 Migration 文件中定义表结构。

2. 后台管理功能实现

后台管理功能主要包括数据的增删改查(CRUD)操作。

2.1 模型创建

首先,创建对应的 Eloquent 模型:

php artisan make:model Post
php artisan make:model About

2.2 控制器实现

创建控制器 PostController 和 AboutController 来处理后台请求。

I-Shop购物系统
I-Shop购物系统

部分功能简介:商品收藏夹功能热门商品最新商品分级价格功能自选风格打印结算页面内部短信箱商品评论增加上一商品,下一商品功能增强商家提示功能友情链接用户在线统计用户来访统计用户来访信息用户积分功能广告设置用户组分类邮件系统后台实现更新用户数据系统图片设置模板管理CSS风格管理申诉内容过滤功能用户注册过滤特征字符IP库管理及来访限制及管理压缩,恢复,备份数据库功能上传文件管理商品类别管理商品添加/修改/

下载

PostController:

orderBy('id','desc')->get();
        return view('admin.post.list',$data);
    }
    function submit(Request $req)
    {
      //validation
      $req->validate([
        'title'        => 'required',
        'description'  => 'required',
        'title2'        => 'required',
        'description2'  => 'required',
        'image'        =>  'mimes: jpg,jpeg,png',
        'image2'        => 'mimes: jpg,jpeg,png'
      ]);

      //storing image
      $image=$req->file('image');
      $ext = $image->extension();
      $file=time().'.'.$ext;
      $image->storeAs('public/post',$file);

      $image2=$req->file('image2');
      $ext2 = $image2->extension();
      $file2=time().'.'.$ext2;
      $image2->storeAs('public/post/secondbanner',$file2);


      //array
      $data = array(
        'title'        => $req->input('title'),
        'description'  => $req->input('description'),
        'title2'        => $req->input('title2'),
        'description2'  => $req->input('description2'),
        'image'        => $file,
        'image2'        => $file2,


      );
      //inserting data
      DB::table('posts')->insert($data);
      $req->session()->flash('msg','Data has been Added'); 
      return redirect('/admin/post/list');
    }
    function delete(Request $req , $id)
    {
      DB::table('posts')->where('id',$id)->delete();
      $req->session()->flash('msgForDelete','Data has been Deleted'); 
      return redirect('/admin/post/list');
    }
    function edit(Request $req , $id)
    {
      $data['result'] = DB::table('posts')->where('id',$id)->get();
        return view('admin.post.edit',$data);
    }
    function update(Request $req , $id)
    {
      //validation
      $req->validate([
        'title'        => 'required',
        'description'  => 'required',
        'title2'        => 'required',
        'description2'  => 'required',
        'image'        => 'mimes: jpg,jpeg,png',
        'image2'        => 'mimes: jpg,jpeg,png'
      ]);
      //array
      $data = array(
        'title'        => $req->input('title'),
        'description'  => $req->input('description'),
        'title2'        => $req->input('title2'),
        'description2'  => $req->input('description2'),
      );

      if($req->hasfile('image'))
      {
        $image=$req->file('image');
        $ext = $image->extension();
        $file=time().'.'.$ext;
        $file2=time().'.'.$ext;
        $image->storeAs('public/post/',$file,$file2);
        $data['image']=$file;
      }

      if($req->hasfile('image2'))
      {
        $image2=$req->file('image2');
        $ext = $image2->extension();
        $file2=time().'.'.$ext;
        $image2->storeAs('public/post/secondbanner',$file2);
        $data['image2']=$file2;
      }

      //updating data
      DB::table('posts')->where('id',$id)->update($data);
      $req->session()->flash('msg','Data has been Updated'); 
      return redirect('/admin/post/list');
    }
}

AboutController:

orderBy('id','desc')->get();
        return view('admin.post.about.aboutlist',$data);
    }
    function about_submit(Request $request)
    {
      //validation
      $request->validate([
        'title3'        => 'required',
        'heading3'      => 'required',  
        'description3'  => 'required',
        'image3'        => 'mimes: jpg,jpeg,png'
      ]);

      //storing image
      $image3=$request->file('image3');
      $ext = $image3->extension();
      $file=time().'.'.$ext;
      $image3->storeAs('public/post/about_image',$file);
      //array
      $data = array(
        'title3'        => $request->input('title3'),
        'heading3'        => $request->input('heading3'),
        'description3'  => $request->input('description3'),
        'image3'        => $file,
      );

      //inserting data
      DB::table('abouts')->insert($data);
      $request->session()->flash('msg','Data has been Added'); 
      return redirect('/admin/post/about/aboutlist');
    }
    function about_delete(Request $request , $id)
    {
      DB::table('abouts')->where('id',$id)->delete();
      $request->session()->flash('msgForDelete','Data has been Deleted'); 
      return redirect('/admin/post/list');
    }
    function about_edit(Request $request , $id)
    {
      $data['aboutresult'] = DB::table('abouts')->where('id',$id)->get();
        return view('admin.post.about.aboutedit',$data);

    }
    function about_update(Request $request , $id)
    {
      //validation
      $request->validate([
        'title3'        => 'required',
        'heading3'      => 'required',  
        'description3'  => 'required',
        'image3'        => 'mimes: jpg,jpeg,png'
      ]);
      //array
      $data = array(
        'title3'        => $request->input('title3'),
        'heading3'        => $request->input('heading3'),
        'description3'  => $request->input('description3'),
      );

      if($request->hasfile('image3'))
      {
        $image3=$request->file('image3');
        $ext = $image3->extension();
        $file=time().'.'.$ext;
        $image3->storeAs('public/post/about_image',$file);


        $data['image3']=$file;
      }
      //updating data
      DB::table('abouts')->where('id',$id)->update($data);
      $request->session()->flash('msg','Data has been Updated'); 
      return redirect('/admin/post/about/aboutlist');
    }
}

2.3 视图创建

创建对应的 Blade 视图文件,用于展示数据和提供表单。例如:

  • admin/post/list.blade.php:博文列表
  • admin/post/add.blade.php:添加博文
  • admin/post/edit.blade.php:编辑博文
  • admin/post/about/aboutlist.blade.php:关于我们列表
  • admin/post/about/aboutadd.blade.php:添加关于我们信息
  • admin/post/about/aboutedit.blade.php:编辑关于我们信息

示例:admin/post/list.blade.php

@extends('admin.layouts.app')
@section('main-content')

English Home Section

{{session('msg')}}
{{session('msgForDelete')}}
@foreach ($result as $list) @endforeach
ID Title 1 Description 1 Title 2 Description 2 Image 1 Image 2 Action
{{$list->id}} {{$list->title}} {{$list->description}} {{$list->title2}} {{$list->description2}} @@##@@image) }}" width="150px"/> @@##@@image2) }}" width="150px"/> Edit Delete
ID Title 1 Description 1 Title 2 Description 2 Image 1 Image 2 Action
@endsection

2.4 路由配置

在 routes/web.php 文件中配置后台路由:

Route::group(['prefix' => 'admin/post'], function () {
    Route::get('list', [App\Http\Controllers\admin\Post::class, 'listing']);
    Route::get('add', function () {
        return view('admin.post.add');
    });
    Route::post('submit', [App\Http\Controllers\admin\Post::class, 'submit']);
    Route::get('delete/{id}', [App\Http\Controllers\admin\Post::class, 'delete']);
    Route::get('edit/{id}', [App\Http\Controllers\admin\Post::class, 'edit']);
    Route::post('update/{id}', [App\Http\Controllers\admin\Post::class, 'update']);

    // About Routes
    Route::group(['prefix' => 'about'], function () {
        Route::get('aboutlist', [App\Http\Controllers\admin\AboutController::class, 'about_listing']);
        Route::get('about', function () {
            return view('admin.post.about.about');
        });
        Route::post('aboutsubmit', [App\Http\Controllers\admin\AboutController::class, 'about_submit']);
        Route::get('aboutdelete/{id}', [App\Http\Controllers\admin\AboutController::class, 'about_delete']);
        Route::get('aboutedit/{id}', [App\Http\Controllers\admin\AboutController::class, 'about_edit']);
        Route::post('aboutupdate/{id}', [App\Http\Controllers\admin\AboutController::class, 'about_update']);
    });
});

3. 前台展示功能实现

前台展示功能负责将后台管理的数据展示给用户。

3.1 控制器修改

如前面所述,确保 EngHafizController@home 方法正确传递数据。

3.2 视图修改

修改 user.english.index 视图,正确展示数据。


@foreach ($result as $list)
    @@##@@image) }}" class="d-block w-100" alt="...">
    

{{ $list->title }}

{{ $list->description }}

Read More
@endforeach @foreach($aboutresult as $aboutlist)
{{$aboutlist->title3}}
@endforeach

代码优化与注意事项

  • 使用 Eloquent 模型: 尽量使用 Eloquent 模型来操作数据库,而不是直接使用 DB::table(),这样可以提高代码的可读性和可维护性。
  • 图片存储路径: 建议将图片存储在 public/storage 目录下,并在 .env 文件中配置 FILESYSTEM_DISK=public,然后使用 php artisan storage:link 命令创建软链接。
  • 表单验证: 使用 Laravel 的表单验证功能,确保数据的有效性。
  • 错误处理: 完善错误处理机制,例如使用 try-catch 块捕获异常,并记录日志。
  • 权限控制: 根据实际需求,添加权限控制功能,限制不同用户对后台管理功能的访问。
  • 前端优化: 使用前端框架(如 Vue.js、React)来构建交互性更强的用户界面。

总结

本文详细介绍了如何在 Laravel 框架下构建一个内容管理系统,并解决了在前端页面展示管理后台数据时遇到的“Undefined variable”错误。通过遵循本文档的步骤和建议,开发者可以快速搭建一个可维护、易扩展的内容管理系统,满足各种业务需求。

Laravel 管理后台集成:内容管理最佳实践Laravel 管理后台集成:内容管理最佳实践

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

1801

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1203

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1099

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

948

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1396

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1228

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1439

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1303

2023.11.13

ip地址修改教程大全
ip地址修改教程大全

本专题整合了ip地址修改教程大全,阅读下面的文章自行寻找合适的解决教程。

81

2025.12.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号