Page 和评论将使用 Eloquent 提供的“一对多关系”。最终,我们将得到一个个人博客系统的雏形,并布置一个大作业,供大家实战练习。
1. 初识 Eloquent
Laravel Eloquent ORM 是 Laravel 中非常重要的部分,也是 Laravel 能如此流行的原因之一。中文文档在:
1. http://laravel-china.org/docs/5.0/eloquent
2. http://www.golaravel.com/laravel/docs/5.0/eloquent/
在前面的教程中已经建立好的 learnlaravel5/app/Page.php 就是一个 Eloquent Model 类:
<?php namespace App; use Illuminate\\Database\\Eloquent\\Model; class Page extends Model { // }
若想进一步了解 Eloquent,推荐阅读系列文章:深入理解 Laravel Eloquent
2. 创建 Comment 模型
首先我们要新建一张表来存储 Comment,命令行运行:
4. 前台提交功能
修改 Comment 模型:
<?php namespace App; use Illuminate\\Database\\Eloquent\\Model; class Comment extends Model { protected $fillable = [\'nickname\', \'email\', \'website\', \'content\', \'page_id\']; }
增加一行路由:
运行以下命令创建 CommentsController 控制器:
修改 CommentsController:
<?php namespace App\\Http\\Controllers; use App\\Http\\Requests; use App\\Http\\Controllers\\Controller; use Illuminate\\Http\\Request; use Redirect, Input; use App\\Comment; class CommentsController extends Controller { public function store() { if (Comment::create(Input::all())) { return Redirect::back(); } else { return Redirect::back()->withInput()->withErrors(\'评论发表失败!\'); } } }
修改视图 learnlaravel5/resources/views/pages/show.blade.php:
@extends(\'_layouts.default\') @section(\'content\') <h4> <a href=\"/\">⬅️返回首页</a> </h4> <h1 style=\"text-align: center; margin-top: 50px;\">{{ $page->title }}</h1> <hr> <div id=\"date\" style=\"text-align: right;\"> {{ $page->updated_at }} </div> <div id=\"content\" style=\"padding: 50px;\"> <p> {{ $page->body }} </p> </div> <div id=\"comments\" style=\"margin-bottom: 100px;\"> @if (count($errors) > 0) <div class=\"alert alert-danger\"> <strong>Whoops!</strong> There were some problems with your input.<br><br> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif <div id=\"new\"> <form action=\"{{ URL(\'comment/store\') }}\" method=\"POST\"> <input type=\"hidden\" name=\"_token\" value=\"{{ csrf_token() }}\"> <input type=\"hidden\" name=\"page_id\" value=\"{{ $page->id }}\"> <div class=\"form-group\"> <label>Nickname</label> <input type=\"text\" name=\"nickname\" class=\"form-control\" style=\"width: 300px;\" required=\"required\"> </div> <div class=\"form-group\"> <label>Email address</label> <input type=\"email\" name=\"email\" class=\"form-control\" style=\"width: 300px;\"> </div> <div class=\"form-group\"> <label>Home page</label> <input type=\"text\" name=\"website\" class=\"form-control\" style=\"width: 300px;\"> </div> <div class=\"form-group\"> <label>Content</label> <textarea name=\"content\" id=\"newFormContent\" class=\"form-control\" rows=\"10\" required=\"required\"></textarea> </div> <button type=\"submit\" class=\"btn btn-lg btn-success col-lg-12\">Submit</button> </form> </div> <script> function reply(a) { var nickname = a.parentNode.parentNode.firstChild.nextSibling.getAttribute(\'data\'); var textArea = document.getElementById(\'newFormContent\'); textArea.innerHTML = \'@\'+nickname+\' \'; } </script> <div class=\"conmments\" style=\"margin-top: 100px;\"> @foreach ($page->hasManyComments as $comment) <div class=\"one\" style=\"border-top: solid 20px #efefef; padding: 5px 20px;\"> <div class=\"nickname\" data=\"{{ $comment->nickname }}\"> @if ($comment->website) <a href=\"{{ $comment->website }}\"> <h3>{{ $comment->nickname }}</h3> </a> @else <h3>{{ $comment->nickname }}</h3> @endif <h6>{{ $comment->created_at }}</h6> </div> <div class=\"content\"> <p style=\"padding: 20px;\"> {{ $comment->content }} </p> </div> <div class=\"reply\" style=\"text-align: right; padding: 5px;\"> <a href=\"#new\" onclick=\"reply(this);\">回复</a> </div> </div> @endforeach </div> </div> @endsection
前台评论功能完成。
查看效果:
5. 后台管理功能
修改基础视图 learnlaravel5/resources/views/app.blade.php 为:
<!DOCTYPE html> <html lang=\"en\"> <head> <meta charset=\"utf-8\"> <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"> <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"> <title>Laravel</title> <link href=\"/css/app.css\" rel=\"stylesheet\"> <!-- Fonts --> <link href=\'http://fonts.useso.com/css?family=Roboto:400,300\' rel=\'stylesheet\' type=\'text/css\'> </head> <body> <nav class=\"navbar navbar-default\"> <div class=\"container-fluid\"> <div class=\"navbar-header\"> <button type=\"button\" class=\"navbar-toggle collapsed\" data-toggle=\"collapse\" data-target=\"#bs-example-navbar-collapse-1\"> <span class=\"sr-only\">Toggle Navigation</span> <span class=\"icon-bar\"></span> <span class=\"icon-bar\"></span> <span class=\"icon-bar\"></span> </button> <a class=\"navbar-brand\" href=\"#\">Learn Laravel 5</a> </div> <div class=\"collapse navbar-collapse\" id=\"bs-example-navbar-collapse-1\"> <ul class=\"nav navbar-nav\"> <li><a href=\"/admin\">后台首页</a></li> </ul> <ul class=\"nav navbar-nav\"> <li><a href=\"/admin/comments\">管理评论</a></li> </ul> <ul class=\"nav navbar-nav navbar-right\"> @if (Auth::guest()) <li><a href=\"/auth/login\">Login</a></li> <li><a href=\"/auth/register\">Register</a></li> @else <li class=\"dropdown\"> <a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\">{{ Auth::user()->name }} <span class=\"caret\"></span></a> <ul class=\"dropdown-menu\" role=\"menu\"> <li><a href=\"/auth/logout\">Logout</a></li> </ul> </li> @endif </ul> </div> </div> </nav> @yield(\'content\') <!-- Scripts --> <script src=\"//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js\"></script> <script src=\"//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.1/js/bootstrap.min.js\"></script> </body> </html>
修改后台路由组(增加了一行):
Route::group([\'prefix\' => \'admin\', \'namespace\' => \'Admin\', \'middleware\' => \'auth\'], function() { Route::get(\'/\', \'AdminHomeComtroller@index\'); Route::resource(\'pages\', \'PagesController\'); Route::resource(\'comments\', \'CommentsController\'); });
创建 Admin\\CommentsController :
Admin/CommentsController 要有 查看所有、查看单个、POST更改、删除四个接口:
<?php namespace App\\Http\\Controllers\\Admin; use App\\Http\\Requests; use App\\Http\\Controllers\\Controller; use Illuminate\\Http\\Request; use App\\Comment; use Redirect, Input; class CommentsController extends Controller { public function index() { return view(\'admin.comments.index\')->withComments(Comment::all()); } public function edit($id) { return view(\'admin.comments.edit\')->withComment(Comment::find($id)); } public function update(Request $request, $id) { $this->validate($request, [ \'nickname\' => \'required\', \'content\' => \'required\', ]); if (Comment::where(\'id\', $id)->update(Input::except([\'_method\', \'_token\']))) { return Redirect::to(\'admin/comments\'); } else { return Redirect::back()->withInput()->withErrors(\'更新失败!\'); } } public function destroy($id) { $comment = Comment::find($id); $comment->delete(); return Redirect::to(\'admin/comments\'); } }
接下来创建两个视图:
learnlaravel5/resources/views/admin/comments/index.blade.php:
@extends(\'app\') @section(\'content\') <div class=\"container\"> <div class=\"row\"> <div class=\"col-md-10 col-md-offset-1\"> <div class=\"panel panel-default\"> <div class=\"panel-heading\">管理评论</div> <div class=\"panel-body\"> <table class=\"table table-striped\"> <tr class=\"row\"> <th class=\"col-lg-4\">Content</th> <th class=\"col-lg-2\">User</th> <th class=\"col-lg-4\">Page</th> <th class=\"col-lg-1\">编辑</th> <th class=\"col-lg-1\">删除</th> </tr> @foreach ($comments as $comment) <tr class=\"row\"> <td class=\"col-lg-6\"> {{ $comment->content }} </td> <td class=\"col-lg-2\"> @if ($comment->website) <a href=\"{{ $comment->website }}\"> <h4>{{ $comment->nickname }}</h4> </a> @else <h3>{{ $comment->nickname }}</h3> @endif {{ $comment->email }} </td> <td class=\"col-lg-4\"> <a href=\"{{ URL(\'pages/\'.$comment->page_id) }}\" target=\"_blank\"> {{ App\\Page::find($comment->page_id)->title }} </a> </td> <td class=\"col-lg-1\"> <a href=\"{{ URL(\'admin/comments/\'.$comment->id.\'/edit\') }}\" class=\"btn btn-success\">编辑</a> </td> <td class=\"col-lg-1\"> <form action=\"{{ URL(\'admin/comments/\'.$comment->id) }}\" method=\"POST\" style=\"display: inline;\"> <input name=\"_method\" type=\"hidden\" value=\"DELETE\"> <input type=\"hidden\" name=\"_token\" value=\"{{ csrf_token() }}\"> <button type=\"submit\" class=\"btn btn-danger\">删除</button> </form> </td> </tr> @endforeach </table> </div> </div> </div> </div> </div> @endsection
learnlaravel5/resources/views/admin/comments/edit.blade.php:
@extends(\'app\') @section(\'content\') <div class=\"container\"> <div class=\"row\"> <div class=\"col-md-10 col-md-offset-1\"> <div class=\"panel panel-default\"> <div class=\"panel-heading\">编辑评论</div> <div class=\"panel-body\"> @if (count($errors) > 0) <div class=\"alert alert-danger\"> <strong>Whoops!</strong> There were some problems with your input.<br><br> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif <form action=\"{{ URL(\'admin/comments/\'.$comment->id) }}\" method=\"POST\"> <input name=\"_method\" type=\"hidden\" value=\"PUT\"> <input type=\"hidden\" name=\"_token\" value=\"{{ csrf_token() }}\"> <input type=\"hidden\" name=\"page_id\" value=\"{{ $comment->page_id }}\"> Nickname: <input type=\"text\" name=\"nickname\" class=\"form-control\" required=\"required\" value=\"{{ $comment->nickname }}\"> <br> Email: <input type=\"text\" name=\"email\" class=\"form-control\" required=\"required\" value=\"{{ $comment->email }}\"> <br> Website: <input type=\"text\" name=\"website\" class=\"form-control\" required=\"required\" value=\"{{ $comment->website }}\"> <br> Content: <textarea name=\"content\" rows=\"10\" class=\"form-control\" required=\"required\">{{ $comment->content }}</textarea> <br> <button class=\"btn btn-lg btn-info\">提交修改</button> </form> </div> </div> </div> </div> </div> @endsection
后台管理功能完成,查看效果:
6. 大作业
依赖于 Page 的评论功能已经全部完成,个人博客系统雏形诞生。在本系列教程的最后,布置一个大作业:构建出 Article 的前后台,并且加上 Article 与 Comment 的一对多关系,加入评论和评论管理功能。在做这个大作业的过程中,你将会反复地回头去看前面的教程,反复地阅读中文文档,会仔细阅读我的代码,等你完成大作业的时候,Laravel 5 就真正入门啦~~
以上所述就是本文的全部内容了,希望大家能够喜欢。
本文地址:https://www.stayed.cn/item/15857
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我