Laravel 5 框架入门(四)完结篇

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,命令行运行:

代码如下:

php artisan make:model Comment

成功以后,修改 migration 文件 learnlaravel5/database/migrations/***_create_comments_table.php 的相应位置为:

Schema::create('comments', function(Blueprint $table)
{
 $table->increments('id');
 $table->string('nickname');
 $table->string('email')->nullable();
 $table->string('website')->nullable();
 $table->text('content')->nullable();
 $table->integer('page_id');
 $table->timestamps();
});

之后运行:

代码如下:

php artisan migrate

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

3. 建立“一对多关系”

修改 Page 模型:

<?php namespace App;

use Illuminate\Database\Eloquent\Model;

class Page extends Model {

 public function hasManyComments()
 {
  return $this->hasMany('App\Comment', 'page_id', 'id');
 }

}

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

模型间关系中文文档:http://laravel-china.org/docs/5.0/eloquent#relationships

4. 前台提交功能

修改 Comment 模型:

<?php namespace App;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model {

 protected $fillable = ['nickname', 'email', 'website', 'content', 'page_id'];

}

增加一行路由:

代码如下:

Route::post('comment/store', 'CommentsController@store');

运行以下命令创建 CommentsController 控制器:

代码如下:

php artisan make:controller 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="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
 <script src="https://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 :

代码如下:

php artisan make:controller 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 就真正入门啦~~

以上所述就是本文的全部内容了,希望大家能够喜欢。

(0)

相关推荐

  • PHP框架Laravel学习心得体会

    Laravel是一套简洁.优雅的PHP Web开发框架 (PHP Web Framework) .在世界(不含中国)PHP框架的占有率超过40%. 自从接触PHP以来一直使用Yii,感觉Yii实现功能比较简单,是一个很不错的框架.最近由于工作的原因开始研究Laravel5,不得不说我在第一步安装就被坑着了,下面就是我痛苦的学习成果.Laravel对我来说完全是新东西,如果内容有误,烦请留言或QQ我,帮我纠正错误,感激不尽!!! 1.首先安装php,最好5.6以上版本 (1)windows安装co

  • 基于laravel制作APP接口(API)

    前期准备 前言,为什么做以及要做个啥 本人姓小名白,不折不扣编程届小白一名,但是自从大一那会儿接触到编程这件奇妙的事情,就完完全全的陷入的程序的世界. 这不,最近又开始折腾APP了,话说现在开发一款APP真是容易,只用JavaScript和一点点HTML+css技术就可以完成.但是做APP的后台就不一样了.开发了APP,想让读点数据进去,那我们就要去开发个后台了. laravel框架,是我最喜欢的PHP框架了,没有之一.去年就曾经用laravel写了我的个人网站但粗糙程度让我十分脸红,好了不扯了

  • Laravel 5框架学习之用户认证

    Laravel 出厂已经带有了用户认证系统,我们来看一下 routes.php,如果删除了,添加上: Route::controllers([ 'auth' => 'Auth\AuthController', 'password' => 'Auth\PasswordController' ]); 可以使用 php artisan route:list 查看一下.浏览器中访问 /auth/login,可以看到登陆界面,最好把系统默认的 app.blade.php 中关于 google 的东西注释

  • Laravel 5框架学习之Eloquent 关系

    一个用户可能有多个文章,一个文章是某个用户书写的,这就是关系.同样文章中可能包含多个 TAG,而一个 TAG 可能关联多个文章. 在项目中,我们已经有了 User.php,也就是用户模型,查看一下,相当简单.我们希望直接使用 $user->articles() 的形式获取全部文章,让我们修改 user 模型: public function articles() { return $this->hasMany('App\Article'); } 但是我们仅仅完成了关系中的一端,让我们来处理另一

  • Laravel 5 框架入门(一)

    Laravel 5 中文文档: 1. http://laravel-china.org/docs/5.0 2. http://www.golaravel.com/laravel/docs/5.0/ 默认条件 本文默认你已经有配置完善的 PHP + MySQL 运行环境,懂得 PHP 网站运行的基础知识.跟随本教程走完一遍,你将会得到一个基础的包含登录的简单 blog 系统,并将学会如何使用一些强大的 Laravel 插件和 composer 包(Laravel 插件也是 composer 包).

  • 全面解读PHP的人气开发框架Laravel

    Laravel的主要技术特点: 1.Bundle是Laravel的扩展包组织形式或称呼.Laravel的扩展包仓库已经相当成熟了,可以很容易的帮你把扩展包(bundle)安装到你的应用中.你可以选择下载一个扩展包(bundle)然后拷贝到bundles目录,或者通过命令行工具"Artisan"自动安装. 2.在Laravel中已经具有了一套高级的PHP ActiveRecord实现 -- Eloquent ORM.它能方便的将"约束(constraints)"应用到

  • Laravel实现构造函数自动依赖注入的方法

    本文实例讲述了Laravel实现构造函数自动依赖注入的方法.分享给大家供大家参考,具体如下: 在Laravel的构造函数中可以实现自动依赖注入,而不需要实例化之前先实例化需要的类,如代码所示: <?php namespace Lio\Http\Controllers\Forum; use Lio\Forum\Replies\ReplyRepository; use Lio\Forum\Threads\ThreadCreator; use Lio\Forum\Threads\ThreadCreat

  • Laravel 5框架学习之子视图和表单复用

    我们需要处理编辑文章的问题.当然我们可以手工添加新的路由,就像这样: 复制代码 代码如下: Route::get('/articles/{id}/edit', 'ArticleController@edit'); 让我们在命令行下使用 artisan 的 route:list 来查看我们当前的路由: 复制代码 代码如下: php artisan route:list 在符合 RESTful 的情况下,可能直接使用 laravel 的 resource 路由是一种好的选择,然我们将所有的路由都去掉

  • Laravel使用Caching缓存数据减轻数据库查询压力的方法

    本文实例讲述了Laravel使用Caching缓存数据减轻数据库查询压力的方法.分享给大家供大家参考,具体如下: 昨天想把自己博客的首页做一下缓存,达到类似于生成静态页缓存的效果,在群里问了大家怎么做缓存,都挺忙的没多少回复,我就自己去看了看文档,发现了Caching这个部分,其实之前也有印象,但是没具体接触过,顾名思义,就是缓存了,那肯定和我的需求有点联系,我就认真看了看,发现的确是太强大了,经过很简单的几个步骤,我就改装好了首页,用firebug测试了一下,提高了几十毫秒解析时间,当然了有人

  • Laravel中注册Facades的步骤详解

    本文讲述了Laravel中注册Facades的步骤.分享给大家供大家参考,具体如下: 在Laravel中将类注册为Fcade可以使用Ioc容器,每次使用这个类的时候只会初始化一次类,类似单例模式,而且可以像使用静态方法调用类的方法,下面是在Laravel中注册Facades的步骤. 1.在项目app目录的Providers/AppServiceProvider.php中的register方法新增方法,代码如下. /** * Register any application services. *

  • Laravel实现用户注册和登录

    Laravel身为最优雅的PHP框架,很多学习PHP的小伙伴造就对Laravel垂涎欲滴.今天就来实现你的愿望,让我们一起从零开始,利用Laravel实现Web应用最常见的注册和登录功能!所有的课程源码已放在Github上:laravel-start. Race Start ! 首先我们来明确一下我们这个课程需要的东西: Laravel 4.2 Bootstrap 3.3 Laravel就是我们关心的核心部分,Bootstrap用来快速设置一些前端的CSS样式. 1.安装Laravel 简单说明

  • Laravel 5 框架入门(二)构建 Pages 的管理功能

    我们将改变学习路线,不再像 Laravel 4 教程那样先构建登录系统.在本篇教程中,我们将一起构建 Pages 的管理功能,尝试 Laravel 的路由和 PHP 的命名空间. 1. 路由 Laravel 中的路由,跟其他 PHP 框架一样,作用是把各种请求分流到各个控制器. 在 `learnlaravel5/app/Http/routes.php` 的末尾添加以下代码: 复制代码 代码如下: Route::group(['prefix' => 'admin', 'namespace' =>

  • Laravel 5 框架入门(三)

    本篇教程中,我们将利用 Laravel 5 自带的开箱即用的 Auth 系统对我们的后台进行权限验证,并构建出前台页面,对 Pages 进行展示. 1. 权限验证 后台地址为 http://localhost:88/admin ,我们的所有后台操作都将在此页面或其子页面下进行.利用 Laravel 5 提供的 Auth,我们只需要改动很少部分的路由代码便可以实现权限验证功能. 首先,将路由组的代码改为: 复制代码 代码如下: Route::group(['prefix' => 'admin',

随机推荐