加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Laravel 系列入门教程(五)【最适合中国人的 Laravel 教程】

发布时间:2020-12-14 19:58:45 所属栏目:大数据 来源:网络整理
导读:本文是本系列教程的完结篇,我们将一起给 Article 加入评论功能,让游客在前台页面可以查看、提交、回复评论,并完成后台评论管理功能,可以删除、编辑评论。Article 和评论将使用 Laravel Eloquent 提供的“一对多关系”功能大大简化模型间关系的复杂度。最

本文是本系列教程的完结篇,我们将一起给 Article 加入评论功能,让游客在前台页面可以查看、提交、回复评论,并完成后台评论管理功能,可以删除、编辑评论。Article 和评论将使用 Laravel Eloquent 提供的“一对多关系”功能大大简化模型间关系的复杂度。最终,我们将得到一个个人博客系统的雏形,并布置一个大作业,供大家实战练习。

本篇文章中我将会使用一些 Laravel 的高级功能,这些高级功能对新手理解系统是不利的,但熟手使用这些功能可以大幅提升开发效率。

回顾 Eloquent

前面我们已经说过,Laravel Eloquent ORM 是 Laravel 中最强大的部分,也是 Laravel 能如此流行最重要的原因。中文文档在:

learnlaravel5/app/Article.php?就是一个最简单的 Eloquent Model 类:

namespace App;

<span style="color: #0000ff">use<span style="color: #000000"> IlluminateDatabaseEloquentModel;

<span style="color: #0000ff">class Article <span style="color: #0000ff">extends<span style="color: #000000"> Model
{
<span style="color: #008000">//
}

若想进一步了解 Eloquent 推荐阅读系列文章:

构建评论系统

基础规划

我们需要新建一个表专门用来存放每一条评论,每一条评论都属于某一篇文章。评论之间的层级关系比较复杂,本文为入门教程,主要是为了带领大家体验模型间关系,就不再做过多的规划了,将“回复别人的评论”暂定为简单的在评论内容前面增加??这样的字符串。

建立 Model 类和数据表

创建名为 Comment 的 Model 类,并顺便创建附带的 migration,在 learnlaravel5 目录下运行命令:

php artisan make:model Comment -m

这样一次性建立了 Comment 类和?learnlaravel5/database/migrations/2017_11_11_151823_create_comments_table.php?两个文件。填充该文件的 up 方法,给?comments?表增加字段:

::create('comments', (Blueprint ->increments('id'->('nickname'->('email')->->('website')->->text('content')->->('article_id'->

之后运行命令:

php artisan migrate

去数据库里瞧瞧,comments 表已经躺在那儿啦。

建立“一对多关系”

在 Article 模型中增加一对多关系的函数:

namespace App;

<span style="color: #0000ff">use<span style="color: #000000"> IlluminateDatabaseEloquentModel;

<span style="color: #0000ff">class Article <span style="color: #0000ff">extends<span style="color: #000000"> Model
{
<span style="color: #0000ff">public <span style="color: #0000ff">function<span style="color: #000000"> hasManyComments()
{
<span style="color: #0000ff">return <span style="color: #800080">$this->hasMany('AppComment','article_id','id'<span style="color: #000000">);
}
}

搞定啦!Eloquent 中模型间关系就是这么简单!

模型间关系中文文档:扩展阅读:

构建前台 UI

让我们修改前台的视图文件,想办法把评论功能加进去。

创建前台的 ArticleController 类

运行命令:

php artisan make:controller ArticleController

增加路由:

Route::get('article/{id}','ArticleController@show');

此处的 {id} 指代任意字符串,在我们的规划中,此字段为文章 ID,为数字,但是本行路由却会尝试匹配所有请求,所以当你遇到了奇怪的路由调用的方法跟你想象的不一样时,记得检查路由顺序。路由匹配方式为前置匹配:任何一条路由规则匹配成功,会立刻返回结果,后面的路由便没有了响应的机会。

给 ArticleController 增加 show 函数:

show( view('article/show')->withArticle(Article::with('hasManyComments')->find(

别忘了在顶部引入 Model 类,否则会报类找不到的错误:

.... <span style="color: #0000ff">class ArticleController <span style="color: #0000ff">extends<span style="color: #000000"> Controller
{
....

创建前台文章展示视图

新建?learnlaravel5/resources/views/article/show.blade.php?文件:

<title>Learn Laravel 5</title> <link href="//cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"&gt; <script src="//cdn.bootcss.com/jquery/2.2.4/jquery.min.js"&gt;</script> <script src="//cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"&gt;</script>
<div id="content" style="padding: 50px;"&gt;

    <h4>
        <a href="/"&gt;<< 返回首页</a>
    </h4>

    <h1 style="text-align: center; margin-top: 50px;"&gt;{{ <span style="color: #800080"&gt;$article</span>->title }}</h1>
    <hr>
    <div id="date" style="text-align: right;"&gt;<span style="color: #000000"&gt;
        {{ </span><span style="color: #800080"&gt;$article</span>-><span style="color: #000000"&gt;updated_at }}
    </span></div>
    <div id="content" style="margin: 20px;"&gt;
        <p><span style="color: #000000"&gt;
            {{ </span><span style="color: #800080"&gt;$article</span>-><span style="color: #000000"&gt;body }}
        </span></p>
    </div>

    <div id="comments" style="margin-top: 50px;"&gt;<span style="color: #000000"&gt;

        @</span><span style="color: #0000ff"&gt;if</span> (<span style="color: #008080"&gt;count</span>(<span style="color: #800080"&gt;$errors</span>) > 0<span style="color: #000000"&gt;)
            </span><div <span style="color: #0000ff"&gt;class</span>="alert alert-danger"&gt;
                <strong>操作失败</strong> 输入不符合要求<br><br><span style="color: #000000"&gt;
                {</span>!! <span style="color: #008080"&gt;implode</span>('<br>',<span style="color: #800080"&gt;$errors</span>->all()) !!<span style="color: #000000"&gt;}
            </span></div><span style="color: #000000"&gt;
        @</span><span style="color: #0000ff"&gt;endif</span>

        <div id="new"&gt;
            <form action="{{ url('comment') }}" method="POST"&gt;<span style="color: #000000"&gt;
                {</span>!! csrf_field() !!<span style="color: #000000"&gt;}
                </span><input type="hidden" name="article_id" value="{{ <span style="color: #800080"&gt;$article</span>->id }}"&gt;
                <div <span style="color: #0000ff"&gt;class</span>="form-group"&gt;
                    <label>Nickname</label>
                    <input type="text" name="nickname" <span style="color: #0000ff"&gt;class</span>="form-control" style="width: 300px;" required="required"&gt;
                </div>
                <div <span style="color: #0000ff"&gt;class</span>="form-group"&gt;
                    <label>Email address</label>
                    <input type="email" name="email" <span style="color: #0000ff"&gt;class</span>="form-control" style="width: 300px;"&gt;
                </div>
                <div <span style="color: #0000ff"&gt;class</span>="form-group"&gt;
                    <label>Home page</label>
                    <input type="text" name="website" <span style="color: #0000ff"&gt;class</span>="form-control" style="width: 300px;"&gt;
                </div>
                <div <span style="color: #0000ff"&gt;class</span>="form-group"&gt;
                    <label>Content</label>
                    <textarea name="content" id="newFormContent" <span style="color: #0000ff"&gt;class</span>="form-control" rows="10" required="required"&gt;</textarea>
="conmments" style="margin-top: 100px;"> (->hasManyComments
="one" style="border-top: solid 20px #efefef; padding: 5px 20px;">
="nickname" data="{{ ->nickname }}"> (->->website }}">

{{ ->nickname }}

{{ ->nickname }}

{{ ->created_at }}
="content">

->

="reply" style="text-align: right; padding: 5px;">

构建评论存储功能

我们需要创建一个 CommentsController 控制器,并增加一条“存储评论”的路由。运行命令:

php artisan make:controller CommentController

控制器创建成功,接下来我们增加一条路由:

Route::post('comment','CommentController@store');

给这个类增加 store 函数:

store(Request (Comment::create(-> redirect()-> redirect()->back()->withInput()->withErrors('评论发表失败!'

此处 Comment 类请自己引入。

批量赋值

我们采用批量赋值方法来减少存储评论的代码,。

给 Comment 类增加 $fillable 成员变量:

= ['nickname','email','website','content','article_id'];

检查成果

前台文章展示页:

提交几条评论之后:

恭喜你,前台评论功能构建完成!

【大作业】构建后台评论管理功能

评论跟 Article 一样,是一种可以管理的资源列表。2015 版教程的最后,我风风火火地罗列了一堆又一堆的代码,其实对还没入门的人几乎没用。在此,我将这个功能作为大作业布置给大家。大作业嘛,当然是没有标准答案的,但有效果图:

在做这个大作业的过程中,你将会反复地回头去看前面的教程,反复地阅读中文文档,会仔细阅读我的代码,等你完成大作业的时候,Laravel 就真正入门啦~~

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读