好的,我解决了这个问题
- 将上传文件列表功能移动到实用程序界面和类中
- 使用服务提供者将实用程序类的实例公开为服务
- 将服务注入到 Controller 和 FormRequest 类中
代码是:
app/Contracts/Utilities/UploadFilesContract.php - 创建界面
<?php
namespace App\Contracts\Utilities;
interface UploadFilesContract {
public function __construct($dir);
public function getDir();
public function getFilesBasenames();
}
app/Utilities/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/Controllers/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,
],
// ...