2015-10-23 25 views
5

Voglio costruire una barra di avanzamento con lo stato del mio script php. Ho letto che potrebbe essere fatto usando session.upload_progress.Laravel 5.1 using session.upload_progress

Sto usando laravel Homestead e nel php.ini tutti i requisiti sono attivi.

Questo è il mio html

{!! Form::open(['route' => 'gebruikers_upload', 'class' => 'form-horizontal import', 'enctype' => 'multipart/form-data', 'target' => 'hidden_iframe']) !!} 
          <input type="hidden" value="myForm" name="{{ini_get("session.upload_progress.name")}}"> 
          <input type="file" name="file" id="the-file"/> 
          <button class="btn btn-sm btn-info btn_import" type="submit">Importeer</button> 
          <button class="btn btn-sm btn-danger" type="button">Cancel</button> 
         {!! Form::close() !!} 
         {{--End Form--}} 

         <iframe id="hidden_iframe" name="hidden_iframe" src="about:blank"></iframe> 

         <div class="progress"> 
          <div class="progress-bar progress-bar-striped active" role="progressbar" aria-valuenow="25" 
            aria-valuemin="0" aria-valuemax="100" style="width: 45%"> 
           <span class="">45% Complete</span> 
          </div> 
         </div> 

Quando submiting TE percorso è:

Route::get('dashboard/gebruikers/upload_status', '[email protected]'); 

E nel UserController controllore in modo uploadStatus ho questo

public function uploadStatus(Request $request) 
{ 
    session_start(); 

    echo '<pre>'; 
     print_r($_SESSION); 
    echo '</pre>'; 
} 

Ma mostra sempre un array vuoto. E quando uso questo codice

$data = $request->session()->all(); 

    echo '<pre>'; 
    print_r($data); 
    echo '</pre>'; 

Si restituisce questo

Array 
(
    [_token] => jFkleI9kIZJiZP3pEARx0hDrHtsynPmuGkse97nT 
    [_previous] => Array 
     (
      [url] => http://localhost.dev:8000/dashboard/gebruikers/upload_status 
     ) 

    [flash] => Array 
     (
      [old] => Array 
       (
       ) 

      [new] => Array 
       (
       ) 

     ) 

    [login_82e5d2c56bdd0811318f0cf078b78bfc] => 1 
) 

Ma non ci sono informazioni riguardo l'aggiornamento progresso.

come potrei usare questo con laravel 5.1

risposta

1

Laravel Documentation ha tutti i metodi necessari a pasticciare con la sessione.

$request->session()->put('key', 'value'); 

Si può semplicemente mettere tutto ciò che si desidera per la sessione in questo modo.

Come abbreviazione ausiliaria Laravel offre la funzione di supporto session(). Che accettano un array di "coppie di valori chiave" per impostare valori o solo una chiave per recuperare qualsiasi valore dalla sessione.

3

Ho riscontrato questo quando si tenta di risolvere un problema simile: l'aggiornamento del progresso di un processo di lunga durata sul lato client.

Il problema si riduce a questo: quando si effettua una richiesta al server, i valori di sessione non vengono scritti nell'archivio di sessione finché la risposta non viene restituita al client. In sostanza, il processo è simile al seguente:

 CLIENT   |  SERVER 
         |    . 
send request  ----|----> start processing 
         |    . 
         |    . 
         |    . 
         |  finish processing 
         |  write session values 
receive response <----|---- return response 

Quello che stai facendo è qualcosa di simile:

 CLIENT   |  SERVER 
         |    . 
send request  ----|----> start processing 
         |    . 
         |  (update session) 
         |    . 
         |  (update session) 
         |    . 
         |  (update session) 
         |    . 
         |  finish processing 
         |  write session values 
receive response <----|---- return response 

Ma quei (update session) chiamate sul server vengono ignorati - sono in realtà non sempre scritti il negozio di sessione. Pertanto, quando il client effettua una chiamata al percorso per richiedere il valore della sessione per lo stato di avanzamento, non riceve nulla.

La soluzione è semplice: scrivere il valore di avanzamento da qualche altra parte. Molto tempo fa ho risolto questo problema scrivendo il valore in un file usando file_put_contents. Se lo facessi oggi, probabilmente guarderei un server redis per una migliore efficienza.

Una cosa da notare, tuttavia: se si sceglie di scrivere il valore da qualche altra parte, è necessario avere un modo di associare il valore alla sessione. Altrimenti, altri utenti sovrascriveranno il tuo valore.Per un progetto semplice, probabilmente utilizzerei il valore ID dell'utente (supponendo che stiano elaborando solo una cosa alla volta).

+0

Questo è corretto, se si dovesse utilizzare il pacchetto illuminate/session al di fuori di Laravel sarà necessario chiamare il metodo 'save' sull'istanza SessionManager per salvare gli aggiornamenti nella variabile' $ _SESSION'. –