2016-05-05 2 views
0

Я делаю api для бронирования бронировочных приложений, таких как uber и ola, используя laravel. При этом клиент отправит запрос на доступный водитель кабины, используя gcm, и водитель кабины примет запрос. этот процесс, когда клиент нажимает кнопку запроса, будет загружаться до тех пор, пока драйвер не примет запрос. Когда водитель примет запрос, клиент получит информацию о драйвере и водитель получит информацию о клиенте. Как я могу это сделать в laravel .. ??Как получить идентификатор автоматически в db

Я могу послать запрос клиента, используя код ниже:

public function customer_booking(Request $req) 
{ 
    if ($req->isMethod('post')) 
    { 
     $customer_id=$req->customer_id; 
     $driver_type=$req->type_id; 
     //getting driver 
     $res=DriverLatLongModel::where('driver_type',$driver_type) 
      ->where('booking_status','3')->orwhere('booking_status','2') 
      ->where('active_status','0')->orderBy('created_at', 'desc')->first(); 
     $driver_lat=''; 
     $driver_long=''; 
     $driver_id_booking=''; 
     if(empty($res)) 
     { 
      $gcm_data[]=array('status'=>'0'); 
      return Response::json(array('message'=>$gcm_data), 200); 

     } 
     else 
     { 
      $driver_id_booking=$res->driver_id; 
     } 
      $registration_id = array(); 
      //getting gcm id 
      $driver_position = DriverLatLongModel::where('driver_id',$driver_id_booking)->get(); 
       foreach($driver_position as $resid) 
       { 
        array_push($registration_id , $resid['registration_id']); 
       } 

     //send gcm 
     $url = 'https://android.googleapis.com/gcm/send'; 
     $message_gcm = array("Status"=>"1","Notice" =>"WELCOME","customer_id"=>$customer_id); 
     $fields = array(
      'registration_ids' => $registration_id , 
      'data' => $message_gcm , 
     ); 
     $headers = array(
      'Authorization: key=AIzaSyDCDmsrv3ELqD_6qseFgERciRnmm9uBtNg', 
      'Content-Type: application/json' 
     ); 
     $ch = curl_init(); 
     curl_setopt($ch, CURLOPT_URL, $url); 
     curl_setopt($ch, CURLOPT_POST, true); 
     curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields)); 
     $result = curl_exec($ch); 
     if ($result === FALSE) { 
      die('Curl failed: ' . curl_error($ch)); 
     } 
     curl_close($ch); 
     $driver_data=array(); 
     //getting result of driver side 
     $finding_donor_loc=CustomerBookingModel::getCustomer($customer_id); 
     if(empty($finding_donor_loc)) 
     { 
      $driver_data[]=array('status'=>'0'); 
     } 
     else 
     { 
      //getting driver details 
      $driver_details=DriverDetailsModel::where('driver_id',$finding_donor_loc)->first(); 
      $driver_name=$driver_details->driver_name; 
      $driver_data[]=array('status'=>'1','driver_name'=>$driver_name); 
     } 
     return Response::json(array('message'=>$driver_data), 200); 
    } 

} 

Я использую класс Helper написать codeing для ожидания, пока водитель не принимает запрос:

public static function getCustomer($customer_id) 
     { 
      $duration =15; // Duration of the loop in seconds 
      $sleep = 5;// Sleep beetween each execution (with stuff execution) 
      for ($i = 0; $i < floor($duration/$sleep); ++$i) 
      { 
       $start = microtime(true); 
       $users = DB::table('booking_information') 
        ->where('customer_id',$customer_id)->where('booking_status','1') 
        ->where('book_confirm','1')->orderBy('created_at', 'asc')->first(); 
       time_sleep_until($start + $sleep); 
      } 
      if(empty($users)) 
     { 
      $confim_driver_id='0'; 
      return $confim_driver_id; 
     } 
     else 
     { 
      $confim_driver_id=$users ->driver_id; 
      return $confim_driver_id; 
     } 

    } 

вспомогательный класс сделать работа получить идентификатор драйвера, когда они принимают запрос в течение 15 секунд. Это работает для меня, но драйвер примет запрос в течение 15 секунд. Как я могу обойтись без времени, чтобы проверить db, если присутствует идентификатор драйвера или нет, а также он будет загружаться на стороне клиента, пока driv er согласен с запросом. !!

ответ

0

Если вы хотите вернуть подтверждение бронирования пользователю, как только будет подтверждено бронирование, вы можете поместить условие IF в свой цикл &, вернув драйвер, сразу же, как только условия будут выполнены.

$duration = 15; // Duration of the loop in seconds 
    $sleep  = 5; // Sleep between each execution (with stuff execution) 

    for ($i = 0; $i < floor($duration/$sleep); ++$i) 
    { 

     $start = microtime(true); 

     // query the database to check if the booking is confirmed 
     $booking = DB::table('booking_information') 
     ->where('customer_id', $customer_id) 
     ->where('booking_status', '1') 
     ->where('book_confirm', '1') 
     ->orderBy('created_at', 'asc') 
     ->first(); 

     // if the booking is confirmed then return the driver_id 
     // return will also stop the loop 
     if($booking) { 
      return $booking->driver_id; 
     } 

     // Make the script execution sleep 
     time_sleep_until($start + $sleep); 

    } 

    // if booking is not confirmed then return 0 
    if(empty($booking)) return 0; 

Лучший способ сделать задачу, как это в Laravel может быть достигнут с помощью событий & слушателей. Рабочий процесс будет примерно таким.

1. Your API recieves a request to book a cab 
2. A NewBookingRequest event is fired & NewBookingRequestListener sends a push notificaton to the nearest driver about the new booking 
3. Driver confirms/denies the booking & your API fires BookingConfirmed/BookingDenied event 
4. Notification is sent to the user about the booking 
Смежные вопросы