zoukankan      html  css  js  c++  java
  • Laravel 5.8 做个知乎 4 ——发布问题 与 以依赖注入的方式验证表单字段

     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

    <?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)
        {
            //
        }
    }
    View Code

    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

    @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 模型

    appQuestion.php

    <?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';
        }
    }
    View Code

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

    php artisan make:request StoreQuestionRequest

    appHttpRequestsStoreQuestionRequest.php

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

    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]);
        }

  • 相关阅读:
    常见的分布
    ubuntu16.04获取root权限并用root用户登录
    神经网络与深度学习邱锡鹏学习笔记16多项式回归
    什么是公版显卡,什么是非公版显卡
    高考电子监控揭秘
    买了个2手睡袋
    HTML
    又是一天
    我也想去看珠峰
    Qt 主界面菜单栏和状态栏实现
  • 原文地址:https://www.cnblogs.com/polax/p/14887802.html
Copyright © 2011-2022 走看看