在Laravel 5中,如何将数据传递到FormRequest类中?
背景
我试图验证一个来自HTML select元素的get变量。
我是通过子类FormRequest和添加到规则数组来做到这一点的。为了保持干燥,我想从文件列表中动态构建这个验证规则。
将这个列表传递到FileFormRequest的最佳方法是什么?
app/Http/Controller/UploadController.php(请原谅公共财产)
<?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
<?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;
}
}发布于 2015-10-09 13:57:35
好的,我是通过
守则是:
app/Contracts/Utilities/UploadFilesContract.php -创建接口
<?php
namespace App\Contracts\Utilities;
interface UploadFilesContract {
public function __construct($dir);
public function getDir();
public function getFilesBasenames();
}app/U实用程序/UploadFiles.php-创建具有清单功能的类
<?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 -将接口绑定到类的一个实例
<?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-在构造函数中插入上传的文件接口
<?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 -在构造函数中注入上传的文件接口
<?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 -注册提供程序
<?php
// ...
'providers' => [
// ...
App\Providers\UploadFilesServiceProvider::class,
],
// ...发布于 2015-10-08 16:35:45
你可以试试这个:
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方法从请求中获取输入,例如:
protected function getRequestInput()
{
$files = app('request')->get('form_field_name');
// Process it here and finally return, i.e:
return $files; // array
}因此,您现在可以从rules方法中调用该方法,如下所示:
$files = $this->getRequestInput();https://stackoverflow.com/questions/33017721
复制相似问题