目录
前言
在Laravel项目开发中,遇到错误是不可避免的问题之一。这些错误可能会妨碍项目的正常运行,甚至导致项目无法启动。因此,及时发现这些问题并解决它们非常重要。
一.首页制作中可能遇到的报错及解决方法
在进行首页制作时,将可能遇到来自系统的报错(如下图所示)
报出这样的错误时,我在与老师交谈和网络上查询资料之后,发现一般存在下面几个问题
1.查找是否存在模型的引入或定义的问题
1)模型文件的定义
我们对自己的Content模型文件进行查看,是否存在问题。
发现下列代码中,`$table` 属性定义了该模型类所对应的数据库表名为 `content`,`$fillable` 属性定义了该模型类中允许被批量赋值的属性名。表示该模型类中允许被批量赋值的属性名。在使用该模型类创建对象时,在 `$fillable` 数组中的属性会被赋值,可以进行修改,其他属性都会被忽略。
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Content extends Model
{
//允许操作的表及其对应字段
protected $table = "content";
public $fillable = ['cid', 'title', 'content', 'image', 'status'];
public function category()
{
//belong()多一对关联,将其关联到栏目表,App\Category是被关联模型的命名空间, cid本模型的关系字段, id是本关联模型的关系名称
return $this->belongsTo('App\Category', 'cid', 'id');//cid是内容的ID,id是栏目的ld
}
public function comments()
{
return $this->hasMany('App\Comment', 'cid', 'id');
}
}
最终发现我们已经设置了允许操作的表及其对应字段,那么这里不是模型文件的问题
2)模型文件的引入
在我们的index控制器中查看其是否引用Content模型来对表中的值进行修改。
从下面代码中可以看到,在index()方法中,引入了Content模型,它从状态字段等于 2 的数据库中检索所有内容条目。检索到的结果存储在 $recommend 变量中。同时也将App\Content类引入到当前代码文件中。
所以控制器引入并没有问题;
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Category;
use App\Content;
use App\Adv;
use App\Like;
use App\Comment;
use Illuminate\Support\Facades\DB;
class IndexController extends Controller
{
//
public function index()
{
$this->hotContent();
$this->navBar();
$recommend = Content::where('status', '2')->get();
$advcontent = [];
$advlist = Adv::where('name', 'imgbox')->get();
foreach ($advlist as $key => $value) {
foreach ($value->content as $k => $v) {
$advcontent= explode('|', $v->path);
}
}
$list = Category::orderBy('id', 'desc')->get()->take(4);
return view('index',['recommend' => $recommend, 'adv' => $advcontent, 'list' => $list]);
}
}
如果不是模型方面的问题,那么接下来让我们来看下一个可能存在问题的地方。
2.查看是否存在数据库的问题
因为我们在制作数据库时可能会存在错乱,id对不上的情况,所以我们第一步根据报错来查看Content表,将分为下面三种情况;
1).id为0的情况
在一般情况下,数据库的ID是从1开始自增的,因此id为0的情况在数据库中是不存在的。如果你试图查询数据库中id为0的记录,那么通常会返回空结果集。因此在Content表中我们要注意的是主键id是否出现了为0的情况,可能存在我们进行数据库修改时,将id误改为0的情况。
2).关联表的数据出现不同的情况
关联表的数据出现不同的意思是相关联的表之间的主键和外键之间的关联出现不同。如果数据库中主键和外键之间的关联出现了不同,那么可能会破坏数据的完整性,从而导致运行结果报错。
我们应该将关联的Category表和Content表相比较,如果从中发现有不相同的id情况时,系统就会报错。但从两图对比中可以发现我并没有出现报错情况。综上所述来判定不是数据库的问题。
3).存在后台数据与数据库产生冲突
在针对前两种情况进行分析后,仍未发现错误的原因。
最后,我在对照了我的后台数据和数据库的数据之后,发现我在删除了后台数据之后,数据库的数据依然存在,所以系统产生后台数据和数据库之间的冲突,导致运行报错。
小结一下:在我们进行首页制作时,遇到报错的时候,我们需要分析一步一步的分析可能存在的问题。首先检查模型的引入或定义是否正确,如果没有问题,就需要检查数据库是否存在问题,其中包括主键id为0、关联表的数据出现不同、后台数据与数据库产生冲突等。最终根据具体情况去解决问题。
二.解决URL问题和美化项目的两种方法
在我完成项目后总体进行运行时,我发现除了首页之外,跳转到其他页面时都显示在此服务器上找不到请求的URL。此外,在尝试使用ErrorDocument处理请求时,还遇到了404 Not Found错误。
但是在其中加上index.php便可以运行出结果,在查阅相关资料和我发现,在进行 Laravel 运行时需要加上 index.php 的主要原因是因为 Laravel 的默认路由器被设置为 index.php 文件。如果没有加上 index.php ,服务器将无法识别请求并无法正确处理它。
为了实现URL重写,需要在Web服务器的配置文件中进行一些设置,以便将所有请求都重定向到应用程序的公共入口文件。在系统默认情况下,这个入口文件是“index.php”。如果你的Web服务器没有正确地配置URL重写,可能需要在URL中手动添加“index.php”才能访问Laravel应用程序的页面。
为了避免每次运行时都需要在网址中添加“index.php”,美化我的项目,我在网上寻找了以下解决方案。
1.修改Nginx配置文件
如果使用的是nginx服务器的话,我们可以进行下面的操作
首先需要打开我们的集成软件,我这里用的是phpstudy_pro。找到我们将要运行项目的网站,点击“修改”进入页面。
然后我们在弹出的页面中找到错误页面,并在其下方加上下列代码中输入下列代码
try_files $uri $uri/ /index.php?$query_string;
这段代码是一个Nginx配置文件中的指令,它的作用是将请求的URI与文件系统上的实际文件进行匹配,并根据匹配结果返回相应的内容。实现了一个PHP应用程序的入口文件“index.php”。
error_page 400 /error/400.html;
error_page 403 /error/403.html;
error_page 404 /error/404.html;
error_page 500 /error/500.html;
error_page 501 /error/501.html;
error_page 502 /error/502.html;
error_page 503 /error/503.html;
error_page 504 /error/504.html;
error_page 505 /error/505.html;
error_page 506 /error/506.html;
error_page 507 /error/507.html;
error_page 509 /error/509.html;
error_page 510 /error/510.html;
try_files $uri $uri/ /index.php?$query_string;
点击确定后,我们重启Nginx服务,在打开运行项目并继续进行跳转时,发现即使缺少“index.php”文件,也能成功实现跳转。
2.在Apache服务器上配置默认索引页文件顺序
而当我们使用的是Apache服务器的话,我们将要进行下面的操作进行实现;
首先在我们的设置中找到我们Apache的配置文件httpd.conf。
我使用记事本打开后效果图如下
在当中找到下面
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
将其改成
<IfModule dir_module>
DirectoryIndex index.html index.php
</IfModule>
在代码中增加了index.php后,它设置了在没有请求特定文件时将用作目录的默认索引页的文件顺序。在这种情况下,服务器将首先查找“index.html”,如果没有找到,它将查找“index.php
3.给超链接指定路径并创建指向index.php的链接
当上面的结果运行不出来时,我们可以在网页中创建一个指向,指向“index.php”。
首先我们找到项目的首页,在我们设置的超链接的路径上加上“index.php”。
<div class="header">
<header>
<div class="container">
<a href="{{url("/index.php")}}" style="color:#000000">//指定路径
<div class="header-logo"><span>内容</span>管理系统</div>
</a>
<ul class="header-right">
@if(session()->has('users.name'))
<li>
<a href="#" class="j-layout-pwd">
<i class="fa fa-user fa-fw"></i>{{ session()->get('users.name') }}
</a>
</li>
<li><a href="{{ url('logout') }}"><i class="fa fa-power-off fa-fw"></i>退出</a></li>
@else
<li><a href="#" data-toggle="modal" data-target="#loginModal">登录</a></li>
<li><a href="#" data-toggle="modal" data-target="#registerModal">注册</a></li>
@endif
</ul>
</div>
</header>
<!-- 栏目列表 -->
<nav class="navbar navbar-expand-md navbar-dark">
<div class="container">
<div></div>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-expanded="false" aria-controls="navbarSupportedContent" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<a class="nav-link" href="/index.php">首页</a>//指定路径
</li>
这样在我们运行项目,点击首页的时候网址中就会出现“index.php”,就不需要我们再进行输入。
这就是不用手动添加“index.php”的三个方法。
解决URL问题和美化项目的两种方法:修改Nginx配置文件和在Apache服务器上配置默认索引页文件顺序。对于无法实现URL重写的情况,还可以给超链接指定路径并创建指向index.php的链接。在配置中加上index.php的主要原因是因为Laravel的默认路由器被设置为index.php文件。如果没有加上index.php,服务器将无法识别请求并无法正确处理它。通过以上方法,可以避免每次运行时都需要在网址中添加“index.php”,从而美化项目,并提高用户体验。
三、提高用户体验的点赞功能优化
在实现点赞功能后,由于没有设置限制,一个用户可以进行多次点击,那么点赞量就会很高,很影响用户体验
public function like($id)
{
if(!$id){
return response()->json(['status'=>'2','msg'=>'缺少参数']);
}
@session_start();
$data = array(
'uid' => session()->get('users.id'),
'cid' => $id
);
$re = Like::create($data);
if($re){
$count = Like::where('cid', $id)->get()->count();
return response()->json(['status'=>'1', 'msg'=>'点赞成功', 'count'=>$count]);
}else{
return response()->json(['status'=>'2', 'msg'=>'点赞失败']);
}
}
1.每个用户只能进行一次点赞
我们在原有的点赞方法like()中,进行一些改进,使一个用户只能进行一次点赞
public function like($id)
{
if(!$id){
return response()->json(['status'=>'2','msg'=>'缺少参数']);
}
@session_start();
$uid = session()->get('users.id');
$like = Like::where('uid', $uid)->where('cid', $id)->first();
if ($like) {
//若已经点过赞,返回错误提示信息
return response()->json(['status'=>'0', 'msg'=>'您已经点过赞了']);
} else {
//若没有点过赞,新增一条点赞记录,并返回点赞成功的提示信息
$like = new Like;
$like->cid = $id;
$like->uid = $uid;
$like->save();
$count = Like::where('cid', $id)->get()->count();
return response()->json(['status'=>'1', 'msg'=>'点赞成功', 'count'=>$count]);
}
$data = array(
'uid' => session()->get('users.id'),
'cid' => $id
);
$re = Like::create($data);
if($re){
$count = Like::where('cid', $id)->get()->count();
return response()->json(['status'=>'1', 'msg'=>'点赞成功', 'count'=>$count]);
}else{
return response()->json(['status'=>'2', 'msg'=>'点赞失败']);
}
}
这段代码首先通过查询数据库中是否存在该用户对该评论的点赞记录,来判断该用户是否已经点过赞。如果已经点过赞,则返回错误提示信息,提示用户已经点过赞了。如果该用户没有点过赞,则新增一条点赞记录,并返回点赞成功的提示信息。
2.用户首次点击表示点赞,再次点击为取消点赞。
一个用户只能进行一次点赞,点击之后没有后续,会影响用户的体验,为此我在一个用户只能进行一次点赞的功能中进行改进,将点赞功能变成第一次点击进行点赞,再次点击取消点赞
public function like($id)
{
if(!$id){
return response()->json(['status'=>'2','msg'=>'缺少参数']);
}
@session_start();
$uid = session()->get('users.id');
$like = Like::where('uid', $uid)->where('cid', $id)->first();
if ($like) {
//若已经点过赞,删除该点赞记录,并返回取消点赞成功的提示信息
$like->delete();
$count = Like::where('cid', $id)->get()->count();
return response()->json(['status'=>'1', 'msg'=>'取消点赞成功', 'count'=>$count]);
}
$data = array(
'uid' => session()->get('users.id'),
'cid' => $id
);
$re = Like::create($data);
if($re){
$count = Like::where('cid', $id)->get()->count();
return response()->json(['status'=>'1', 'msg'=>'点赞成功', 'count'=>$count]);
}else{
return response()->json(['status'=>'2', 'msg'=>'点赞失败']);
}
}
当用户点击点赞按钮时,会向服务器发送一个请求,请求的参数是评论的id。服务器接收到请求后,首先判断是否缺少参数,如果缺少则返回错误提示。然后从session中获取用户ID,查询该用户是否已经点过该评论的赞。如果点过赞,则删除该点赞记录,并返回取消点赞成功的提示信息;如果没点过赞,则新增一条点赞记录,并返回点赞成功的提示信息。
在这里我们润色了两个点赞功能的代码段,并分别对它们进行了改进,以提高用户的体验。第一个改进是让一个用户只能进行一次点赞,避免了一个用户对同一内容重复点赞的情况。第二个改进是将点赞功能改为第一次点击进行点赞,再次点击取消点赞,更符合用户的习惯和体验。这两个改进在实现功能的同时,也提高了用户对网站的满意度。
总结
在Laravel项目中,我们常常会遇到各种报错信息和项目中的不足之处,这些信息提示了项目可能存在的问题。总之,遇到问题,我们需要先理解错误信息所提示的问题,然后定位出问题所在,并尝试用不同的方法解决问题。通过积累经验和不断学习,我们可以快速定位和解决问题,进一步优化我们的项目。
借鉴方法网址:laravel要在域名后加index.php才能访问其它页面 - pensive2019 - 博客园 (cnblogs.com)