Laravel 6

Storage Production et Developpement

Avatar de Lyneo
Lyneo

Bonjour à tous.

J'au un soucis que je n'arrive pas à résoudre. Je souhaiterai que mon application stocke les fichier en local quand je suis en devloppement et sur S3 quand je suis en production. Pour eviter de modifier l'ensemble des lignes de mon code dans ce style:

En developpement:

Storage::disk('local')->put('/users/normal/'.$filename, (string)$normal, 'public');

En production:

Storage::disk('s3')->put('/users/normal/'.$filename, (string)$normal, 'public');

Le lien vers public a étét fait:

php artisan storage:link

Pour ce faire j'ai rajouter cette variable d'environnement dans ".env" quand je suis en dev:

    FILESYSTEM_DRIVER=local

Et celle là quand je suis en prod

    FILESYSTEM_DRIVER=production

Mon fichier filsystems.php est construite ainsi:

<?php

return [

    'local' => env('FILESYSTEM_DRIVER', 'local'),

    'production' => env('FILESYSTEM_CLOUD', 's3'),

    'disks' => [

        'local' => [
            'driver' => 'local',
            'root' => storage_path('app'),
        ],

        'public' => [
            'driver' => 'local',
            'root' => storage_path('app/public'),
            'url' => env('APP_URL').'/storage',
            'visibility' => 'public',
        ],

        's3' => [
            'driver' => 's3',
            'key' => env('AWS_ACCESS_KEY_ID'),
            'secret' => env('AWS_SECRET_ACCESS_KEY'),
            'region' => env('AWS_DEFAULT_REGION'),
            'bucket' => env('AWS_BUCKET'),
            'url' => env('AWS_URL'),
        ],

    ],

];

Quand j'essaye de stocker une photo par exemple, j'utilise cette ligne:

$file = Storage::put('/users/small/'.$filename, (string)$small, 'public');

et pour la rappeller:

$file = Storage::get('users/small/'. Auth::user()->avatar');

Le message d'erreur:

Facade\Ignition\Exceptions\ViewException Disk [] does not have a configured driver.

Pouvez-vous me guider sur ce sujet svp?

Posté il y a 1 mois
Avatar de bestmomo
bestmomo

Salut,

Ces deux lignes là sont inutiles :

return [

    'local' => env('FILESYSTEM_DRIVER', 'local'),

    'production' => env('FILESYSTEM_CLOUD', 's3'),

    ...

Si tu utilises le système par défaut sans préciser de disque tu as juste à entrer ça dans .env :

FILESYSTEM_DRIVER=local  <-  pour le développement

FILESYSTEM_DRIVER=s3  <-  pour la production

On précise le disque du cloud si on veut utiliser la syntaxe raccourcie Storage::cloud().

Posté il y a 1 mois
Avatar de Lyneo
Lyneo

Merci pour ta réponse, j'ai bien pris en compte tes recommandations, en changeant mon .env et en supprimant les lignes inutiles.

Mais mon problème est identique:

Facade\Ignition\Exceptions\ViewException Disk [] does not have a configured driver.

Ce que je ne comprends pas, c'est quelle ligne dans mon code doit être saisie pour que ce soit générique, sans devoir modifier le developpement ou la production.

Pour l'instant ces lignes fonctionnent:

Storage::disk('local')->url('users/small/'.file.png  <- en développement
Storage::disk('s3')->url('users/small/'.file.png  <- en production

Mais je ne peux pas utiliser cette syntaxe, car je suis obligé de modifier un nombre incalculable de ligne pour passer en production (controleurs, vues etc...)

N'y a t'il pas moyen d'utiliser un système générique? Je porécise que ceci ne fonctionne pas (cf message d'erreur).

Storage::get('users/small/'. Auth::user()->avatar');

Merci pour vos retours

Posté il y a 1 mois
Avatar de bestmomo
bestmomo

Par défaut dans la configuration on a :

'default' => env('FILESYSTEM_DRIVER', 'local'),

'disks' => [

    'local' => [
        'driver' => 'local',
        'root' => storage_path('app'),
    ],

Et dans .env on a rien par défaut. Donc si on fait :

Storage::get('file.jpg');

On va chercher le fichier dans storage_path. Si tu renseignes FILESYSTEM_DRIVER dans .env :

FILESYSTEM_DRIVER=s3

Alors cette fois c'est le disque s3 qui est choisi par défaut.

Posté il y a 1 mois
Avatar de Lyneo
Lyneo

Merci, c'est beaucoup plus clair, et ça fonctionne :)

Posté il y a 1 mois

Vous ne pouvez pas répondre à ce sujet.