2015-05-01 4 views
7

Così ho deciso di andare da Laravel 4 a 5, che mi ha portato circa 1-2 giorni perché sapevo a malapena come fare la transizione. Durante l'aggiornamento della mia app mi sono imbattuto in un piccolo problema con JSON Pagination.Laravel 5 Cache/Paginate Numero

Questo codice è ciò che permette un PageQuery da impaginato Via KnockoutJS

/** 
* Builds paginate query with given parameters. 
* 
* @param array $params 
* @param integer $page 
* @param integer $perPage 
* 
* @return array 
*/ 
public function buildPaginateQuery(array $params, $page = 1, $perPage = 15) 
{ 
    $query = $this->model; 

    $query = $this->appendParams($params, $query); 

    $count = (new Cache)->remember('count', '2000', function() use ($query){ 
     return $query->count(); 
    }); 

    $totalPages = $count/$perPage; 

    $query = $query->skip($perPage * ($page - 1))->take($perPage); 

    $query = $query->order(isset($params['order']) && $params['order'] ? $params['order'] : null); 

    //$query = $query->cacheTags(array($this->model->table, 'pagination'))->remember(2000); 

    $query = (new Cache)->remember(array($this->model->table, 'pagination'), '2000', function() use ($query){ 
     return $query; 
    }); 

    return array('query' => $query, 'totalPages' => $totalPages, 'totalItems' => $count); 
} 

che alla fine portano a questo errore in questo screenshot TaggedFile Cache Error

L'errore indirizza al codice di cui sopra e questo codice specificamente

/** 
* Get the full path for the given cache key. 
* 
* @param string $key 
* @return string 
*/ 
protected function path($key) 
{ 
    $parts = array_slice(str_split($hash = md5($key), 2), 0, 2); 
    $path = $this->directory() . '/'.join('/', $parts).'/'.$hash; 

    //unset the tags so we use the base cache folder if no 
    //tags are passed with subsequent call to the same instance 
    //of this class 
    //$this->tags = array(); 

    return $path; 
} 

Im utilizzando un Cache Driver personalizzato chiamato TaggedFile. Questo ha funzionato bene in L4 ma ha incontrato errori perché alcuni file sono stati rimossi all'interno di Cache Alias. Come lo StoreInterface. Posso ricevere aiuto per questo? Se hai bisogno che postero qualcosa, lo farò.

Altro soggetto:

Prima ho usato questo per registrare il driver taggedFile in global.php:

Cache::extend('taggedFile', function($app) 
{ 
    return new Illuminate\Cache\Repository(new Lib\Extensions\TaggedFileCache); 
}); 

Non so esattamente dove mettere questo. Qualcuno sa l'equivalente di quello? Ho provato a metterlo in AppServiceProvider ma un errore si avvicinò dicendo:

Call to undefined method Illuminate\Support\Facades\Cache::extend() 

Questo usato per lavorare in L4 così ho deciso di andare nella cartella vendor trovare manualmente quale fosse il problema ....

Questo aveva solo: getFacadeAccessor (che L4 aveva anche solo esteso) Quindi ho deciso di usare getFacadeAccessor e ha funzionato, ma non so se quella fosse la soluzione o meno.

risposta

0

Come avrete notato si sta passando un array come un valore di $ chiave, il modo più sicuro sarebbe quello di sostituire il codice

$parts = array_slice(str_split($hash = md5($key), 2), 0, 2); 

Con

$parts = array_slice(str_split($hash = md5(json_encode($key)), 2), 0, 2); 

NB: Non sono sicuro di quale versione di php che stai utilizzando, ma json_encode (...) è normalmente più veloce della serializzazione (...)