parent
f97c6a56ec
commit
d77458f792
@ -22,9 +22,6 @@ class UserController extends Controller
|
|||||||
$user_id = Auth::user()->getAuthIdentifier();
|
$user_id = Auth::user()->getAuthIdentifier();
|
||||||
$user = User::find($user_id);
|
$user = User::find($user_id);
|
||||||
$validated = $request->validated();
|
$validated = $request->validated();
|
||||||
if (!array_key_exists('encrypt_messages', $validated)) {
|
|
||||||
$validated['encrypt_messages'] = 0;
|
|
||||||
}
|
|
||||||
if (isset($validated['avatar'])) {
|
if (isset($validated['avatar'])) {
|
||||||
try {
|
try {
|
||||||
$user->clearMediaCollection('avatars');
|
$user->clearMediaCollection('avatars');
|
||||||
@ -33,7 +30,13 @@ class UserController extends Controller
|
|||||||
} catch (FileDoesNotExist $e) {
|
} catch (FileDoesNotExist $e) {
|
||||||
} catch (FileIsTooBig $e) {
|
} catch (FileIsTooBig $e) {
|
||||||
}
|
}
|
||||||
|
unset($validated['avatar']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!array_key_exists('encrypt_messages', $validated)) {
|
||||||
|
$validated['encrypt_messages'] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
$user->update($validated);
|
$user->update($validated);
|
||||||
|
|
||||||
return redirect(route('user.index'))->withSuccess('Data saved!');
|
return redirect(route('user.index'))->withSuccess('Data saved!');
|
||||||
|
@ -25,11 +25,11 @@ class UpdateUser extends FormRequest
|
|||||||
public function rules()
|
public function rules()
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'name' => 'required|min:4|max:255',
|
'name' => 'required|min:4|max:255',
|
||||||
'email' => 'required|email:rfc|unique:users,email,'.Auth::user()->getAuthIdentifier(),
|
'email' => 'required|email:rfc|unique:users,email,'.Auth::user()->getAuthIdentifier(),
|
||||||
'encrypt_messages' => 'boolean',
|
'encrypt_messages' => 'boolean',
|
||||||
'notification_hour' => 'in:0,1,2,3,4',
|
'notification_hour' => 'in:0,1,2,3,4',
|
||||||
'avatar' => 'file|dimensions:min_width=50,min_height=50,max_width=200,max_height=200,ratio=1'
|
'avatar' => 'file|dimensions:max_width=200,max_height=200,ratio=1'
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
25
app/User.php
25
app/User.php
@ -5,6 +5,7 @@ namespace App;
|
|||||||
use Illuminate\Contracts\Auth\MustVerifyEmail;
|
use Illuminate\Contracts\Auth\MustVerifyEmail;
|
||||||
use Illuminate\Foundation\Auth\User as Authenticatable;
|
use Illuminate\Foundation\Auth\User as Authenticatable;
|
||||||
use Illuminate\Notifications\Notifiable;
|
use Illuminate\Notifications\Notifiable;
|
||||||
|
use Illuminate\Support\Facades\Log;
|
||||||
use Spatie\Image\Exceptions\InvalidManipulation;
|
use Spatie\Image\Exceptions\InvalidManipulation;
|
||||||
use Spatie\MediaLibrary\HasMedia\HasMedia;
|
use Spatie\MediaLibrary\HasMedia\HasMedia;
|
||||||
use Spatie\MediaLibrary\HasMedia\HasMediaTrait;
|
use Spatie\MediaLibrary\HasMedia\HasMediaTrait;
|
||||||
@ -20,7 +21,7 @@ class User extends Authenticatable implements HasMedia
|
|||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $fillable = [
|
protected $fillable = [
|
||||||
'name', 'email', 'password', 'notification_hour', 'encrypt_messages', 'avatar',
|
'name', 'email', 'password', 'notification_hour', 'encrypt_messages',
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -37,14 +38,8 @@ class User extends Authenticatable implements HasMedia
|
|||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The attributes that should be cast to native types.
|
* @return string
|
||||||
*
|
|
||||||
* @var array
|
|
||||||
*/
|
*/
|
||||||
// protected $casts = [
|
|
||||||
// 'email_verified_at' => 'datetime',
|
|
||||||
// ];
|
|
||||||
|
|
||||||
public function getFolder()
|
public function getFolder()
|
||||||
{
|
{
|
||||||
$arrayHash = str_split(strtolower(md5($this->id)));
|
$arrayHash = str_split(strtolower(md5($this->id)));
|
||||||
@ -66,9 +61,15 @@ class User extends Authenticatable implements HasMedia
|
|||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
$this->addMediaConversion('thumb')
|
$this->addMediaConversion('thumb')
|
||||||
->width(50)
|
->width(100)
|
||||||
->height(50);
|
->height(100)
|
||||||
|
->optimize();
|
||||||
|
$this->addMediaConversion('icon')
|
||||||
|
->width(32)
|
||||||
|
->height(32)
|
||||||
|
->optimize();
|
||||||
} catch (InvalidManipulation $e) {
|
} catch (InvalidManipulation $e) {
|
||||||
|
Log::alert(sprintf('Error while manipulating Avatar for %s (%s)', $this->email, $e->getMessage()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,8 +77,8 @@ class User extends Authenticatable implements HasMedia
|
|||||||
* @param string $alias
|
* @param string $alias
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function getAvatar($alias = 'thumb')
|
public function getAvatar($alias = 'thumb'): string
|
||||||
{
|
{
|
||||||
return $this->getFirstMediaUrl('avatars');
|
return $this->getFirstMediaUrl('avatars', $alias);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
156
config/medialibrary.php
Normal file
156
config/medialibrary.php
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return [
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The disk on which to store added files and derived images by default. Choose
|
||||||
|
* one or more of the disks you've configured in config/filesystems.php.
|
||||||
|
*/
|
||||||
|
'disk_name' => env('MEDIA_DISK', 'public'),
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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' => '',
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The fully qualified class name of the media model.
|
||||||
|
*/
|
||||||
|
'media_model' => Spatie\MediaLibrary\Models\Media::class,
|
||||||
|
|
||||||
|
's3' => [
|
||||||
|
/*
|
||||||
|
* The domain that should be prepended when generating urls.
|
||||||
|
*/
|
||||||
|
'domain' => 'https://'.env('AWS_BUCKET').'.s3.amazonaws.com',
|
||||||
|
],
|
||||||
|
|
||||||
|
'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/v7/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 medialibrary will use a tiny blurred jpg image.
|
||||||
|
*/
|
||||||
|
'tiny_placeholder_generator' => Spatie\MediaLibrary\ResponsiveImages\TinyPlaceholderGenerator\Blurred::class,
|
||||||
|
],
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When urls to files get generated, this class will be called. Leave empty
|
||||||
|
* if your files are stored locally above the site root or on s3.
|
||||||
|
*/
|
||||||
|
'url_generator' => null,
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 class that contains the strategy for determining a media file's path.
|
||||||
|
*/
|
||||||
|
'path_generator' => null,
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Medialibrary 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 => [
|
||||||
|
'--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
|
||||||
|
],
|
||||||
|
],
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These generators will be used to create an image of media files.
|
||||||
|
*/
|
||||||
|
'image_generators' => [
|
||||||
|
Spatie\MediaLibrary\ImageGenerators\FileTypes\Image::class,
|
||||||
|
Spatie\MediaLibrary\ImageGenerators\FileTypes\Webp::class,
|
||||||
|
Spatie\MediaLibrary\ImageGenerators\FileTypes\Pdf::class,
|
||||||
|
Spatie\MediaLibrary\ImageGenerators\FileTypes\Svg::class,
|
||||||
|
Spatie\MediaLibrary\ImageGenerators\FileTypes\Video::class,
|
||||||
|
],
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The engine that should perform the image conversions.
|
||||||
|
* Should be either `gd` or `imagick`.
|
||||||
|
*/
|
||||||
|
'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'),
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The path where to store temporary files while performing image conversions.
|
||||||
|
* If set to null, storage_path('medialibrary/temp') will be used.
|
||||||
|
*/
|
||||||
|
'temporary_directory_path' => null,
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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\Jobs\PerformConversions::class,
|
||||||
|
'generate_responsive_images' => Spatie\MediaLibrary\Jobs\GenerateResponsiveImages::class,
|
||||||
|
],
|
||||||
|
];
|
@ -55,14 +55,16 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="dropdown">
|
<div class="dropdown">
|
||||||
<a href="#" class="nav-link pr-0 leading-none" data-toggle="dropdown">
|
<a href="#" class="nav-link pr-0 leading-none" data-toggle="dropdown">
|
||||||
@php($avatar = Auth::user()->getAvatar())
|
@php($avatar = Auth::user()->getAvatar('icon'))
|
||||||
<span class="avatar">
|
|
||||||
@if($avatar !== '')
|
@if($avatar !== '')
|
||||||
<img src="{{ Auth::user()->getAvatar() }}"/>
|
<span>
|
||||||
|
<img src="{{ $avatar }}"/>
|
||||||
|
</span>
|
||||||
@else
|
@else
|
||||||
{{ substr(Auth::user()->name, 0, 1) }}
|
<span class="avatar">
|
||||||
|
{{ substr(Auth::user()->name, 0, 1) }}
|
||||||
|
</span>
|
||||||
@endif
|
@endif
|
||||||
</span>
|
|
||||||
<span class="ml-2 d-none d-lg-block">
|
<span class="ml-2 d-none d-lg-block">
|
||||||
<span class="text-default">{{ Auth::user()->name }}</span>
|
<span class="text-default">{{ Auth::user()->name }}</span>
|
||||||
<small class="text-muted d-block mt-1"></small>
|
<small class="text-muted d-block mt-1"></small>
|
||||||
|
Loading…
Reference in New Issue
Block a user