laravel简书(2)
用户注册
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)的更多相关文章
- laravel简书(1)
Laravel的社区生态 中文社区(http://laravel-china.org) 5.4中文文档(http://d.laravel-china.org/docs/5.4) Laravel源码地址 ...
- Laravel 5.4 快速开发简书:
Laravel 5.4 快速开发简书第1章 课程介绍 介绍课程的大体脉络和课程安排 第2章 Laravel 5.4介绍 本节课会带领大家介绍laravel的各个版本历史以及讨论php框架的未来发展趋势 ...
- iOS离屏渲染简书
更详细地址https://zsisme.gitbooks.io/ios-/content/chapter15/offscreen-rendering.html(包含了核心动画) GPU渲染机制: CP ...
- openlayers 3 简书
1. 简书http://www.jianshu.com/p/6785e755fa0d 2. 文档 http://anzhihun.coding.me/ol3-primer/ch03/03-02.htm ...
- Python 2.7_发送简书关注的专题作者最新一篇文章及连接到邮件_20161218
最近看简书文章关注了几个专题作者,写的文章都不错,对爬虫和数据分析都写的挺好,因此想到能不能获取最新的文章推送到Ipad网易邮箱大师.邮件发送代码封装成一个函数,从廖雪峰大神那里学的 http:// ...
- 从刚刚「简书」平台的短暂异常,谈Nginx An error occurred报错~
09.26简书平台的短暂异常 An error occurred. Sorry, the page you are looking for is currently unavailable. Plea ...
- swift调用oc语言文件,第三方库文件或者自己创建的oc文件——简书作者
Swift是怎样调用OC的第三方库的呢?请看下面详情: 情况一: 1.首先打开Xcode,iOS->Application->Single View Application, 选Next. ...
- iOS实现简书的账号识别方式(正则表达式)
通过简书iOS客户端登录,我们会看到请输入手机号或者邮箱登录,但是我们随机输入1234567的时候,便会弹出手机格式不正确,同样也会识别我们的邮箱格式,那么我们在项目中怎么实现这种判断呢? 0E471 ...
- 倒戈了,转投简书 -------->
深情自白 还记得数月前那个月黑风高的晚上,笔主偶遇简书,被那婀娜多姿的Markdown输出深深吸引不能自拔,从此立下毒誓要两边同时发布.然而天有不测风云(这边的太丑),前思后想寝食难安之后作出决定,正 ...
随机推荐
- liunx学习笔记(一:常用命令)
linux: 在学习linux之前我们应该多少了解windows的一些相关操作,linux也就是类似windows的另一种操作系统,用来管理软硬件的一种应用.在windows下你可以通过鼠标点击相关的 ...
- Android 动态注册JNI函数
1.JNI函数注册方式 在Android开发中,由于种种原因我们需要调用C/C++代码,在这个时候我们就需要使用jni了, jni在使用时要对定义的函数进行注册,这样java才能通过native关键字 ...
- Flask--(项目准备)--添加日志
日志:记录程序运行的状态,在manage.py同级目录下创建logs文件夹 定义日志文件: import logging from logging.handlers import RotatingFi ...
- 彻底放弃没落的MFC,对新人的忠告!--吃瓜群众围观撕逼
http://bbs.csdn.net/topics/391817496 完全没想到10多年后还有人纠结要不要学MFC,我花点时间给新人们一个总结. 第1种观点 学习完MFC,你会更理解编程的思想,再 ...
- Django中media的配置
Django中media的配置 Django中media文件夹是我们文件(比如头像.文件.视频等)数据十分重要的存放处,这里以用户头像的上传以及media文件的访问为例为大家详细讲解下media的相关 ...
- 网络之TCP握手总结
目录: 31.Tcp握手的一些问题? 21.Tcp三次握手及SYN攻击: 四次握手? 为什么建立连接是三次握手,而关闭连接却是四次挥手? 13.TCP释放连接四次握手 12.TCP建立连接三次握手 1 ...
- [UE4]字体材质
一.准备好一个字体文件,直接拖放到内容浏览器 二.创建一个名为testFontMaterial的UserWidget,添加一个TextBlock到默认的CanvasPanel.Font Family: ...
- (Android第一行代码实验一)活动的最佳实践
活动的最佳实践 1.知晓当前是在哪一个活动 这个技巧将教会你,如何根据程序当前的界面就能判断出这是哪一个活动. 首先需要新建一个 BaseActivity 继承自 Activi ...
- C# 操作符 << 与 >>
1.<< 左移操作符: 左移操作符,将第一个操作数向左移动第二个操作数指定的位数,空出的位置补0.左移相当于乘. 左移一位相当于乘2;左移两位相当于乘4;左移三位相当于乘8. 如:x< ...
- java并发等待条件的实现原理(Condition)
本篇继续学习AQS中的另外一个内容-Condition.想必学过java的都知道Object.wait和Object.notify,同时也应该知晓这两个方法的使用离不开synchronized关键字. ...