1 设计问题表
php artisan make:model Question -m
databasemigrations2021_06_17_205244_create_questions_table.php
public function up() { Schema::create('questions', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('title'); $table->text('body'); $table->integer('user_id')->unsigned(); $table->integer('comments_count')->default(0);//评论数 $table->integer('followers_count')->default(1);//关注数 $table->integer('answers_count')->default(0);//回答数 $table->string('close_comment',8)->default("F"); $table->string('is_hidden',8)->default("F"); $table->timestamps(); }); }
php artisan migrate
2 发布问题
2.1 安装编辑器
https://github.com/overtrue/laravel-ueditor
composer require "overtrue/laravel-ueditor:~1.0"
configapp.php
'providers' => [ OvertrueLaravelUEditorUEditorServiceProvider::class, ],
发布配置文件与资源
php artisan vendor:publish
Copied File [vendorovertruelaravel-ueditorsrcconfigueditor.php] To [configueditor.php]
Copied Directory [vendorovertruelaravel-ueditorsrcassetsueditor] To [publicvendorueditor]
Copied Directory [vendorovertruelaravel-ueditorsrcviews] To [
esourcesviewsvendorueditor]
Copied Directory [vendorovertruelaravel-ueditorsrc ranslations] To [
esourceslangvendorueditor]
Publishing complete.
.env
APP_URL=http://test.zhihu.test
laravel5.4以上需执行
php artisan storage:link
2.2 代码
2.2.1 控制器
php artisan make:controller QuestionsController --resource
appHttpControllersQuestionsController.php
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?php namespace AppHttpControllers; use AppQuestion; use IlluminateHttpRequest; use IlluminateSupportFacadesAuth; class QuestionsController extends Controller { /** * Display a listing of the resource. * * @return IlluminateHttpResponse */ public function index() { // return 'index'; } /** * Show the form for creating a new resource. * * @return IlluminateHttpResponse */ public function create() { // return view('questions.create'); } /** * Store a newly created resource in storage. * * @param IlluminateHttpRequest $request * @return IlluminateHttpResponse */ public function store(Request $request) { $rules = [ 'title' =>'required|min:6|max:196', 'body' =>'required|min:20', ]; $message = [ 'body.required'=>'内容不得为空' , 'body.min'=>'内容不得少于20个字符' , ]; //自动过滤掉token值 $this->validate($request,$rules,$message); $data = $request->all(); $save = [ 'title' =>$data['title'], 'body' =>$data['body'], 'user_id' =>Auth::id() ]; $rs = Question::create($save); return redirect()->route('question.show',[$rs->id]); } /** * Display the specified resource. * * @param int $id * @return IlluminateHttpResponse */ public function show($id) { // $question = Question::find($id); return view('questions.show',compact('question')); } /** * Show the form for editing the specified resource. * * @param int $id * @return IlluminateHttpResponse */ public function edit($id) { // } /** * Update the specified resource in storage. * * @param IlluminateHttpRequest $request * @param int $id * @return IlluminateHttpResponse */ public function update(Request $request, $id) { // } /** * Remove the specified resource from storage. * * @param int $id * @return IlluminateHttpResponse */ public function destroy($id) { // } }
2.2.2 路由
outesweb.php
Route::resource('questions','QuestionsController',[ 'names'=>[ 'create' =>'question.create', 'show' =>'question.show' ] ]);
php artisan route:list
2.2.3 模板
esourcesviewsquestionscreate.blade.php
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
@extends('layouts.app') @section('content') @include('vendor.ueditor.assets') <div class="container"> <div class="row justify-content-center"> <div class="col-md-8 col-md-offset-2"> <div class="card"> <div class="card-header">发布问题</div> <div class="card-body"> <form action="/questions" method="post"> {!! csrf_field() !!} <div class="form-group"> <label for="title"><h5>标题 </h5> </label> <input id="title" type="text" name="title" class="form-control @error('title') is-invalid @enderror" placeholder="标题" value="{{ old('title') }}"> @if($errors->has('title')) <div class="alert alert-danger"> <ul> <li>{{ $errors->first('title') }}</li> </ul> </div> @endif @if ($errors->any()) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif </div> <!--text/plain的意思是将文件设置为纯文本的形式,浏览器在获取到这种文件时并不会对其进行处理--> <!-- 转义 {{ old('body') }} --> <!-- 非转义 {!! old('body') !!} --> <script id="container" name="body" type="text/plain" > {!! old('body') !!} </script> <button class="btn btn-success pull-right" type="submit">发布问题</button> </form> </div> </div> </div> </div> </div> <!-- 实例化编辑器 --> <script type="text/javascript"> var ue = UE.getEditor('container'); ue.ready(function() { ue.execCommand('serverparam', '_token', '{{ csrf_token() }}'); // 设置 CSRF token. }); </script> <!-- 编辑器容器 --> <script id="container" name="content" type="text/plain"></script> @endsection
2.2.4 模型
appQuestion.php
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?php namespace App; use IlluminateDatabaseEloquentModel; class Question extends Model { //fillable为白名单,表示该字段可被批量赋值;guarded为黑名单,表示该字段不可被批量赋值。 protected $fillable = ['title','body','user_id']; public function isHidden() { return $this->is_hidden === 'T'; } }
3 以依赖注入的方式验证表单字段
php artisan make:request StoreQuestionRequest
appHttpRequestsStoreQuestionRequest.php
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?php namespace AppHttpRequests; use IlluminateFoundationHttpFormRequest; class StoreQuestionRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { //是否需要验证 //return false; return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'title' =>'required|min:6|max:196', 'body' =>'required|min:20', ]; } public function messages() { return [ 'body.required'=>'内容不得为空' , 'body.min'=>'内容不得少于20个字符' , ]; } }
appHttpControllersQuestionsController.php
//public function store(Request $request) public function store(StoreQuestionRequest $request) { /*$rules = [ 'title' =>'required|min:6|max:196', 'body' =>'required|min:20', ];*/ /*$message = [ 'body.required'=>'内容不得为空' , 'body.min'=>'内容不得少于20个字符' , ];*/ //自动过滤掉token值 //$this->validate($request,$rules,$message); $data = $request->all(); $save = [ 'title' =>$data['title'], 'body' =>$data['body'], 'user_id' =>Auth::id() ]; $rs = Question::create($save); return redirect()->route('question.show',[$rs->id]); }