用户注册

public function register() {
        //验证
       
$this->validate(\request(),[
            'name'=>'required|min:3|unique:users,name',//设置user表里的字段name是唯一的
           
'email'=>'required|unique:users,email|email',
            'password'=>'required|min:5|max:10|confirmed',
        ]);
        //逻辑
       
$name = \request('name');
        $email = \request('email');
        $password = bcrypt(\request('password'));//bcrypt:使用明文加密
       
$user = User::create(compact('name','email','password'));
        //渲染
       
return redirect('/login');
    }
}

<form class="form-signin" method="POST" action="/register">
    {{ csrf_field() }}
@include('layout.error')
<button class="btn btn-lg btn-primary btn-block" type="submit">注册</button>

用户登录

//登录行为
public function login() {
    //验证
   
$this->validate(\request(),[
        'email'=>'required|email',
        'password'=>'required|min:5|max:10',
        'is_remember'=>'integer'
    ]);
    //逻辑
   
$user = \request(['email','password']);
    $is_remember = boolval(\request('is_remember'));
    if(\Auth::attempt($user,$is_remember)) {
        return redirect('/posts');
    }
    //渲染
   
return \Redirect::back()->withErrors('邮箱密码不匹配');
}

用户登出

//登出行为
public function logout() {
    \Auth::logout();
    return redirect('/login');
}

使用policy实现文章权限控制:

在首页显示用户名:{{$post->user->name}}

1、在命令行中创建PostPolicy.php

F:\php\bianshu>php artisan make:policy
PostPolicy

Policy created successfully.

并在PostPolicy.php中增加两个方法:

//修改权限
public function update(User $user,Post $post) {
    return $user->id == $post->user_id;
}
//删除权限
public function delete(User $user,Post $post) {
    return $user->id == $post->user_id;
}

2、在App\Policies\PostPolicy.php中修改以下内容:

protected $policies = [
    //'App\Model' => 'App\Policies\ModelPolicy',
   
'App\Post'=>'App\Policies\PostPolicy',
];

3、在PostController.php中的update和delete方法中分别增加以下内容:

$this->authorize('update',$post);

$this->authorize('delete',$post);

4、使除了自己没有权限的用户查看文章详情页时不显示编辑和删除的图标:增加can方法

@can('update',$post)
<a style="margin: auto"  href="/posts/{{$post->id}}/edit">
    <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
</a>
@endcan
{{--@endif--}}
@can('update',$post)
<a style="margin: auto"  href="/posts/{{$post->id}}/delete">
    <span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</a>
@endcan

评论

1、配置路由

//提交评论
Route::post('/posts/{post}/comment','\App\Http\Controllers\PostController@comment');

2、编写comment方法

//提交评论
public function comment(Post $post) {
    //验证
   
$this->validate(\request(),[
        'content'=>'required|min:3',
    ]);
    //逻辑
   
$comment = new Comment();
    $comment->user_id = \App::id();
    $comment->content = \request('content');
    $post->comments()->save($comment);
    //渲染
   
return back();
}

3、详情页配置

<form action="/posts/{{ $post->id }}/comment" method="POST">
    {{ csrf_field() }}

4、Comment.php模型

class Comment extends Model
{
    //评论所属文章
   
public function post() {
        return $this->belongsTo('App\Post');
    }
}

实现评论列表

Show.blade.php

@foreach($post->comments as $comment)
<li class="list-group-item">
    <h5>{{$comment->created_at}} by {{$comment->user->name}}</h5>
    <div>
       {{$comment->content}}
    </div>
</li>
@endforeach

Comment.php

//评论所属用户
public function user() {
    return $this->belongsTo('App\User');
}

public function show(Post $post) {
    $post->load('comments');

实现评论数

//文章列表页
public function index() {
    $posts =Post::orderBy('created_at','desc')->withCount('comments')->paginate(6);

<p class="blog-post-meta">赞 0  | 评论 {{$post->comments_count}}</p>

点赞

1、  路由配置

//
Route::get('/{post}/zan','\App\Http\Controllers\PostController@zan');
//取消赞
Route::get('/{post}/unzan','\App\Http\Controllers\PostController@unzan');

2、PostController.php

//
public function zan(Post $post) {
    $param = [
        'user_id'=>\Auth::id(),
        'post_id'=>$post->id
   
];
    Zan::firstOrCreate($param);
    return back();//回退
}
//取消赞
public function unzan(Post $post) {
    $post->zan(\Auth::id())->delete();
    return back();
}

3、Post.php

//和用户进行关联
public function zan($user_id) {
    //文章对应的某个ID是否有赞
   
return $this->hasOne(\App\Zan::class)->where('user_id',$user_id);
}
//文章的所有赞
public function zans() {
    return $this->hasMany(\App\Zan::class);
}

4、show.blade.php

@if($post->zan(\Auth::id())->exists())
<a href="/posts/{{$post->id}}/unzan" type="button" class="btn btn-default btn-lg">取消赞</a>
@else
<a href="/posts/{{$post->id}}/zan" type="button" class="btn btn-primary btn-lg">赞</a>
@endif

列表页展示赞的数量

1、PostController.php

//文章列表页
public function index() {
    $posts =Post::orderBy('created_at','desc')->withCount(['comments','zans'])->paginate(6);

2、  index.blade.php

<p class="blog-post-meta">赞 {{$post->zans_count}} | 评论 {{$post->comments_count}}</p>

laravel简书(2)的更多相关文章

  1. laravel简书(1)

    Laravel的社区生态 中文社区(http://laravel-china.org) 5.4中文文档(http://d.laravel-china.org/docs/5.4) Laravel源码地址 ...

  2. Laravel 5.4 快速开发简书:

    Laravel 5.4 快速开发简书第1章 课程介绍 介绍课程的大体脉络和课程安排 第2章 Laravel 5.4介绍 本节课会带领大家介绍laravel的各个版本历史以及讨论php框架的未来发展趋势 ...

  3. iOS离屏渲染简书

    更详细地址https://zsisme.gitbooks.io/ios-/content/chapter15/offscreen-rendering.html(包含了核心动画) GPU渲染机制: CP ...

  4. openlayers 3 简书

    1. 简书http://www.jianshu.com/p/6785e755fa0d 2. 文档 http://anzhihun.coding.me/ol3-primer/ch03/03-02.htm ...

  5. Python 2.7_发送简书关注的专题作者最新一篇文章及连接到邮件_20161218

    最近看简书文章关注了几个专题作者,写的文章都不错,对爬虫和数据分析都写的挺好,因此想到能不能获取最新的文章推送到Ipad网易邮箱大师.邮件发送代码封装成一个函数,从廖雪峰大神那里学的  http:// ...

  6. 从刚刚「简书」平台的短暂异常,谈Nginx An error occurred报错~

    09.26简书平台的短暂异常 An error occurred. Sorry, the page you are looking for is currently unavailable. Plea ...

  7. swift调用oc语言文件,第三方库文件或者自己创建的oc文件——简书作者

    Swift是怎样调用OC的第三方库的呢?请看下面详情: 情况一: 1.首先打开Xcode,iOS->Application->Single View Application, 选Next. ...

  8. iOS实现简书的账号识别方式(正则表达式)

    通过简书iOS客户端登录,我们会看到请输入手机号或者邮箱登录,但是我们随机输入1234567的时候,便会弹出手机格式不正确,同样也会识别我们的邮箱格式,那么我们在项目中怎么实现这种判断呢? 0E471 ...

  9. 倒戈了,转投简书 -------->

    深情自白 还记得数月前那个月黑风高的晚上,笔主偶遇简书,被那婀娜多姿的Markdown输出深深吸引不能自拔,从此立下毒誓要两边同时发布.然而天有不测风云(这边的太丑),前思后想寝食难安之后作出决定,正 ...

随机推荐

  1. day 13

    递归函数   一.初始递归 递归函数:在一个函数里在调用这个函数本身. 递归的最大深度:998 正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去.但是我们之前已经说过关于函数调用的问题, ...

  2. python3 访问百度返回压缩格式

    import urllib, urllib.request, urllib.parse import random import zlib import re import os, time Save ...

  3. Mysql数据库主从复制搭建

    Mysql数据库主从复制原理: 主库开启bin-log日志,同时生成IO线程.IO线程负责将用户写入数据库的sql语句记录在二进制日志bin-log,该记录过程可并发进行:生成标识号 server i ...

  4. 将SQL for xml path('')中转义的字符正常显示

    在工作中出现的发送邮件的时候:因为邮件内容中有链接,并且多个拼接在一起的,于是用了for xml path().       但是,这样显示出来的链接时会将路径中的<,>,&符号转 ...

  5. 搜狗浏览器总是打开123.sogou.com-记搜狗浏览器遭遇劫持一例

    昨日,因从网上下载了office2010破解工具,压缩包中有个文件为名为[office 2010激活工具\为保证永久激活,要先点击这个配置,再点击KMSELDIYI激活.exe],单击之后没有反应.后 ...

  6. 学习 MeteoInfo二次开发教程(一)

    来自气象家园:http://bbs.06climate.com/forum.php?mod=viewthread&tid=6631 按照教程,没有太大问题,有些是对c#操作不熟悉导致. 1.添 ...

  7. dubbo 支持的7种协议

    建议看原文 转自:https://blog.csdn.net/xiaojin21cen/article/details/79834222  1.dubbo 协议 (默认) 2.rmi 协议 3.hes ...

  8. 《深入浅出 Java Concurrency》目录

    最近在学习J.U.C,看到一个大神 关于这个系列写的非常精辟,由于想做笔记,故系列转载并记录之. 原文:http://www.blogjava.net/xylz/archive/2010/07/08/ ...

  9. [持续交付实践] pipeline使用:快速入门

    什么是pipeline 先介绍下什么是Jenkins 2.0,Jenkins 2.0的精髓是Pipeline as Code,是帮助Jenkins实现CI到CD转变的重要角色.什么是Pipeline, ...

  10. 【函数】raise 函数(小窗help)

    在Python中,要想引发异常,最简单的形式就是输入关键字raise,后跟要引发的异常的名称. 异常名称标识出具体的类: Python异常处理是那些类的对象. 执行raise语句时,Python会创建 ...