首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Laravel 5中将数据传送到FormRequest

在Laravel 5中将数据传送到FormRequest
EN

Stack Overflow用户
提问于 2015-10-08 13:48:27
回答 2查看 3.4K关注 0票数 0

在Laravel 5中,如何将数据传递到FormRequest类中?

背景

我试图验证一个来自HTML select元素的get变量。

我是通过子类FormRequest和添加到规则数组来做到这一点的。为了保持干燥,我想从文件列表中动态构建这个验证规则。

将这个列表传递到FileFormRequest的最佳方法是什么?

app/Http/Controller/UploadController.php(请原谅公共财产)

代码语言:javascript
复制
<?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/Request/FileFormRequest.php

代码语言:javascript
复制
<?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;
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-09 13:57:35

好的,我是通过

  • 将上传文件列表功能移到实用程序接口和类中
  • 使用服务提供程序将实用程序类的实例公开为服务
  • 将服务注入控制器和FormRequest类

守则是:

app/Contracts/Utilities/UploadFilesContract.php -创建接口

代码语言:javascript
复制
<?php

namespace App\Contracts\Utilities;

interface UploadFilesContract {

    public function __construct($dir);

    public function getDir();

    public function getFilesBasenames();

}

app/U实用程序/UploadFiles.php-创建具有清单功能的类

代码语言:javascript
复制
<?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 -将接口绑定到类的一个实例

代码语言:javascript
复制
<?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/Controller/UploadController.php-在构造函数中插入上传的文件接口

代码语言:javascript
复制
<?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 -在构造函数中注入上传的文件接口

代码语言:javascript
复制
<?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 -注册提供程序

代码语言:javascript
复制
<?php

// ...

'providers' => [

    // ...

    App\Providers\UploadFilesServiceProvider::class,

],

// ...
票数 0
EN

Stack Overflow用户

发布于 2015-10-08 16:35:45

你可以试试这个:

代码语言:javascript
复制
public function rules()
{
    // Get the REQUEST (GET/POST) variable
    $files = app('request')->get('form_field_name');

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

}

如果form_field_name不是数组,那么根据它包含的值将它变成一个数组。此外,如果需要大量代码,可以创建另一个protected方法从请求中获取输入,例如:

代码语言:javascript
复制
protected function getRequestInput()
{
    $files = app('request')->get('form_field_name');

    // Process it here and finally return, i.e:
    return $files; // array
}

因此,您现在可以从rules方法中调用该方法,如下所示:

代码语言:javascript
复制
$files = $this->getRequestInput();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33017721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档