web-dev-qa-db-fra.com

Comment puis-je désactiver la mise en cache des modèles en mode développement?

À chaque fois que je modifie quelque chose dans les modèles, je dois vider le cache manuellement ... Est-il possible de désactiver la mise en cache des modèles en mode développement?

25
wino

Si vous utilisez PHP 5.5, alors je vous suggère de configurer opcache dans php.ini

opcache.revalidate_freq=0

Cette valeur définit la fréquence horaire à laquelle les vues doivent être mises à jour à partir du cache. Cette valeur est généralement de 60 secondes environ. En le mettant à 0, votre cache sera mis à jour à chaque fois.

11
phoops

J'ai utilisé la solution de "Gadoma" quelques fois. Mais puisqu'il n'y a pas de "filters.php" dans Laravel 5 , voici ma classe de middleware pour la dernière version de Laravel:

<?php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Routing\Middleware;

class CacheKiller implements Middleware {

    /**
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {

        $cachedViewsDirectory = app('path.storage').'/framework/views/';

        if ($handle = opendir($cachedViewsDirectory)) {

            while (false !== ($entry = readdir($handle))) {
                if(strstr($entry, '.')) continue;    
                @unlink($cachedViewsDirectory . $entry);    
            }

            closedir($handle);
        }

        return $next($request);

    }

}

Et dans votre Kernel.php:

protected $middleware = [
        ...
        'App\Http\Middleware\CacheKiller',
    ];

Pas la meilleure solution mais ça marche.

6
Simon Schneider

Selon cette demande , changez le pilote de cache de votre application en array pour l'environnement local.

6
Vikas Khunteta

Il semble que la lame utilise l'horodatage de fichier pour reconstruire les pages.

Ainsi, si les pages ne sont pas mises à jour directement par le serveur lame, plusieurs options s'offrent à vous:

1 - Si vous travaillez par FTP ou par un autre protocole distant, la date peut ne pas correspondre aux deux systèmes d’exploitation. Essayez de mettre votre client dans le futur ou votre serveur dans le passé (quelques secondes suffisent).

Rappel : pour les OS basés sur Linux, un simple date --set fonctionne, par exemple date --set 18:30:00 pour 18h30.

2 - (Repost wino comment) Votre client peut ne pas mettre à jour l'horodatage de votre fichier modifié. Vous devez éditer la configuration de votre IDE.

4
Ifnot

Il est plus difficile de déboguer quand je ne comprends pas vraiment votre configuration. Tout ce que je peux offrir comme aide, au lieu de supprimer le cache de vue directement, vous pouvez exécuter:

$ php artisan cache:clear

Vous pourriez probablement ajouter un processus (selon votre système d'exploitation) pour écouter les modifications de fichiers et exécuter automatiquement la commande.

4
Neo Ighodaro

Dans laravel 5.2: Créez un nouveau middleware, ajoutez à 'web' $middlewareGroups dans Kernel.php. Cela appellera la commande artisan pour effacer tous les fichiers de vue compilés.

namespace App\Http\Middleware;

use Artisan;
use Closure;

class ClearViewCache
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (env('APP_ENV') === 'local') {
            Artisan::call('view:clear');
        }

        return $next($request);
    }
}
2
Taylor

Vous pouvez essayer ce filtre de route en définissant le cache time sur 0 afin que votre vue soit recréée à chaque demande :)

De ce Gist ,

Route::filter('cache', function( $response = null )
{

    $uri = URI::full() == '/' ? 'home' : Str::slug( URI::full() );

    $cached_filename = "response-$uri";

    if ( is_null($response) )
    {
        return Cache::get( $cached_filename );
    }
    else if ( $response->status == 200 )
    {
        $cache_time = 30; // 30 minutes

        if ( $cache_time > 0 ) {
            Cache::put( $cached_filename , $response , $cache_time );
        }
    }

});

J'espère que cela vous aide, mais je ne l'ai pas testé, donc je ne peux pas garantir que ça va marcher.

1
Gadoma

Quelques problèmes supplémentaires liés à la mise en cache de la mise à niveau PHP 5.3 à PHP 5.5 sont disponibles ici: Laravel et afficher la mise en cache en développement - les modifications ne sont pas visibles immédiatement

0
Tim Ogilvy

Il suffit de mettre cela quelque part dans votre application:

if (env('APP_DEBUG')) ini_set('opcache.revalidate_freq', '0');
0
Rafael Beckel