duanqiang3925 2015-10-08 13:48
浏览 31
已采纳

将数据传递到Laravel 5中的FormRequest

In Laravel 5 how do you pass data into the FormRequest class?

Background

I am attempting to validate a get variable that comes from a HTML select element.

I am doing this by subclassing FormRequest and adding to the rules array. I would like to build this validation rule dynamically from the list of files to stay DRY.

What is the best way to pass this list into FileFormRequest?

app/Http/Controllers/UploadController.php (please excuse the public property)

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Requests\FileFormRequest;
use App\Http\Controllers\Controller;
use File;

class UploadController extends Controller
{

    public $files = [];

    public function get(FileFormRequest $request)
    {
        $files_dir = storage_path('app').'/spreadsheets';
        foreach (File::allFiles($files_dir) as $file) {
            $file = $file->getBasename();
            $this->files[$file] = $file;
        }

        return view('main', array(
            'title' => '',
            'file_names' => $this->files,
            'file_name' => '',
            'sheet_name' => '',
            'encoding' => 'UTF-8'
        ));
    }

}

app/Http/Requests/FileFormRequest.php

<?php namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Response;

class FileFormRequest extends FormRequest
{

    public function rules()
    {
        // What goes here in place of the empty array?
        $files = implode(',', []);

        return [
            'file_name' => 'sometimes|required|in:'.$files,
        ];

    }

    public function authorize()
    {
        return true;
    }
}
  • 写回答

2条回答 默认 最新

  • douhong9210 2015-10-09 13:57
    关注

    OK I solved this by

    • moving the upload file listing functionality into a utility interface and class
    • using a service provider to expose an instance of the utility class as a service
    • injecting the service into both the Controller and FormRequest classes

    Code was:

    app/Contracts/Utilities/UploadFilesContract.php - create the interface

    <?php
    
    namespace App\Contracts\Utilities;
    
    interface UploadFilesContract {
    
        public function __construct($dir);
    
        public function getDir();
    
        public function getFilesBasenames();
    
    }
    

    app/Utilities/UploadFiles.php - create the class with the listing functionality

    <?php
    
    namespace App\Utilities;
    
    use Illuminate\Support\Facades\File;
    use App\Contracts\Utilities\UploadFilesContract;
    
    class UploadFiles implements UploadFilesContract {
    
        private $dir;
        private $files;
    
        public function __construct($dir = '')
        {
            $this->dir = storage_path('app').(0 < strlen($dir) ?  '/'.$dir : '');
            $this->files = File::allFiles($this->dir);
        }
    
        public function getDir()
        {
            return $this->dir;
        }
    
        public function getFilesBasenames()
        {
            $files = [];
            foreach ($this->files as $file) {
                $file = $file->getBasename();
                $files[$file] = $file;
            }
            return $files;
        }
    
    }
    

    app/Providers/UploadFilesServiceProvider.php - bind the interface to an instance of the class

    <?php
    
    namespace App\Providers;
    
    use Illuminate\Support\ServiceProvider;
    use App\Utilities\UploadFiles;
    
    class UploadFilesServiceProvider extends ServiceProvider
    {
        protected $defer = true;
    
        /**
         * Bootstrap the application services.
         *
         * @return void
         */
        public function boot()
        {
        }
    
        /**
         * Register the application services.
         *
         * @return void
         */
        public function register()
        {
            $this->app->bindShared('App\Contracts\Utilities\UploadFilesContract', function($app) {
                return new UploadFiles('spreadsheets');
            });
        }
    
        public function provides()
        {
            return ['App\Utilities\UploadFiles'];
        }
    }
    

    app/Http/Controllers/UploadController.php - inject the uploaded files interface in the constructor

    <?php
    
    namespace App\Http\Controllers;
    
    use Illuminate\Http\Request;
    use App\Http\Requests;
    use App\Http\Requests\FileFormRequest;
    use App\Contracts\Utilities\UploadFilesContract;
    
    class UploadController extends Controller
    {
    
        private $upload_files;
    
        public function __construct(UploadFilesContract $upload_files) {
            $this->upload_files = $upload_files;
        }
    
        public function get(FileFormRequest $request)
        {   
            return view('main', array(
                'title' => '',
                'file_names' => $this->upload_files->getFilesBasenames(),
                'file_name' => '',
                'sheet_name' => '',
                'encoding' => 'UTF-8'
            ));
        }
    
    }
    

    app/Http/Requests/FileFormRequest.php - inject the uploaded files interface in the constructor

    <?php namespace App\Http\Requests;
    
    use Illuminate\Foundation\Http\FormRequest;
    use App\Contracts\Utilities\UploadFilesContract;
    
    class FileFormRequest extends FormRequest
    {
        private $upload_files;
    
        public function __construct(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null, UploadFilesContract $upload_files)
        {
            parent::__construct($query, $request, $attributes, $cookies, $files, $server, $content);
            $this->upload_files = $upload_files;
        }
    
        /**
         * @return array
         */
        public function rules()
        {
            $files = implode(',', $this->upload_files->getFilesBasenames());
    
            $rules = [
                'file_name' => 'sometimes|required|in:'.$files,
            ];
    
            return $rules;
        }
    
        /**
         * @return bool
         */
        public function authorize()
        {
            return true;
        }
    }
    

    config/app.php - register the provider

    <?php
    
    // ...
    
    'providers' => [
    
        // ...
    
        App\Providers\UploadFilesServiceProvider::class,
    
    ],
    
    // ...
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计