在coding网站上通过视频学习laravel搭建博客系统,
里面有一个相对完善的案例,包括:
用户脚手架系统
博客系统(添加、删除、修改)
伪造数据
分页
时间显示
验证
把笔记整理如下。
视频网址在这里:http://www.coding10.com/course/laravel-5-5-essential
文章适合有WEB基础的LARAVEL零基础入门。
博客系统
(1)新建laravel命令行:laravel new blog。或者可以用laragon软件可以自动创建新的laravel应用,这个软件安装很傻瓜方便。
如果安装不成功参考这篇文章:https://blog.youkuaiyun.com/sxh6365966/article/details/78532575。主要是对国内镜像进行配置。
(2)建立数据库;配置连接数据库操作,在 .env文件中中
(3)用migrate建立用户表,建立用户脚手架系统。在命令行中运行
Php artisan migrate
Php artisan make:auth//脚手架系统
- 建立model和migration文件
Php artisan make:model Post -m//建立model文件和建立migration文件
或者
Php artisan make:model Post //建立model文件
php artisan make:migration create_posts_table --create=posts //建立migration文件
在表中增加对应字段。
然后生成表 php artisan migrate
(5)建立控制器
Php artisan make:controller PostController –resource
(6)创建路由
在web.php下创建
Route::resource(‘posts’,’PostController’);
(7)准备视图
利用bootstrap框架,打开bootcdn,复制bootstrap的CSS和JS文件,放进页面中。
建立posts文件夹,建立index,create,update,show .blade.php文件
传递数据
postController.php
public function index()
{
$posts= \App\Post::all();
return view('posts.index',compact('posts'));
}
index.blade.php
@foreach($posts as @$post)
{{$post->title }}
<hr/>
@endforeach
(8)伪造数据(测试用)
由于POST数据空,所以用factory先伪造数据
php artisan make:factory PostsFactory -m Post
在postsfactory下面建立数据
$factory->define(App\Post::class, function (Faker $faker) {
return [
'title'=>$faker->sentence,
'body'=>$faker->paragraph,
'published_at'=>\Carbon\Carbon::now(),
'author_id'=>1
];
然后在tinker下运行建立数据命令
factory(Post::class,20)->create()
(9)分页
postController.php中
public function index()
{
$posts= \App\Post::paginate(6);
return view('posts.index',compact('posts'));
}
在index.blade.php中
@section('content')
Posts Index Page
@foreach($posts as $post)
<div class="text-center">
{{$post->title}}
</div>
<hr/>
@endforeach
{{$posts->links()}}//分页
@endsection
(10)显示文章具体内容
Controller页面
public function show($id)
{
$post=Post::find($id);
return view('posts.show',compact('post'));
}
View页面
<div class="text-center h2">{{$post->title}}</div>
{{$post->body}}
(11)通过ID显示文章方法
a
public function show($id)
{
$post=Post::find($id);
if(!$post)
abort(404);
return view('posts.show',compact('post'));
}
b
$post=Post::findOrFail($id);
C简洁
public function show(Post $post)
{
return view('posts.show',compact('post'));
}
(12)通过其他字段显示内容
在model类里面复写一个函数,以user model类为例,复写
public function getRouteKeyName()
{
return 'name';
}
(13)链接显示方法
A
<a href="{{route('posts.show',$post->id)}}">
{{$post->title}}
</a>
B
<a href="{{ url('posts',$post->id) }}">
{{$post->title}}
</a>
C个人推荐URL方式
<a href="{{ url('posts/'.$post->id) }}">
{{$post->title}}
</a>
D这个方法不推荐,在语义表达上表达不明确
<a href="{{ action('PostController@show',$post->id) }}">
{{$post->title}}
</a>
(14)新建文章
A 建立view页面
b Control编写新建跳转代码
public function create()
{
return view('posts.create');
}
c Control页面编写保存代码
public function store(Request $request)
{
//return dd($request->all());
$datas=$request->all();
$datas['author_id']=Auth::id();//获取登录ID
dd(Post::create($datas));
return redirect('posts');
}
D 排序,在controll做
public function index()
{
$posts= \App\Post::latest()->paginate(6);//排序
return view('posts.index',compact('posts'));
}
E 在controller类中用middleware解决登录后的操作。此处是定义了除了index和show,其他都需要验证才能登录
class PostController extends Controller
{
public function _construct()
{
$this->middleware('auth')->except('index','show');
}
F表单验证
验证功能没有实现
(15)carbon
A 设置时间格式,添加的时候让时间中有具体细时钟时间,否则是00:00:00
class Post extends Model
{
protected $fillable=['title','body','published_at','author_id'];
public function setPublishedAtAttribute($date)//如果是设置其他字段中间大小写改变setTitleAttribute
{
$this->attributes['published_at']=Carbon::createFromFormat('Y-m-d',$date);
}
}
b 显示小于当前的时间的文章列表,在controller里面
public function index()
{
$posts= \App\Post::where('published_at','<',Carbon::now())->latest()->paginate(6);
return view('posts.index',compact('posts'));
}
c 显示时间改变为:一天前这种时间格式
在post model里面修改。改变published_at时间格式为Carbon,否则显示调用的时候会报错。
class Post extends Model
protected $dates=['published_at'];//这个数组就是Carbon类型
Index.blade.php
<div>{{$post->published_at->diffForHumans()}}</div>
D 显示时间中文
在启动栏设置为中文
在providers/AppServiceProvider.php页面中
public function boot()
{
Carbon::setLocale('zh');
}
(16)验证
A
在controll页面添加验证
public function store(Request $request)
{
$request->validate([
'title'=>'required|min:5|max:20',
'body'=>'required|min:30',
'published_at'=>'required|date'
]);
在view页面修改显示效果
@if(count($errors)>0)
<div class="alert alert-danger">
<ul>
@foreach($errors->all() as $error)
<li>{{$error}}</li>
@endforeach
</ul>
</div>
@endif
还可以对email进行唯一性验证:unique即可。
B
还可以用另外一种方法,对request进行重新定义,在里面写规则
建立request文件,命令:php artisan make:request BlogCreateRequest
BlogCreateRequest.php
public function rules()
{
return [
'title'=>'required|min:5|max:20',
'body'=>'required|min:30',
'published_at'=>'required|date'
];
}
public function authorize()
{
return true;
}
postController文件
public function store(BlogCreateRequest $request)
c
验证中文化
把reshources/lang/en文件夹复制,粘贴名字改为zh
修改validation.php文件,把对应项修改为中文,如
'required' => 'The :attribute field is required.',
修改为
'required' => ':attribute 字段不能为空.',
其中 :attribute是会自动转换为对应的字段,如title,body
然后在设置的app.php,中,把本地化设置为中文才行
'locale' => 'zh'
我的理解是链接到zh文件夹
显示结果为:
Title不能为空
这个结果title还是英文,要修改为中文才行
解决方案1
在validation.php中修改attributes
'attributes' => [
'title'=>'标题',
'body'=>'内容'
],
解决方案2,还是在validation中
'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
],
'title'=>[
'required'=>'标题不能为空',
'min'=>'长度不能小于 :min个'
]
],
这两个操作要把之前的required复原
更多具体的看官方文档
(17)更新文章
View页面编写edit.blade.php
<form action="{{route('posts.update',$post->id)}}" method="post">
<input type="hidden" name="_method" value="PUT" />
value="{{$post->title}}"
时间格式转换为string格式
value="{{$post->published_at->toDateString()}}"
更新文章入口链接,show.blade.php
<div class="text-left"><a href="{{route('posts.edit',$post->id)}}">编辑文章</a></div>
Controll层
Edit方法
public function edit(Post $post)
{
return view("posts.edit",compact('post'));
}
update方法
public function update(Request $request, Post $post)
{
$post->update($request->all());
return redirect(url('posts',$post->id));
}
(18)删除文章
View页面
<div class="text-right">
<form action="{{route('posts.destroy',$post->id)}}" method="post">
<input type="hidden" name="_method" value="DELETE"/>
{{csrf_field()}}
<div class="form-group">
<button type="submit">删除</button>
</div>
</form>
Controll层
public function destroy(Post $post)
{
$post->delete();
return redirect('posts');
}
10其他
调式,在浏览器显示调试信息:
Route::get('users/{user}',function(\App\User $user){
dd($user);
});
显示form中请求的信息
public function store(Request $request)
{
return dd($request->all());
}
设置时区(中国)
Config->app->timezone=’PRC’
controll重新定位地址
return redirect(url('posts',$post->id));
常用网站
BOOTCDN前端的开源框架
Php storm使用技巧
Ctrl+shift+n 查找文件