161 lines
4.1 KiB
PHP
161 lines
4.1 KiB
PHP
<?php
|
|
|
|
namespace Illuminate\Filesystem;
|
|
|
|
use Illuminate\Contracts\Foundation\CachesRoutes;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Route;
|
|
use Illuminate\Support\ServiceProvider;
|
|
use InvalidArgumentException;
|
|
|
|
class FilesystemServiceProvider extends ServiceProvider
|
|
{
|
|
/**
|
|
* Bootstrap the filesystem.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function boot()
|
|
{
|
|
$this->serveFiles();
|
|
}
|
|
|
|
/**
|
|
* Register the service provider.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function register()
|
|
{
|
|
$this->registerNativeFilesystem();
|
|
$this->registerFlysystem();
|
|
}
|
|
|
|
/**
|
|
* Register the native filesystem implementation.
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function registerNativeFilesystem()
|
|
{
|
|
$this->app->singleton('files', function () {
|
|
return new Filesystem;
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Register the driver based filesystem.
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function registerFlysystem()
|
|
{
|
|
$this->registerManager();
|
|
|
|
$this->app->singleton('filesystem.disk', function ($app) {
|
|
return $app['filesystem']->disk($this->getDefaultDriver());
|
|
});
|
|
|
|
$this->app->singleton('filesystem.cloud', function ($app) {
|
|
return $app['filesystem']->disk($this->getCloudDriver());
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Register the filesystem manager.
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function registerManager()
|
|
{
|
|
$this->app->singleton('filesystem', function ($app) {
|
|
return new FilesystemManager($app);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Register protected file serving.
|
|
*
|
|
* @return void
|
|
*
|
|
* @throws \InvalidArgumentException
|
|
*/
|
|
protected function serveFiles()
|
|
{
|
|
if ($this->app instanceof CachesRoutes && $this->app->routesAreCached()) {
|
|
return;
|
|
}
|
|
|
|
$served = [];
|
|
|
|
foreach ($this->app['config']['filesystems.disks'] ?? [] as $disk => $config) {
|
|
if (! $this->shouldServeFiles($config)) {
|
|
continue;
|
|
}
|
|
|
|
$this->app->booted(function ($app) use ($disk, $config, &$served) {
|
|
$uri = isset($config['url'])
|
|
? rtrim(parse_url($config['url'])['path'], '/')
|
|
: '/storage';
|
|
|
|
if (isset($served[$uri])) {
|
|
throw new InvalidArgumentException(
|
|
"The [{$disk}] disk conflicts with the [{$served[$uri]}] disk at [{$uri}]. Each served disk must have a unique URL."
|
|
);
|
|
}
|
|
|
|
$served[$uri] = $disk;
|
|
|
|
$isProduction = $app->isProduction();
|
|
|
|
Route::get($uri.'/{path}', function (Request $request, string $path) use ($disk, $config, $isProduction) {
|
|
return (new ServeFile(
|
|
$disk,
|
|
$config,
|
|
$isProduction
|
|
))($request, $path);
|
|
})->where('path', '.*')->name('storage.'.$disk);
|
|
|
|
Route::put($uri.'/{path}', function (Request $request, string $path) use ($disk, $config, $isProduction) {
|
|
return (new ReceiveFile(
|
|
$disk,
|
|
$config,
|
|
$isProduction
|
|
))($request, $path);
|
|
})->where('path', '.*')->name('storage.'.$disk.'.upload');
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Determine if the disk is serveable.
|
|
*
|
|
* @param array $config
|
|
* @return bool
|
|
*/
|
|
protected function shouldServeFiles(array $config)
|
|
{
|
|
return $config['driver'] === 'local' && ($config['serve'] ?? false);
|
|
}
|
|
|
|
/**
|
|
* Get the default file driver.
|
|
*
|
|
* @return string
|
|
*/
|
|
protected function getDefaultDriver()
|
|
{
|
|
return $this->app['config']['filesystems.default'];
|
|
}
|
|
|
|
/**
|
|
* Get the default cloud based file driver.
|
|
*
|
|
* @return string
|
|
*/
|
|
protected function getCloudDriver()
|
|
{
|
|
return $this->app['config']['filesystems.cloud'];
|
|
}
|
|
}
|