diff --git a/.phpstorm.meta.php b/.phpstorm.meta.php index 39e6b23..6c65431 100644 --- a/.phpstorm.meta.php +++ b/.phpstorm.meta.php @@ -67,6 +67,10 @@ namespace PHPSTORM_META { 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, + 'Spatie\MediaLibrary\MediaCollections\Filesystem' => \Spatie\MediaLibrary\MediaCollections\Filesystem::class, + 'Spatie\MediaLibrary\MediaCollections\MediaRepository' => \Spatie\MediaLibrary\MediaCollections\MediaRepository::class, + 'Spatie\MediaLibrary\ResponsiveImages\TinyPlaceholderGenerator\TinyPlaceholderGenerator' => \Spatie\MediaLibrary\ResponsiveImages\TinyPlaceholderGenerator\Blurred::class, + 'Spatie\MediaLibrary\ResponsiveImages\WidthCalculator\WidthCalculator' => \Spatie\MediaLibrary\ResponsiveImages\WidthCalculator\FileSizeOptimizedWidthCalculator::class, 'Whoops\Handler\HandlerInterface' => \Facade\Ignition\ErrorPage\IgnitionWhoopsHandler::class, 'auth' => \Illuminate\Auth\AuthManager::class, 'auth.driver' => \Illuminate\Auth\SessionGuard::class, @@ -107,6 +111,9 @@ namespace PHPSTORM_META { 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, 'command.make:solution' => \Facade\Ignition\Commands\SolutionMakeCommand::class, 'command.make:solution-provider' => \Facade\Ignition\Commands\SolutionProviderMakeCommand::class, + 'command.media-library:clean' => \Spatie\MediaLibrary\MediaCollections\Commands\CleanCommand::class, + 'command.media-library:clear' => \Spatie\MediaLibrary\MediaCollections\Commands\ClearCommand::class, + 'command.media-library:regenerate' => \Spatie\MediaLibrary\Conversions\Commands\RegenerateCommand::class, 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, @@ -172,6 +179,7 @@ namespace PHPSTORM_META { 'flare.logger' => \Monolog\Logger::class, 'hash' => \Illuminate\Hashing\HashManager::class, 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, + 'image' => \Intervention\Image\ImageManager::class, 'log' => \Illuminate\Log\LogManager::class, 'mail.manager' => \Illuminate\Mail\MailManager::class, 'mailer' => \Illuminate\Mail\Mailer::class, @@ -255,6 +263,10 @@ namespace PHPSTORM_META { 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, + 'Spatie\MediaLibrary\MediaCollections\Filesystem' => \Spatie\MediaLibrary\MediaCollections\Filesystem::class, + 'Spatie\MediaLibrary\MediaCollections\MediaRepository' => \Spatie\MediaLibrary\MediaCollections\MediaRepository::class, + 'Spatie\MediaLibrary\ResponsiveImages\TinyPlaceholderGenerator\TinyPlaceholderGenerator' => \Spatie\MediaLibrary\ResponsiveImages\TinyPlaceholderGenerator\Blurred::class, + 'Spatie\MediaLibrary\ResponsiveImages\WidthCalculator\WidthCalculator' => \Spatie\MediaLibrary\ResponsiveImages\WidthCalculator\FileSizeOptimizedWidthCalculator::class, 'Whoops\Handler\HandlerInterface' => \Facade\Ignition\ErrorPage\IgnitionWhoopsHandler::class, 'auth' => \Illuminate\Auth\AuthManager::class, 'auth.driver' => \Illuminate\Auth\SessionGuard::class, @@ -295,6 +307,9 @@ namespace PHPSTORM_META { 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, 'command.make:solution' => \Facade\Ignition\Commands\SolutionMakeCommand::class, 'command.make:solution-provider' => \Facade\Ignition\Commands\SolutionProviderMakeCommand::class, + 'command.media-library:clean' => \Spatie\MediaLibrary\MediaCollections\Commands\CleanCommand::class, + 'command.media-library:clear' => \Spatie\MediaLibrary\MediaCollections\Commands\ClearCommand::class, + 'command.media-library:regenerate' => \Spatie\MediaLibrary\Conversions\Commands\RegenerateCommand::class, 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, @@ -360,6 +375,7 @@ namespace PHPSTORM_META { 'flare.logger' => \Monolog\Logger::class, 'hash' => \Illuminate\Hashing\HashManager::class, 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, + 'image' => \Intervention\Image\ImageManager::class, 'log' => \Illuminate\Log\LogManager::class, 'mail.manager' => \Illuminate\Mail\MailManager::class, 'mailer' => \Illuminate\Mail\Mailer::class, @@ -443,6 +459,10 @@ namespace PHPSTORM_META { 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, + 'Spatie\MediaLibrary\MediaCollections\Filesystem' => \Spatie\MediaLibrary\MediaCollections\Filesystem::class, + 'Spatie\MediaLibrary\MediaCollections\MediaRepository' => \Spatie\MediaLibrary\MediaCollections\MediaRepository::class, + 'Spatie\MediaLibrary\ResponsiveImages\TinyPlaceholderGenerator\TinyPlaceholderGenerator' => \Spatie\MediaLibrary\ResponsiveImages\TinyPlaceholderGenerator\Blurred::class, + 'Spatie\MediaLibrary\ResponsiveImages\WidthCalculator\WidthCalculator' => \Spatie\MediaLibrary\ResponsiveImages\WidthCalculator\FileSizeOptimizedWidthCalculator::class, 'Whoops\Handler\HandlerInterface' => \Facade\Ignition\ErrorPage\IgnitionWhoopsHandler::class, 'auth' => \Illuminate\Auth\AuthManager::class, 'auth.driver' => \Illuminate\Auth\SessionGuard::class, @@ -483,6 +503,9 @@ namespace PHPSTORM_META { 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, 'command.make:solution' => \Facade\Ignition\Commands\SolutionMakeCommand::class, 'command.make:solution-provider' => \Facade\Ignition\Commands\SolutionProviderMakeCommand::class, + 'command.media-library:clean' => \Spatie\MediaLibrary\MediaCollections\Commands\CleanCommand::class, + 'command.media-library:clear' => \Spatie\MediaLibrary\MediaCollections\Commands\ClearCommand::class, + 'command.media-library:regenerate' => \Spatie\MediaLibrary\Conversions\Commands\RegenerateCommand::class, 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, @@ -548,6 +571,7 @@ namespace PHPSTORM_META { 'flare.logger' => \Monolog\Logger::class, 'hash' => \Illuminate\Hashing\HashManager::class, 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, + 'image' => \Intervention\Image\ImageManager::class, 'log' => \Illuminate\Log\LogManager::class, 'mail.manager' => \Illuminate\Mail\MailManager::class, 'mailer' => \Illuminate\Mail\Mailer::class, @@ -631,6 +655,10 @@ namespace PHPSTORM_META { 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, + 'Spatie\MediaLibrary\MediaCollections\Filesystem' => \Spatie\MediaLibrary\MediaCollections\Filesystem::class, + 'Spatie\MediaLibrary\MediaCollections\MediaRepository' => \Spatie\MediaLibrary\MediaCollections\MediaRepository::class, + 'Spatie\MediaLibrary\ResponsiveImages\TinyPlaceholderGenerator\TinyPlaceholderGenerator' => \Spatie\MediaLibrary\ResponsiveImages\TinyPlaceholderGenerator\Blurred::class, + 'Spatie\MediaLibrary\ResponsiveImages\WidthCalculator\WidthCalculator' => \Spatie\MediaLibrary\ResponsiveImages\WidthCalculator\FileSizeOptimizedWidthCalculator::class, 'Whoops\Handler\HandlerInterface' => \Facade\Ignition\ErrorPage\IgnitionWhoopsHandler::class, 'auth' => \Illuminate\Auth\AuthManager::class, 'auth.driver' => \Illuminate\Auth\SessionGuard::class, @@ -671,6 +699,9 @@ namespace PHPSTORM_META { 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, 'command.make:solution' => \Facade\Ignition\Commands\SolutionMakeCommand::class, 'command.make:solution-provider' => \Facade\Ignition\Commands\SolutionProviderMakeCommand::class, + 'command.media-library:clean' => \Spatie\MediaLibrary\MediaCollections\Commands\CleanCommand::class, + 'command.media-library:clear' => \Spatie\MediaLibrary\MediaCollections\Commands\ClearCommand::class, + 'command.media-library:regenerate' => \Spatie\MediaLibrary\Conversions\Commands\RegenerateCommand::class, 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, @@ -736,6 +767,7 @@ namespace PHPSTORM_META { 'flare.logger' => \Monolog\Logger::class, 'hash' => \Illuminate\Hashing\HashManager::class, 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, + 'image' => \Intervention\Image\ImageManager::class, 'log' => \Illuminate\Log\LogManager::class, 'mail.manager' => \Illuminate\Mail\MailManager::class, 'mailer' => \Illuminate\Mail\Mailer::class, @@ -819,6 +851,10 @@ namespace PHPSTORM_META { 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, + 'Spatie\MediaLibrary\MediaCollections\Filesystem' => \Spatie\MediaLibrary\MediaCollections\Filesystem::class, + 'Spatie\MediaLibrary\MediaCollections\MediaRepository' => \Spatie\MediaLibrary\MediaCollections\MediaRepository::class, + 'Spatie\MediaLibrary\ResponsiveImages\TinyPlaceholderGenerator\TinyPlaceholderGenerator' => \Spatie\MediaLibrary\ResponsiveImages\TinyPlaceholderGenerator\Blurred::class, + 'Spatie\MediaLibrary\ResponsiveImages\WidthCalculator\WidthCalculator' => \Spatie\MediaLibrary\ResponsiveImages\WidthCalculator\FileSizeOptimizedWidthCalculator::class, 'Whoops\Handler\HandlerInterface' => \Facade\Ignition\ErrorPage\IgnitionWhoopsHandler::class, 'auth' => \Illuminate\Auth\AuthManager::class, 'auth.driver' => \Illuminate\Auth\SessionGuard::class, @@ -859,6 +895,9 @@ namespace PHPSTORM_META { 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, 'command.make:solution' => \Facade\Ignition\Commands\SolutionMakeCommand::class, 'command.make:solution-provider' => \Facade\Ignition\Commands\SolutionProviderMakeCommand::class, + 'command.media-library:clean' => \Spatie\MediaLibrary\MediaCollections\Commands\CleanCommand::class, + 'command.media-library:clear' => \Spatie\MediaLibrary\MediaCollections\Commands\ClearCommand::class, + 'command.media-library:regenerate' => \Spatie\MediaLibrary\Conversions\Commands\RegenerateCommand::class, 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, @@ -924,6 +963,7 @@ namespace PHPSTORM_META { 'flare.logger' => \Monolog\Logger::class, 'hash' => \Illuminate\Hashing\HashManager::class, 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, + 'image' => \Intervention\Image\ImageManager::class, 'log' => \Illuminate\Log\LogManager::class, 'mail.manager' => \Illuminate\Mail\MailManager::class, 'mailer' => \Illuminate\Mail\Mailer::class, @@ -1007,6 +1047,10 @@ namespace PHPSTORM_META { 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, + 'Spatie\MediaLibrary\MediaCollections\Filesystem' => \Spatie\MediaLibrary\MediaCollections\Filesystem::class, + 'Spatie\MediaLibrary\MediaCollections\MediaRepository' => \Spatie\MediaLibrary\MediaCollections\MediaRepository::class, + 'Spatie\MediaLibrary\ResponsiveImages\TinyPlaceholderGenerator\TinyPlaceholderGenerator' => \Spatie\MediaLibrary\ResponsiveImages\TinyPlaceholderGenerator\Blurred::class, + 'Spatie\MediaLibrary\ResponsiveImages\WidthCalculator\WidthCalculator' => \Spatie\MediaLibrary\ResponsiveImages\WidthCalculator\FileSizeOptimizedWidthCalculator::class, 'Whoops\Handler\HandlerInterface' => \Facade\Ignition\ErrorPage\IgnitionWhoopsHandler::class, 'auth' => \Illuminate\Auth\AuthManager::class, 'auth.driver' => \Illuminate\Auth\SessionGuard::class, @@ -1047,6 +1091,9 @@ namespace PHPSTORM_META { 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, 'command.make:solution' => \Facade\Ignition\Commands\SolutionMakeCommand::class, 'command.make:solution-provider' => \Facade\Ignition\Commands\SolutionProviderMakeCommand::class, + 'command.media-library:clean' => \Spatie\MediaLibrary\MediaCollections\Commands\CleanCommand::class, + 'command.media-library:clear' => \Spatie\MediaLibrary\MediaCollections\Commands\ClearCommand::class, + 'command.media-library:regenerate' => \Spatie\MediaLibrary\Conversions\Commands\RegenerateCommand::class, 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, @@ -1112,6 +1159,7 @@ namespace PHPSTORM_META { 'flare.logger' => \Monolog\Logger::class, 'hash' => \Illuminate\Hashing\HashManager::class, 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, + 'image' => \Intervention\Image\ImageManager::class, 'log' => \Illuminate\Log\LogManager::class, 'mail.manager' => \Illuminate\Mail\MailManager::class, 'mailer' => \Illuminate\Mail\Mailer::class, @@ -1195,6 +1243,10 @@ namespace PHPSTORM_META { 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, + 'Spatie\MediaLibrary\MediaCollections\Filesystem' => \Spatie\MediaLibrary\MediaCollections\Filesystem::class, + 'Spatie\MediaLibrary\MediaCollections\MediaRepository' => \Spatie\MediaLibrary\MediaCollections\MediaRepository::class, + 'Spatie\MediaLibrary\ResponsiveImages\TinyPlaceholderGenerator\TinyPlaceholderGenerator' => \Spatie\MediaLibrary\ResponsiveImages\TinyPlaceholderGenerator\Blurred::class, + 'Spatie\MediaLibrary\ResponsiveImages\WidthCalculator\WidthCalculator' => \Spatie\MediaLibrary\ResponsiveImages\WidthCalculator\FileSizeOptimizedWidthCalculator::class, 'Whoops\Handler\HandlerInterface' => \Facade\Ignition\ErrorPage\IgnitionWhoopsHandler::class, 'auth' => \Illuminate\Auth\AuthManager::class, 'auth.driver' => \Illuminate\Auth\SessionGuard::class, @@ -1235,6 +1287,9 @@ namespace PHPSTORM_META { 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, 'command.make:solution' => \Facade\Ignition\Commands\SolutionMakeCommand::class, 'command.make:solution-provider' => \Facade\Ignition\Commands\SolutionProviderMakeCommand::class, + 'command.media-library:clean' => \Spatie\MediaLibrary\MediaCollections\Commands\CleanCommand::class, + 'command.media-library:clear' => \Spatie\MediaLibrary\MediaCollections\Commands\ClearCommand::class, + 'command.media-library:regenerate' => \Spatie\MediaLibrary\Conversions\Commands\RegenerateCommand::class, 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, @@ -1300,6 +1355,7 @@ namespace PHPSTORM_META { 'flare.logger' => \Monolog\Logger::class, 'hash' => \Illuminate\Hashing\HashManager::class, 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, + 'image' => \Intervention\Image\ImageManager::class, 'log' => \Illuminate\Log\LogManager::class, 'mail.manager' => \Illuminate\Mail\MailManager::class, 'mailer' => \Illuminate\Mail\Mailer::class, @@ -1383,6 +1439,10 @@ namespace PHPSTORM_META { 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, + 'Spatie\MediaLibrary\MediaCollections\Filesystem' => \Spatie\MediaLibrary\MediaCollections\Filesystem::class, + 'Spatie\MediaLibrary\MediaCollections\MediaRepository' => \Spatie\MediaLibrary\MediaCollections\MediaRepository::class, + 'Spatie\MediaLibrary\ResponsiveImages\TinyPlaceholderGenerator\TinyPlaceholderGenerator' => \Spatie\MediaLibrary\ResponsiveImages\TinyPlaceholderGenerator\Blurred::class, + 'Spatie\MediaLibrary\ResponsiveImages\WidthCalculator\WidthCalculator' => \Spatie\MediaLibrary\ResponsiveImages\WidthCalculator\FileSizeOptimizedWidthCalculator::class, 'Whoops\Handler\HandlerInterface' => \Facade\Ignition\ErrorPage\IgnitionWhoopsHandler::class, 'auth' => \Illuminate\Auth\AuthManager::class, 'auth.driver' => \Illuminate\Auth\SessionGuard::class, @@ -1423,6 +1483,9 @@ namespace PHPSTORM_META { 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, 'command.make:solution' => \Facade\Ignition\Commands\SolutionMakeCommand::class, 'command.make:solution-provider' => \Facade\Ignition\Commands\SolutionProviderMakeCommand::class, + 'command.media-library:clean' => \Spatie\MediaLibrary\MediaCollections\Commands\CleanCommand::class, + 'command.media-library:clear' => \Spatie\MediaLibrary\MediaCollections\Commands\ClearCommand::class, + 'command.media-library:regenerate' => \Spatie\MediaLibrary\Conversions\Commands\RegenerateCommand::class, 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, @@ -1488,6 +1551,7 @@ namespace PHPSTORM_META { 'flare.logger' => \Monolog\Logger::class, 'hash' => \Illuminate\Hashing\HashManager::class, 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, + 'image' => \Intervention\Image\ImageManager::class, 'log' => \Illuminate\Log\LogManager::class, 'mail.manager' => \Illuminate\Mail\MailManager::class, 'mailer' => \Illuminate\Mail\Mailer::class, @@ -1571,6 +1635,10 @@ namespace PHPSTORM_META { 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, + 'Spatie\MediaLibrary\MediaCollections\Filesystem' => \Spatie\MediaLibrary\MediaCollections\Filesystem::class, + 'Spatie\MediaLibrary\MediaCollections\MediaRepository' => \Spatie\MediaLibrary\MediaCollections\MediaRepository::class, + 'Spatie\MediaLibrary\ResponsiveImages\TinyPlaceholderGenerator\TinyPlaceholderGenerator' => \Spatie\MediaLibrary\ResponsiveImages\TinyPlaceholderGenerator\Blurred::class, + 'Spatie\MediaLibrary\ResponsiveImages\WidthCalculator\WidthCalculator' => \Spatie\MediaLibrary\ResponsiveImages\WidthCalculator\FileSizeOptimizedWidthCalculator::class, 'Whoops\Handler\HandlerInterface' => \Facade\Ignition\ErrorPage\IgnitionWhoopsHandler::class, 'auth' => \Illuminate\Auth\AuthManager::class, 'auth.driver' => \Illuminate\Auth\SessionGuard::class, @@ -1611,6 +1679,9 @@ namespace PHPSTORM_META { 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, 'command.make:solution' => \Facade\Ignition\Commands\SolutionMakeCommand::class, 'command.make:solution-provider' => \Facade\Ignition\Commands\SolutionProviderMakeCommand::class, + 'command.media-library:clean' => \Spatie\MediaLibrary\MediaCollections\Commands\CleanCommand::class, + 'command.media-library:clear' => \Spatie\MediaLibrary\MediaCollections\Commands\ClearCommand::class, + 'command.media-library:regenerate' => \Spatie\MediaLibrary\Conversions\Commands\RegenerateCommand::class, 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, @@ -1676,6 +1747,7 @@ namespace PHPSTORM_META { 'flare.logger' => \Monolog\Logger::class, 'hash' => \Illuminate\Hashing\HashManager::class, 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, + 'image' => \Intervention\Image\ImageManager::class, 'log' => \Illuminate\Log\LogManager::class, 'mail.manager' => \Illuminate\Mail\MailManager::class, 'mailer' => \Illuminate\Mail\Mailer::class, @@ -1759,6 +1831,10 @@ namespace PHPSTORM_META { 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, + 'Spatie\MediaLibrary\MediaCollections\Filesystem' => \Spatie\MediaLibrary\MediaCollections\Filesystem::class, + 'Spatie\MediaLibrary\MediaCollections\MediaRepository' => \Spatie\MediaLibrary\MediaCollections\MediaRepository::class, + 'Spatie\MediaLibrary\ResponsiveImages\TinyPlaceholderGenerator\TinyPlaceholderGenerator' => \Spatie\MediaLibrary\ResponsiveImages\TinyPlaceholderGenerator\Blurred::class, + 'Spatie\MediaLibrary\ResponsiveImages\WidthCalculator\WidthCalculator' => \Spatie\MediaLibrary\ResponsiveImages\WidthCalculator\FileSizeOptimizedWidthCalculator::class, 'Whoops\Handler\HandlerInterface' => \Facade\Ignition\ErrorPage\IgnitionWhoopsHandler::class, 'auth' => \Illuminate\Auth\AuthManager::class, 'auth.driver' => \Illuminate\Auth\SessionGuard::class, @@ -1799,6 +1875,9 @@ namespace PHPSTORM_META { 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, 'command.make:solution' => \Facade\Ignition\Commands\SolutionMakeCommand::class, 'command.make:solution-provider' => \Facade\Ignition\Commands\SolutionProviderMakeCommand::class, + 'command.media-library:clean' => \Spatie\MediaLibrary\MediaCollections\Commands\CleanCommand::class, + 'command.media-library:clear' => \Spatie\MediaLibrary\MediaCollections\Commands\ClearCommand::class, + 'command.media-library:regenerate' => \Spatie\MediaLibrary\Conversions\Commands\RegenerateCommand::class, 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, @@ -1864,6 +1943,7 @@ namespace PHPSTORM_META { 'flare.logger' => \Monolog\Logger::class, 'hash' => \Illuminate\Hashing\HashManager::class, 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, + 'image' => \Intervention\Image\ImageManager::class, 'log' => \Illuminate\Log\LogManager::class, 'mail.manager' => \Illuminate\Mail\MailManager::class, 'mailer' => \Illuminate\Mail\Mailer::class, @@ -1947,6 +2027,10 @@ namespace PHPSTORM_META { 'NunoMaduro\Collision\Contracts\Provider' => \NunoMaduro\Collision\Provider::class, 'Psr\Http\Message\ResponseInterface' => \Nyholm\Psr7\Response::class, 'Psr\Http\Message\ServerRequestInterface' => \Nyholm\Psr7\ServerRequest::class, + 'Spatie\MediaLibrary\MediaCollections\Filesystem' => \Spatie\MediaLibrary\MediaCollections\Filesystem::class, + 'Spatie\MediaLibrary\MediaCollections\MediaRepository' => \Spatie\MediaLibrary\MediaCollections\MediaRepository::class, + 'Spatie\MediaLibrary\ResponsiveImages\TinyPlaceholderGenerator\TinyPlaceholderGenerator' => \Spatie\MediaLibrary\ResponsiveImages\TinyPlaceholderGenerator\Blurred::class, + 'Spatie\MediaLibrary\ResponsiveImages\WidthCalculator\WidthCalculator' => \Spatie\MediaLibrary\ResponsiveImages\WidthCalculator\FileSizeOptimizedWidthCalculator::class, 'Whoops\Handler\HandlerInterface' => \Facade\Ignition\ErrorPage\IgnitionWhoopsHandler::class, 'auth' => \Illuminate\Auth\AuthManager::class, 'auth.driver' => \Illuminate\Auth\SessionGuard::class, @@ -1987,6 +2071,9 @@ namespace PHPSTORM_META { 'command.mail.make' => \Illuminate\Foundation\Console\MailMakeCommand::class, 'command.make:solution' => \Facade\Ignition\Commands\SolutionMakeCommand::class, 'command.make:solution-provider' => \Facade\Ignition\Commands\SolutionProviderMakeCommand::class, + 'command.media-library:clean' => \Spatie\MediaLibrary\MediaCollections\Commands\CleanCommand::class, + 'command.media-library:clear' => \Spatie\MediaLibrary\MediaCollections\Commands\ClearCommand::class, + 'command.media-library:regenerate' => \Spatie\MediaLibrary\Conversions\Commands\RegenerateCommand::class, 'command.middleware.make' => \Illuminate\Routing\Console\MiddlewareMakeCommand::class, 'command.migrate' => \Illuminate\Database\Console\Migrations\MigrateCommand::class, 'command.migrate.fresh' => \Illuminate\Database\Console\Migrations\FreshCommand::class, @@ -2052,6 +2139,7 @@ namespace PHPSTORM_META { 'flare.logger' => \Monolog\Logger::class, 'hash' => \Illuminate\Hashing\HashManager::class, 'hash.driver' => \Illuminate\Hashing\BcryptHasher::class, + 'image' => \Intervention\Image\ImageManager::class, 'log' => \Illuminate\Log\LogManager::class, 'mail.manager' => \Illuminate\Mail\MailManager::class, 'mailer' => \Illuminate\Mail\Mailer::class, diff --git a/_ide_helper.php b/_ide_helper.php index b579756..c9e1fa2 100644 --- a/_ide_helper.php +++ b/_ide_helper.php @@ -14941,6 +14941,70 @@ } +} + + namespace Intervention\Image\Facades { + /** + * + * + */ + class Image { + /** + * Overrides configuration settings + * + * @param array $config + * @return self + * @static + */ + public static function configure($config = []) + { + /** @var \Intervention\Image\ImageManager $instance */ + return $instance->configure($config); + } + /** + * Initiates an Image instance from different input types + * + * @param mixed $data + * @return \Intervention\Image\Image + * @static + */ + public static function make($data) + { + /** @var \Intervention\Image\ImageManager $instance */ + return $instance->make($data); + } + /** + * Creates an empty image canvas + * + * @param int $width + * @param int $height + * @param mixed $background + * @return \Intervention\Image\Image + * @static + */ + public static function canvas($width, $height, $background = null) + { + /** @var \Intervention\Image\ImageManager $instance */ + return $instance->canvas($width, $height, $background); + } + /** + * Create new cached image and run callback + * (requires additional package intervention/imagecache) + * + * @param \Closure $callback + * @param int $lifetime + * @param boolean $returnObj + * @return \Image + * @static + */ + public static function cache($callback, $lifetime = null, $returnObj = false) + { + /** @var \Intervention\Image\ImageManager $instance */ + return $instance->cache($callback, $lifetime, $returnObj); + } + + } + } namespace Illuminate\Http { @@ -18179,6 +18243,7 @@ namespace { class View extends \Illuminate\Support\Facades\View {} class JsonApi extends \CloudCreativity\LaravelJsonApi\Facades\JsonApi {} class Flare extends \Facade\Ignition\Facades\Flare {} + class Image extends \Intervention\Image\Facades\Image {} } diff --git a/app/Http/Controllers/RecipeController.php b/app/Http/Controllers/RecipeController.php index fba8743..d89408c 100644 --- a/app/Http/Controllers/RecipeController.php +++ b/app/Http/Controllers/RecipeController.php @@ -155,6 +155,8 @@ class RecipeController extends Controller 'name' => ['required', 'string'], 'description' => ['nullable', 'string'], 'description_delta' => ['nullable', 'string'], + 'image' => ['nullable', 'file', 'mimes:jpg,png,gif'], + 'remove_image' => ['nullable', 'boolean'], 'servings' => ['required', 'numeric'], 'time_prep' => ['nullable', 'numeric'], 'time_active' => ['nullable', 'numeric'], @@ -256,6 +258,21 @@ class RecipeController extends Controller $recipe->syncTags(explode(',', $tags)); } + // Handle recipe image. + if (!empty($input['image'])) { + /** @var \Illuminate\Http\UploadedFile $file */ + $file = $input['image']; + $recipe->clearMediaCollection(); + $recipe + ->addMediaFromRequest('image') + ->usingName($recipe->name) + ->usingFileName("{$recipe->slug}.{$file->extension()}") + ->toMediaCollection(); + } + elseif (isset($input['remove_image']) && (bool) $input['remove_image']) { + $recipe->clearMediaCollection(); + } + session()->flash('message', "Recipe {$recipe->name} updated!"); return redirect()->route('recipes.show', $recipe); } diff --git a/app/Models/Recipe.php b/app/Models/Recipe.php index b810621..e9a46df 100644 --- a/app/Models/Recipe.php +++ b/app/Models/Recipe.php @@ -11,6 +11,9 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; use Laravel\Scout\Searchable; +use Spatie\MediaLibrary\HasMedia; +use Spatie\MediaLibrary\InteractsWithMedia; +use Spatie\MediaLibrary\MediaCollections\Models\Media; use Spatie\Tags\HasTags; /** @@ -64,12 +67,13 @@ use Spatie\Tags\HasTags; * @property string|null $description_delta * @method static \Illuminate\Database\Eloquent\Builder|Recipe whereDescriptionDelta($value) */ -final class Recipe extends Model +final class Recipe extends Model implements HasMedia { use HasFactory; use HasIngredients; use HasTags; use Ingredient; + use InteractsWithMedia; use Journalable; use QueryDsl; use Searchable; @@ -189,4 +193,19 @@ final class Recipe extends Model } } + /** + * Defines conversions for the Recipe image. + * + * @throws \Spatie\Image\Exceptions\InvalidManipulation + * + * @see https://spatie.be/docs/laravel-medialibrary/v9/converting-images/defining-conversions + */ + public function registerMediaConversions(Media $media = null): void + { + $this->addMediaConversion('preview') + ->width(368) + ->height(232) + ->sharpen(10); + } + } diff --git a/composer.json b/composer.json index b80682b..ecb9172 100644 --- a/composer.json +++ b/composer.json @@ -17,6 +17,7 @@ "laravel/scout": "^8.6", "laravel/tinker": "^2.5", "phospr/fraction": "^1.2", + "spatie/laravel-medialibrary": "^9.0.0", "spatie/laravel-tags": "^3.0" }, "require-dev": { diff --git a/composer.lock b/composer.lock index 1eab37d..c24cbb2 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "7ceaed365c3962d66d301ae612a52e9f", + "content-hash": "661105534dbdf7707554b24e2fbf2aeb", "packages": [ { "name": "asm89/stack-cors", @@ -1661,6 +1661,80 @@ }, "time": "2020-09-30T07:37:11+00:00" }, + { + "name": "intervention/image", + "version": "2.5.1", + "source": { + "type": "git", + "url": "https://github.com/Intervention/image.git", + "reference": "abbf18d5ab8367f96b3205ca3c89fb2fa598c69e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Intervention/image/zipball/abbf18d5ab8367f96b3205ca3c89fb2fa598c69e", + "reference": "abbf18d5ab8367f96b3205ca3c89fb2fa598c69e", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "guzzlehttp/psr7": "~1.1", + "php": ">=5.4.0" + }, + "require-dev": { + "mockery/mockery": "~0.9.2", + "phpunit/phpunit": "^4.8 || ^5.7" + }, + "suggest": { + "ext-gd": "to use GD library based image processing.", + "ext-imagick": "to use Imagick based image processing.", + "intervention/imagecache": "Caching extension for the Intervention Image library" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + }, + "laravel": { + "providers": [ + "Intervention\\Image\\ImageServiceProvider" + ], + "aliases": { + "Image": "Intervention\\Image\\Facades\\Image" + } + } + }, + "autoload": { + "psr-4": { + "Intervention\\Image\\": "src/Intervention/Image" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Oliver Vogel", + "email": "oliver@olivervogel.com", + "homepage": "http://olivervogel.com/" + } + ], + "description": "Image handling and manipulation library with support for Laravel integration", + "homepage": "http://image.intervention.io/", + "keywords": [ + "gd", + "image", + "imagick", + "laravel", + "thumbnail", + "watermark" + ], + "support": { + "issues": "https://github.com/Intervention/image/issues", + "source": "https://github.com/Intervention/image/tree/master" + }, + "time": "2019-11-02T09:15:47+00:00" + }, { "name": "laravel/framework", "version": "v8.31.0", @@ -2162,6 +2236,71 @@ ], "time": "2020-08-23T07:39:11+00:00" }, + { + "name": "league/glide", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/glide.git", + "reference": "ae5e26700573cb678919d28e425a8b87bc71c546" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/glide/zipball/ae5e26700573cb678919d28e425a8b87bc71c546", + "reference": "ae5e26700573cb678919d28e425a8b87bc71c546", + "shasum": "" + }, + "require": { + "intervention/image": "^2.4", + "league/flysystem": "^1.0", + "php": "^7.2|^8.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^1.3.3", + "phpunit/php-token-stream": "^3.1|^4.0", + "phpunit/phpunit": "^8.5|^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Glide\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Reinink", + "email": "jonathan@reinink.ca", + "homepage": "http://reinink.ca" + } + ], + "description": "Wonderfully easy on-demand image manipulation library with an HTTP based API.", + "homepage": "http://glide.thephpleague.com", + "keywords": [ + "ImageMagick", + "editing", + "gd", + "image", + "imagick", + "league", + "manipulation", + "processing" + ], + "support": { + "issues": "https://github.com/thephpleague/glide/issues", + "source": "https://github.com/thephpleague/glide/tree/1.7.0" + }, + "time": "2020-11-05T17:34:03+00:00" + }, { "name": "league/mime-type-detection", "version": "1.7.0", @@ -2218,6 +2357,77 @@ ], "time": "2021-01-18T20:58:21+00:00" }, + { + "name": "maennchen/zipstream-php", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/maennchen/ZipStream-PHP.git", + "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/c4c5803cc1f93df3d2448478ef79394a5981cc58", + "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58", + "shasum": "" + }, + "require": { + "myclabs/php-enum": "^1.5", + "php": ">= 7.1", + "psr/http-message": "^1.0", + "symfony/polyfill-mbstring": "^1.0" + }, + "require-dev": { + "ext-zip": "*", + "guzzlehttp/guzzle": ">= 6.3", + "mikey179/vfsstream": "^1.6", + "phpunit/phpunit": ">= 7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZipStream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paul Duncan", + "email": "pabs@pablotron.org" + }, + { + "name": "Jonatan Männchen", + "email": "jonatan@maennchen.ch" + }, + { + "name": "Jesse Donat", + "email": "donatj@gmail.com" + }, + { + "name": "András Kolesár", + "email": "kolesar@kolesar.hu" + } + ], + "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.", + "keywords": [ + "stream", + "zip" + ], + "support": { + "issues": "https://github.com/maennchen/ZipStream-PHP/issues", + "source": "https://github.com/maennchen/ZipStream-PHP/tree/master" + }, + "funding": [ + { + "url": "https://opencollective.com/zipstream", + "type": "open_collective" + } + ], + "time": "2020-05-30T13:11:16+00:00" + }, { "name": "monolog/monolog", "version": "2.2.0", @@ -2314,6 +2524,66 @@ ], "time": "2020-12-14T13:15:25+00:00" }, + { + "name": "myclabs/php-enum", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/php-enum.git", + "reference": "46cf3d8498b095bd33727b13fd5707263af99421" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/php-enum/zipball/46cf3d8498b095bd33727b13fd5707263af99421", + "reference": "46cf3d8498b095bd33727b13fd5707263af99421", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "1.*", + "vimeo/psalm": "^4.5.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "MyCLabs\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP Enum contributors", + "homepage": "https://github.com/myclabs/php-enum/graphs/contributors" + } + ], + "description": "PHP Enum implementation", + "homepage": "http://github.com/myclabs/php-enum", + "keywords": [ + "enum" + ], + "support": { + "issues": "https://github.com/myclabs/php-enum/issues", + "source": "https://github.com/myclabs/php-enum/tree/1.8.0" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/php-enum", + "type": "tidelift" + } + ], + "time": "2021-02-15T16:11:48+00:00" + }, { "name": "neomerx/json-api", "version": "v1.0.9", @@ -3601,6 +3871,233 @@ ], "time": "2021-01-18T00:32:12+00:00" }, + { + "name": "spatie/image", + "version": "1.10.4", + "source": { + "type": "git", + "url": "https://github.com/spatie/image.git", + "reference": "7ea129bc7b7521864c5a540e3b1c14ea194316d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/image/zipball/7ea129bc7b7521864c5a540e3b1c14ea194316d3", + "reference": "7ea129bc7b7521864c5a540e3b1c14ea194316d3", + "shasum": "" + }, + "require": { + "ext-exif": "*", + "ext-json": "*", + "ext-mbstring": "*", + "league/glide": "^1.6", + "php": "^7.2|^8.0", + "spatie/image-optimizer": "^1.1", + "spatie/temporary-directory": "^1.0", + "symfony/process": "^3.0|^4.0|^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.0|^9.0", + "symfony/var-dumper": "^4.0|^5.0", + "vimeo/psalm": "^4.6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Image\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Manipulate images with an expressive API", + "homepage": "https://github.com/spatie/image", + "keywords": [ + "image", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/image/issues", + "source": "https://github.com/spatie/image/tree/1.10.4" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2021-03-10T16:11:40+00:00" + }, + { + "name": "spatie/image-optimizer", + "version": "1.3.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/image-optimizer.git", + "reference": "6aa170eb292758553d332efee5e0c3977341080c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/image-optimizer/zipball/6aa170eb292758553d332efee5e0c3977341080c", + "reference": "6aa170eb292758553d332efee5e0c3977341080c", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.2|^8.0", + "psr/log": "^1.0", + "symfony/process": "^4.2|^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.0|^9.0", + "symfony/var-dumper": "^4.2|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\ImageOptimizer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Easily optimize images using PHP", + "homepage": "https://github.com/spatie/image-optimizer", + "keywords": [ + "image-optimizer", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/image-optimizer/issues", + "source": "https://github.com/spatie/image-optimizer/tree/1.3.2" + }, + "time": "2020-11-28T12:37:58+00:00" + }, + { + "name": "spatie/laravel-medialibrary", + "version": "9.4.3", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-medialibrary.git", + "reference": "2eae7416a6d7762e147f26f6cac7cf099eda109b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-medialibrary/zipball/2eae7416a6d7762e147f26f6cac7cf099eda109b", + "reference": "2eae7416a6d7762e147f26f6cac7cf099eda109b", + "shasum": "" + }, + "require": { + "ext-exif": "*", + "ext-fileinfo": "*", + "ext-json": "*", + "illuminate/bus": "^7.0|^8.0", + "illuminate/console": "^7.0|^8.0", + "illuminate/database": "^7.0|^8.0", + "illuminate/pipeline": "^7.0|^8.0", + "illuminate/support": "^7.0|^8.0", + "league/flysystem": "^1.0.64", + "maennchen/zipstream-php": "^1.0|^2.0", + "php": "^7.4|^8.0", + "spatie/image": "^1.4.0", + "spatie/temporary-directory": "^1.1", + "symfony/console": "^4.4|^5.0" + }, + "conflict": { + "php-ffmpeg/php-ffmpeg": "<0.6.1" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.133.11", + "doctrine/dbal": "^2.5.2", + "ext-pdo_sqlite": "*", + "ext-zip": "*", + "guzzlehttp/guzzle": "^6.3|^7.0", + "league/flysystem-aws-s3-v3": "^1.0.23", + "mockery/mockery": "^1.3", + "orchestra/testbench": "^5.0|^6.0", + "phpunit/phpunit": "^9.1", + "spatie/pdf-to-image": "^2.0", + "spatie/phpunit-snapshot-assertions": "^4.0" + }, + "suggest": { + "league/flysystem-aws-s3-v3": "Required to use AWS S3 file storage", + "php-ffmpeg/php-ffmpeg": "Required for generating video thumbnails", + "spatie/pdf-to-image": "Required for generating thumbsnails of PDFs and SVGs" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\MediaLibrary\\MediaLibraryServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\MediaLibrary\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Associate files with Eloquent models", + "homepage": "https://github.com/spatie/laravel-medialibrary", + "keywords": [ + "cms", + "conversion", + "downloads", + "images", + "laravel", + "laravel-medialibrary", + "media", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-medialibrary/issues", + "source": "https://github.com/spatie/laravel-medialibrary/tree/9.4.3" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2021-03-07T18:42:19+00:00" + }, { "name": "spatie/laravel-tags", "version": "3.1.0", @@ -3751,6 +4248,57 @@ ], "time": "2020-11-19T14:19:29+00:00" }, + { + "name": "spatie/temporary-directory", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/temporary-directory.git", + "reference": "f517729b3793bca58f847c5fd383ec16f03ffec6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/temporary-directory/zipball/f517729b3793bca58f847c5fd383ec16f03ffec6", + "reference": "f517729b3793bca58f847c5fd383ec16f03ffec6", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.0|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\TemporaryDirectory\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alex Vanderbist", + "email": "alex@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Easily create, use and destroy temporary directories", + "homepage": "https://github.com/spatie/temporary-directory", + "keywords": [ + "php", + "spatie", + "temporary-directory" + ], + "support": { + "issues": "https://github.com/spatie/temporary-directory/issues", + "source": "https://github.com/spatie/temporary-directory/tree/1.3.0" + }, + "time": "2020-11-09T15:54:21+00:00" + }, { "name": "swiftmailer/swiftmailer", "version": "v6.2.5", diff --git a/config/filesystems.php b/config/filesystems.php index 10c9d9b..f7bdc6e 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -42,6 +42,12 @@ return [ 'visibility' => 'public', ], + 'media' => [ + 'driver' => 'local', + 'root' => public_path('media'), + 'url' => env('APP_URL').'/media', + ], + 's3' => [ 'driver' => 's3', 'key' => env('AWS_ACCESS_KEY_ID'), diff --git a/config/media-library.php b/config/media-library.php new file mode 100644 index 0000000..aa594b3 --- /dev/null +++ b/config/media-library.php @@ -0,0 +1,215 @@ + env('MEDIA_DISK', 'media'), + + /* + * The maximum file size of an item in bytes. + * Adding a larger file will result in an exception. + */ + 'max_file_size' => 1024 * 1024 * 10, + + /* + * This queue will be used to generate derived and responsive images. + * Leave empty to use the default queue. + */ + 'queue_name' => '', + + /* + * By default all conversions will be performed on a queue. + */ + 'queue_conversions_by_default' => env('QUEUE_CONVERSIONS_BY_DEFAULT', true), + + /* + * The fully qualified class name of the media model. + */ + 'media_model' => Spatie\MediaLibrary\MediaCollections\Models\Media::class, + + /* + * The fully qualified class name of the model used for temporary uploads. + * + * This model is only used in Media Library Pro (https://medialibrary.pro) + */ + 'temporary_upload_model' => Spatie\MediaLibraryPro\Models\TemporaryUpload::class, + + /* + * When enabled, Media Library Pro will only process temporary uploads there were uploaded + * in the same session. You can opt to disable this for stateless usage of + * the pro components. + */ + 'enable_temporary_uploads_session_affinity' => true, + + /* + * When enabled, Media Library pro will generate thumbnails for uploaded file. + */ + 'generate_thumbnails_for_temporary_uploads' => true, + + /* + * This is the class that is responsible for naming generated files. + */ + 'file_namer' => Spatie\MediaLibrary\Support\FileNamer\DefaultFileNamer::class, + + /* + * The class that contains the strategy for determining a media file's path. + */ + 'path_generator' => Spatie\MediaLibrary\Support\PathGenerator\DefaultPathGenerator::class, + + /* + * When urls to files get generated, this class will be called. Use the default + * if your files are stored locally above the site root or on s3. + */ + 'url_generator' => Spatie\MediaLibrary\Support\UrlGenerator\DefaultUrlGenerator::class, + + /* + * Moves media on updating to keep path consistent. Enable it only with a custom + * PathGenerator that uses, for example, the media UUID. + */ + 'moves_media_on_update' => false, + + /* + * Whether to activate versioning when urls to files get generated. + * When activated, this attaches a ?v=xx query string to the URL. + */ + 'version_urls' => false, + + /* + * The media library will try to optimize all converted images by removing + * metadata and applying a little bit of compression. These are + * the optimizers that will be used by default. + */ + 'image_optimizers' => [ + Spatie\ImageOptimizer\Optimizers\Jpegoptim::class => [ + '-m85', // set maximum quality to 85% + '--strip-all', // this strips out all text information such as comments and EXIF data + '--all-progressive', // this will make sure the resulting image is a progressive one + ], + Spatie\ImageOptimizer\Optimizers\Pngquant::class => [ + '--force', // required parameter for this package + ], + Spatie\ImageOptimizer\Optimizers\Optipng::class => [ + '-i0', // this will result in a non-interlaced, progressive scanned image + '-o2', // this set the optimization level to two (multiple IDAT compression trials) + '-quiet', // required parameter for this package + ], + Spatie\ImageOptimizer\Optimizers\Svgo::class => [ + '--disable=cleanupIDs', // disabling because it is known to cause troubles + ], + Spatie\ImageOptimizer\Optimizers\Gifsicle::class => [ + '-b', // required parameter for this package + '-O3', // this produces the slowest but best results + ], + Spatie\ImageOptimizer\Optimizers\Cwebp::class => [ + '-m 6', // for the slowest compression method in order to get the best compression. + '-pass 10', // for maximizing the amount of analysis pass. + '-mt', // multithreading for some speed improvements. + '-q 90', //quality factor that brings the least noticeable changes. + ], + ], + + /* + * These generators will be used to create an image of media files. + */ + 'image_generators' => [ + Spatie\MediaLibrary\Conversions\ImageGenerators\Image::class, + Spatie\MediaLibrary\Conversions\ImageGenerators\Webp::class, + Spatie\MediaLibrary\Conversions\ImageGenerators\Pdf::class, + Spatie\MediaLibrary\Conversions\ImageGenerators\Svg::class, + Spatie\MediaLibrary\Conversions\ImageGenerators\Video::class, + ], + + /* + * The path where to store temporary files while performing image conversions. + * If set to null, storage_path('media-library/temp') will be used. + */ + 'temporary_directory_path' => null, + + /* + * The engine that should perform the image conversions. + * Should be either `gd` or `imagick`. + */ + 'image_driver' => env('IMAGE_DRIVER', 'gd'), + + /* + * FFMPEG & FFProbe binaries paths, only used if you try to generate video + * thumbnails and have installed the php-ffmpeg/php-ffmpeg composer + * dependency. + */ + 'ffmpeg_path' => env('FFMPEG_PATH', '/usr/bin/ffmpeg'), + 'ffprobe_path' => env('FFPROBE_PATH', '/usr/bin/ffprobe'), + + /* + * Here you can override the class names of the jobs used by this package. Make sure + * your custom jobs extend the ones provided by the package. + */ + 'jobs' => [ + 'perform_conversions' => Spatie\MediaLibrary\Conversions\Jobs\PerformConversionsJob::class, + 'generate_responsive_images' => Spatie\MediaLibrary\ResponsiveImages\Jobs\GenerateResponsiveImagesJob::class, + ], + + /* + * When using the addMediaFromUrl method you may want to replace the default downloader. + * This is particularly useful when the url of the image is behind a firewall and + * need to add additional flags, possibly using curl. + */ + 'media_downloader' => Spatie\MediaLibrary\Downloaders\DefaultDownloader::class, + + 'remote' => [ + /* + * Any extra headers that should be included when uploading media to + * a remote disk. Even though supported headers may vary between + * different drivers, a sensible default has been provided. + * + * Supported by S3: CacheControl, Expires, StorageClass, + * ServerSideEncryption, Metadata, ACL, ContentEncoding + */ + 'extra_headers' => [ + 'CacheControl' => 'max-age=604800', + ], + ], + + 'responsive_images' => [ + /* + * This class is responsible for calculating the target widths of the responsive + * images. By default we optimize for filesize and create variations that each are 20% + * smaller than the previous one. More info in the documentation. + * + * https://docs.spatie.be/laravel-medialibrary/v9/advanced-usage/generating-responsive-images + */ + 'width_calculator' => Spatie\MediaLibrary\ResponsiveImages\WidthCalculator\FileSizeOptimizedWidthCalculator::class, + + /* + * By default rendering media to a responsive image will add some javascript and a tiny placeholder. + * This ensures that the browser can already determine the correct layout. + */ + 'use_tiny_placeholders' => true, + + /* + * This class will generate the tiny placeholder used for progressive image loading. By default + * the media library will use a tiny blurred jpg image. + */ + 'tiny_placeholder_generator' => Spatie\MediaLibrary\ResponsiveImages\TinyPlaceholderGenerator\Blurred::class, + ], + + /* + * When enabling this option, a route will be registered that will enable + * the Media Library Pro Vue and React components to move uploaded files + * in a S3 bucket to their right place. + */ + 'enable_vapor_uploads' => env('ENABLE_MEDIA_LIBRARY_VAPOR_UPLOADS', false), + + /* + * When converting Media instances to response the media library will add + * a `loading` attribute to the `img` tag. Here you can set the default + * value of that attribute. + * + * Possible values: 'lazy', 'eager', 'auto' or null if you don't want to set any loading instruction. + * + * More info: https://css-tricks.com/native-lazy-loading/ + */ + 'default_loading_attribute_value' => null, +]; diff --git a/database/migrations/2021_03_11_193303_create_media_table.php b/database/migrations/2021_03_11_193303_create_media_table.php new file mode 100644 index 0000000..378b046 --- /dev/null +++ b/database/migrations/2021_03_11_193303_create_media_table.php @@ -0,0 +1,32 @@ +bigIncrements('id'); + + $table->morphs('model'); + $table->uuid('uuid')->nullable()->unique(); + $table->string('collection_name'); + $table->string('name'); + $table->string('file_name'); + $table->string('mime_type')->nullable(); + $table->string('disk'); + $table->string('conversions_disk')->nullable(); + $table->unsignedBigInteger('size'); + $table->json('manipulations'); + $table->json('custom_properties'); + $table->json('generated_conversions'); + $table->json('responsive_images'); + $table->unsignedInteger('order_column')->nullable(); + + $table->nullableTimestamps(); + }); + } +} diff --git a/public/media/.gitignore b/public/media/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/public/media/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/resources/views/components/inputs/file.blade.php b/resources/views/components/inputs/file.blade.php new file mode 100644 index 0000000..b12e92c --- /dev/null +++ b/resources/views/components/inputs/file.blade.php @@ -0,0 +1,5 @@ +@props(['disabled' => false]) + +merge(['class' => 'focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50']) !!}> diff --git a/resources/views/recipes/edit.blade.php b/resources/views/recipes/edit.blade.php index 54cc688..c5cba72 100644 --- a/resources/views/recipes/edit.blade.php +++ b/resources/views/recipes/edit.blade.php @@ -4,7 +4,7 @@

{{ $title }}

-
+ @if ($recipe->exists)@method('put')@endif @csrf
@@ -67,6 +67,33 @@
+ +
+ @if($recipe->hasMedia()) +
+
Current image
+ + {{ $recipe->getFirstMedia()('preview') }} + +
+ + +
+
+ @endif +
+ @if($recipe->hasMedia()) + + @else + + @endif + + +
+
+
@@ -83,7 +110,7 @@
-
+