Illuminate\Contracts\Filesystem\Factory 不可实例化

Illuminate\Contracts\Filesystem\Factory is not instantiable

我尝试使用 laravel 的独立组件。在这种情况下,我尝试使用 illuminate/http。除了上传后文件保存抛出异常外,它工作正常。

( ! ) Fatal error: Uncaught Illuminate\Contracts\Container\BindingResolutionException: Target [Illuminate\Contracts\Filesystem\Factory] is not instantiable. in /var/www/vendor/illuminate/container/Container.php on line 978
( ! ) Illuminate\Contracts\Container\BindingResolutionException: Target [Illuminate\Contracts\Filesystem\Factory] is not instantiable. in /var/www/vendor/illuminate/container/Container.php on line 978

这是我的自举:

use Illuminate\Http\Request;

/** @var Request $request */
$request = new Request(
    $_GET,
    $_POST,
    [],
    $_COOKIE,
    $_FILES,
    $_SERVER
);

这是我尝试在本地存储中存储表单 post 文件的部分:

$request->image->store(APP_PUBLIC.'resources/assets/images/homepage/slider/test.jpg');

我试图将 Illuminate\Filesystem\Filesystem() as Factory 注入到 Reqest 对象中,但它似乎不起作用。

如何将文件系统工厂注入到 HTTP 组件中?

我通过正确添加必要的工厂、配置并注册它们来修复它。

composer.json

{
    "require": {
        "illuminate/validation": "^6.16",
        "illuminate/filesystem": "^6.16",
        "illuminate/translation": "^6.16",
        "illuminate/http": "^6.16",
        "illuminate/config": "^6.16",
        "jenssegers/blade": "^1.2",
        "league/flysystem": "^1.0"
    },
}

引导文件管理器:

use Illuminate\Container\Container;
use Illuminate\Contracts\Filesystem\Factory as FilesystemFactory;
use Illuminate\Http\Request;
use Illuminate\Filesystem\FilesystemManager;
use Illuminate\Config\Repository;

$instance = Container::getInstance();
$instance->bind('config', function () use ($instance) {
    return new Repository([
        'filesystems' => [
            'default' => 'local',
            'disks' => [
                'local' =>[
                    'driver' => 'local',
                    'root' => '/absolut/path/to/upload/dir/,
                ]
            ]
        ]
    ]);
});

$instance->bind(FilesystemFactory::class, function () use ($instance) {
    return new FilesystemManager($instance);
});

/** @var Request $request */
$request = new Request(
    $_GET,
    $_POST,
    [],
    $_COOKIE,
    $_FILES,
    $_SERVER
);

可能是使用 Illuminate\Filesystem\Filesystem::move() 方法或其他方法将文件保存在磁盘上的最简单方法,当一个人正在使用独立的 Illuminate\Http\Request 组件并希望使用文件系统时。请看下面的代码:

<?php

use Illuminate\Http\Request;
use Illuminate\Filesystem\Filesystem;

// Bootstraps request object
$request = new Request(
    $_GET,
    $_POST,
    [],
    $_COOKIE,
    $_FILES,
    $_SERVER
);


// Illuminate\Http\UploadedFile is available on $request->image
$path = $request->image->path();
$extension = $request->image->extension();

// Don't use destination thus. It's for demonstration purpose only
// Make sure upload directory is writable         
$destination = 'uploads/' . mt_rand() . '.' . $extension;

// Here is the moment  
$file = new Filesystem();
$file->move($path, $destination);