小白兔晒黑了

导航

 

 1 设计问题表

php artisan make:model Question -m

\database\migrations\2021_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"

\config\app.php

'providers' => [
     Overtrue\LaravelUEditor\UEditorServiceProvider::class,
],

发布配置文件与资源

php artisan vendor:publish

Copied File [\vendor\overtrue\laravel-ueditor\src\config\ueditor.php] To [\config\ueditor.php]
Copied Directory [\vendor\overtrue\laravel-ueditor\src\assets\ueditor] To [\public\vendor\ueditor]
Copied Directory [\vendor\overtrue\laravel-ueditor\src\views] To [\resources\views\vendor\ueditor]
Copied Directory [\vendor\overtrue\laravel-ueditor\src\translations] To [\resources\lang\vendor\ueditor]
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

\app\Http\Controllers\QuestionsController.php

<?php

namespace App\Http\Controllers;

use App\Question;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class QuestionsController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
        return 'index';
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
        return view('questions.create');
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    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 \Illuminate\Http\Response
     */
    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 \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}
View Code

2.2.2  路由

\routes\web.php

Route::resource('questions','QuestionsController',[
  'names'=>[
      'create'  =>'question.create',
      'show'    =>'question.show'
  ]
]);

 

php artisan route:list

2.2.3 模板

\resources\views\questions\create.blade.php

@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
View Code

2.2.4 模型

\app\Question.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Question extends Model
{
    //fillable为白名单,表示该字段可被批量赋值;guarded为黑名单,表示该字段不可被批量赋值。
    protected $fillable = ['title','body','user_id'];
    
    public function isHidden()
    {
        return $this->is_hidden === 'T';
    }
}
View Code

3 以依赖注入的方式验证表单字段

php artisan make:request StoreQuestionRequest

\app\Http\Requests\StoreQuestionRequest.php

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

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个字符' ,
        ];
    }
}
View Code

\app\Http\Controllers\QuestionsController.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]);
    }

 

posted on 2021-06-16 01:20  小白兔晒黑了  阅读(62)  评论(0编辑  收藏  举报