2015-10-23 5 views
5

Я хочу построить панель progess со статусом моего php-скрипта. Я прочитал, что это можно сделать с помощью session.upload_progress.Laravel 5.1 using session.upload_progress

Я использую laravel Homestead, а в php.ini все заявки активны.

Это мой 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> 

Когда завершения заполнения тэ маршрут является:

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

И в UserController контроллер в методе uploadStatus у меня есть этот

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

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

Но это всегда показывает пустой массив. И когда я использую этот код

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

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

возвращает этот

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

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

      [new] => Array 
       (
       ) 

     ) 

    [login_82e5d2c56bdd0811318f0cf078b78bfc] => 1 
) 

Но нет информации об обновлении прогресса.

Как я мог бы использовать это с Laravel 5,1

ответ

1

Laravel Documentation имеет все методы, необходимые для замарать сессии.

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

Вы можете просто положить все, что хотите на сеанс, как это.

В качестве вспомогательного сокращения Laravel предлагает вам session() вспомогательную функцию. Которые принимают массив «пар ключей» для установки значений или только ключ для извлечения любого значения из сеанса.

3

Я столкнулся с этим при попытке решить аналогичную проблему: обновление хода долговременного процесса на стороне клиента.

Проблема сводится к следующему: когда вы делаете запрос на сервер, значения сеанса не записываются в хранилище сеансов до тех пор, пока ответ не будет возвращен клиенту. В принципе, процесс выглядит следующим образом:

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

Что вы делаете что-то вроде этого:

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

Но эти (update session) вызовов на сервере игнорируются - они на самом деле не получать записываются хранилище сеансов. Поэтому, когда клиент делает вызов на ваш маршрут, чтобы запросить значение сеанса для прогресса, он ничего не получает.

Решение прост: укажите значение прогресса в другом месте. Давным-давно я решил это, записав значение в файл, используя file_put_contents. Если бы я делал это сегодня, я бы, вероятно, посмотрел на сервер redis для повышения эффективности.

Следует отметить, однако, что если вы решите написать значение где-то еще, вам нужно каким-то образом связать значение с сеансом. В противном случае другие пользователи будут перезаписывать ваше значение.Для простого проекта я бы, вероятно, использовал значение идентификатора пользователя (предполагая, что он будет обрабатывать только одну вещь за раз).

+0

Правильно, если вы должны были использовать пакет освещения/сеанса вне Laravel, вам нужно будет вызвать метод save на экземпляре SessionManager, чтобы сохранить обновления переменной '$ _SESSION'. –