视图模板
index.blade.php
{!! Form::open(['url'=>'/articles']) !!} //指定文章上传路由
<div class="form-group"> //添加样式
{!! Form::label('title')!!}
{!! Form::text('title',null,['class'=>'form-control',‘id'=>3])!!} //添加样式,也可传参。
</div>
<!--- content Field --->
<div class="form-group">
{!! Form::label('content', 'content:') !!}
{!! Form::textarea('content', null, ['class' => 'form-control']) !!}
</div>
<!--- published_at Field --->
<div class="form-group">
{!! Form::label('published_at', ':') !!}
{!! Form::input('date','published_at', date('Y-m-d'), ['class' => 'form-control']) !!}
</div>
{!! Form::submit('发表文章',['class'=>btn btn-primary form-control'])!!}
{!! Form::close()!!}
//将错误内容输出
@if($errors->any())
<ul class="list-group">
@foreach($errors->all() as $error)
<li class="list-group-item list-group-item-danger">{{ $error }}</li>
@endforeach
</ul>
@endif
路由
Route::get('/articles','ArticlesController@index');
Route::get('/articles/create','ArticlesController@create');
Route::get('/articles/{id}','ArticlesController@show');
Route::post('/articles','ArticlesController@store');
控制器
ArticlesController.php
public function index()
{
//$articles=Article::latest()->where('published_at','<=',Carbon::now())->get(); latest()方法使最新发布的文章排在最上面,where('published_at','<=',Carbon::now())的作用是使未来时间的内容不能再页面上显示
$articles=Article::latest()->published()->get(); //latest()方法使最新发布的文章排在最上面,published()是调用了数据库Article的一个成员方法
return view('articles.index',compact('articles'));
}
public function show($id)
{
$article=Article::findorFail($id)
//关于Carbon的应用
//使用下段代码可以输出关于15 minute ago
//dd($artcle->created_at->diffForHumans())
//如果使用published_at,则会报错call to a member function diffForHumans() on string,因为Carbon对象默认处理的不是pubished_at
//则需要再数据库Article中输入一段代码 protected $dates=['published_at']
//dd($artcle->published_at->diffForHumans())
return view('article.show',compact('article'));
}
public function create($id)
{
return view('article.create');
}
//public function store(Request $request)
//修改成可以使用Requests的实例化应用,变量$request是Requests\CreateArticleRequest对象的实例化
//lavarel会将全部的数据进行Requests\CreateArticleRequest规则验证,如果提交的代码没有通过Requests\CreateArticleRequest这项规则的话,下面的方法是不会调用的。
public function store(Requests\CreateArticleRequest $request)
{
//打印全部获取的数据
//dd($request->all());
//获取某一字段的值,如获取文章的title的值
//$request->get('title');
//1 接受post传过来的数据
//2 存入数据库
//3 重定向
//$input=$request->all()
//$input['published_at']=carbon::now();
//Article::create($input); 创建字段时,laravel会自动过滤掉token值
//return view('articles/');
Article::create($request->all());
return redirect('/articles')
}
注:表单中自动生成的 _token 提交到后台如何过滤掉?
$input = $request->only(['username', 'password']); //填写你需要写入DB的字段
$input = $request->only('username', 'password'); //同上
$input = $request->except(['_token']); //去除某一字段, 如这的_token
$input = $request->except('_token'); //同上
数据库模型
class Article extends Model
{
protected $fillable=['title','content','published_at'];
//将published_at设置成Carbon对象处理的时间字段
protected $dates=['published_at']
//setTitleAttribute,这段代码的作用是:在写入数据库之前,会先转换成Carbon设置的时间格式,然后再写出数据库当中。
public function setPublicedAtAttribute($date)
{
$this->attributes['published_at']=Carbon::createFromFormat('Y-m-d',$date);
}
//查询不超过目前时间的文章内容,以供控制器中的调用
//scope是关键词开始,后面的Published是方法名字
public function scopePublished($query)
{
$query->where('published_at'.'<=',Carbon::now());
}
}
验证规则
创建规则文件
php artisan make:request createArticleRequest
该文件本创建再\App\Http\Requests文件夹中CreateArticleRequest.php
打开该文件。
//该方法可用于A发表的文章不能由B来编辑
public function authorize()
{
//return false
//将false改为true,true表示任何人都可以将表单提交过来
return true;
}
public function rules()
{
return [
//设置规则,如果多个规则的话,用|分割
'title'=>'required',//email min:3等
'content'=>'required',
'published_at'=>'required'
];
}
第二种规则验证方案
public function store(Request $request)
{
$this->validate($request,[
'title'=>'requested',
'content'=>'requested',
'published_at'=>'required']);
Article::create($request->all());
return redirect('/articles')
}
第三种验证规则
public function store()
{
//添加分类提交
$input = Input::except('_token');
$rules = [
'nav_name' => 'required',
'nav_url' => 'required',
];
$message = [
'nav_name.required' => '自定义导航名称不能为空!',
'nav_url.required' => '自定义导航url名称不能为空!',
];
$validator = Validator::make($input, $rules, $message);
if ($validator->passes()) {
$re = Navs::create($input);
if ($re) {
return redirect('admin/navs');
} else {
return back()->with('errors', '自定义导航填充失败,请稍后重试!');
}
} else {
return back()->withErrors($validator);
}
}
编辑(创建资源路由,控制器)
创建一个资源路由
Route::resource('articles','ArticlesController');
创建一个对应的控制器
public function edit($id)
{
$article=Article::findorFail($id)
return view('article.edit',compact('article'));
}
public function update(Requests\CreateArticleRequest $request,$id)
{
$article=Article::findorFail($id)
$article->update($request->all());
return redirect('/articles')
}
编辑视图内容
//通过路由中的$article=Articles::findorfail($id),已经获取了文章信息,在通过Form::model绑定,就可以直接在编辑页面自动填充字段相关的已有信息
{!! Form::model($article,['method'=>'PATCH','url'=>'/articles'.$article->id]) !!}
<div class="form-group"> //添加样式
{!! Form::label('title')!!}
{!! Form::text('title',null,['class'=>'form-control',‘id'=>3])!!} //添加样式,也可传参。
</div>
<!--- content Field --->
<div class="form-group">
{!! Form::label('content', 'content:') !!}
{!! Form::textarea('content', null, ['class' => 'form-control']) !!}
</div>
<!--- published_at Field --->
<div class="form-group">
{!! Form::label('published_at', ':') !!}
{!! Form::input('date','published_at', date('Y-m-d'), ['class' => 'form-control']) !!}
</div>
{!! Form::submit('发表文章',['class'=>btn btn-primary form-control'])!!}
{!! Form::close()!!}
//将错误内容输出
@if($errors->any())
<ul class="list-group">
@foreach($errors->all() as $error)
<li class="list-group-item list-group-item-danger">{{ $error }}</li>
@endforeach
</ul>
@endif
1)在视图Views中,@include(‘/’)默认根目录是Views
2)视图中的内容可以优化,通过@include来整合代码
3)可以在Requests\CreateArticleRequest中通过 if、switch 等判断语句进行不同条件下的信息验证,例如写文章的验证信息,编辑文章的验证信息。也可以是注册,修改等信息验证。
https://laravelcollective.com/docs/5.4/html