这是我用来通过实时 firebase 执行所有任务的代码
class HomeController extends Controller
{
private $FIREBASE_DB_URL;
private $FIREBASE_JSON;
private $FIREBASE;
private $FACTORY;
public function __construct()
{
$this->middleware('auth');
$this->FIREBASE_DB_URL = env("FIREBASE_DB_URL");
$this->FIREBASE_JSON = getcwd(). DIRECTORY_SEPARATOR .'assets'.DIRECTORY_SEPARATOR.'tapmap-firebase.json';
$this->FIREBASE = (new Factory)->withServiceAccount($this->FIREBASE_JSON )->withDatabaseUri($this->FIREBASE_DB_URL)->createDatabase();
$this->FACTORY = (new Factory)->withServiceAccount($this->FIREBASE_JSON);
}
public function index()
{
$data = $this->FIREBASE->getReference('/')->getValue();
//render to blade file
return view('index',['users'=>$data]);
}
public function store(Request $request)
{
$this->validate($request,[
'title'=>'required',
'lat'=>'required',
'lng'=>'required'
]);
$lastId = 1;
if($request->lastId != null)
{
$lastId = $request->lastId;
}
// Save data to firebase without image
if(!$request->hasFile('pic'))
{
$this->FIREBASE->getReference('/'.$lastId)->set([
"title" => $request->title == '' ? '' : $request->title,
"address" => $request->address == '' ? '' : $request->address,
"description" => $request->description == '' ? '' : $request->description,
"phone" => $request->phone == '' ? '' : $request->phone,
"available_unavailable" => $request->available_unavailable == '' ? '' : $request->available_unavailable,
"indoor_outdoor" => $request->indoor_outdoor == '' ? '' : $request->indoor_outdoor,
"self_ask_a_member" => $request->self_ask_a_member == '' ? '' : $request->self_ask_a_member,
"lat" => $request->lat == '' ? '' : $request->lat,
"lng" => $request->lng == '' ? '' : $request->lng,
"pic" => "",
]);
}else{
$storage = $this->FACTORY->createStorage();
$image = $request->file('pic');
$localfolder = public_path('firebase-images') .'/';
$extension = $image->getClientOriginalExtension();
$file = $lastId. '.' . $extension;
$image_url = '';
// Upload image to firebase storage
if ($image->move($localfolder, $file)) {
$uploadedfile = fopen($localfolder.$file, 'r');
$image_url_object = $storage->getBucket()->upload($uploadedfile, [
'name' => 'tapImages/'.$file,
]);
unlink($localfolder . $file);
$expiresAt = new \DateTime('3100-01-01');
$image_url = $image_url_object->signedUrl($expiresAt);
}
$this->FIREBASE->getReference('/'.$lastId)->set([
"title" => $request->title,
"address" => $request->address,
"description" => $request->description,
"phone" => $request->phone,
"available_unavailable" => $request->available_unavailable,
"indoor_outdoor" => $request->indoor_outdoor,
"self_ask_a_member" => $request->self_ask_a_member,
"lat" => $request->lat,
"lng" => $request->lng,
"pic" => $image_url,
]);
}
return back();
}
// Update post record
public function update(Request $request)
{
$this->validate($request,[
'title'=>'required',
'lat'=>'required',
'lng'=>'required'
]);
if($request->updateID == '' || $request->updateID == null)
{
return back()->with('failed','Something went wrong');
}
if(!$request->hasFile('update-image')){
$this->FIREBASE->getReference('/'.$request->updateID)->set([
"title" => $request->title,
"address" => $request->address,
"description" => $request->description,
"phone" => $request->phone,
"available_unavailable" => $request->available_unavailable,
"indoor_outdoor" => $request->indoor_outdoor,
"self_ask_a_member" => $request->self_ask_a_member,
"lat" => $request->lat,
"lng" => $request->lng,
"pic" => $request->prev_user_pic == '' ? '' : $request->prev_user_pic,
]);
}else{
$storage = $this->FACTORY->createStorage();
if($request->prev_user_pic != '')
{
$var = explode('/', $request->prev_user_pic);
$key = array_search('tapImages', $var);
$string = $var[$key+1];
$file_name = strtok($string, '?');
$imageReference = $storage->getBucket()->object("tapImages/".$file_name);
if($imageReference->exists())
$imageReference->delete();
}
$image = $request->file('update-image');
$localfolder = public_path('firebase-images') .'/';
$extension = $image->getClientOriginalExtension();
$file = $request->updateID. '.' . $extension;
$image_url = '';
if ($image->move($localfolder, $file)) {
$uploadedfile = fopen($localfolder.$file, 'r');
$image_url_object = $storage->getBucket()->upload($uploadedfile, [
'name' => 'tapImages/'.$file,
]);
unlink($localfolder . $file);
$expiresAt = new \DateTime('3100-01-01');
$image_url = $image_url_object->signedUrl($expiresAt);
}
$this->FIREBASE->getReference('/'.$request->updateID)->set([
"title" => $request->title,
"address" => $request->address,
"description" => $request->description,
"phone" => $request->phone,
"available_unavailable" => $request->available_unavailable,
"indoor_outdoor" => $request->indoor_outdoor,
"self_ask_a_member" => $request->self_ask_a_member,
"lat" => $request->lat,
"lng" => $request->lng,
"pic" => $image_url,
]);
}
return back();
}
public function destroy(Request $request)
{
$factory = (new Factory)->withServiceAccount($this->FIREBASE_JSON);
$storage = $factory->createStorage();
$key = $request->id;
if($key == '' || $key == null)
{
return back()->with('failed','Record id does not exists');
}
// Delete the image of post
$post = $this->FIREBASE->getReference('/'.$key)->getValue();
if($post['pic'] != '')
{
$var = explode('/', $post['pic']);
$key_arr = array_search('tapImages', $var);
$string = $var[$key_arr+1];
$file_name = strtok($string, '?');
$imageReference = $storage->getBucket()->object("tapImages/".$file_name);
if($imageReference->exists())
$imageReference->delete();
}
// Delete post
if($this->FIREBASE->getReference('/'.$key)->remove())
{
return back()->with('success','Post removed successfully');
}
else
{
return back()->with('failed','Something went wrong!');
}
}
public function show($id)
{
// send post details with the help of id
$firebase = (new Factory)
->withServiceAccount($this->FIREBASE_JSON )
->withDatabaseUri($this->FIREBASE_DB_URL)
->createDatabase();
$data = $firebase->getReference('/'.$id)->getValue();
return $data;
}
}