Cheetah
FacebookBatchRequest.php
Go to the documentation of this file.
1 <?php
24 namespace Facebook;
25 
26 use ArrayIterator;
27 use IteratorAggregate;
28 use ArrayAccess;
31 
37 class FacebookBatchRequest extends FacebookRequest implements IteratorAggregate, ArrayAccess
38 {
42  protected $requests;
43 
47  protected $attachedFiles;
48 
57  public function __construct(FacebookApp $app = null, array $requests = [], $accessToken = null, $graphVersion = null)
58  {
59  parent::__construct($app, $accessToken, 'POST', '', [], null, $graphVersion);
60 
61  $this->add($requests);
62  }
63 
75  public function add($request, $options = null)
76  {
77  if (is_array($request)) {
78  foreach ($request as $key => $req) {
79  $this->add($req, $key);
80  }
81 
82  return $this;
83  }
84 
85  if (!$request instanceof FacebookRequest) {
86  throw new \InvalidArgumentException('Argument for add() must be of type array or FacebookRequest.');
87  }
88 
89  if (null === $options) {
90  $options = [];
91  } elseif (!is_array($options)) {
92  $options = ['name' => $options];
93  }
94 
95  $this->addFallbackDefaults($request);
96 
97  // File uploads
98  $attachedFiles = $this->extractFileAttachments($request);
99 
100  $name = isset($options['name']) ? $options['name'] : null;
101 
102  unset($options['name']);
103 
104  $requestToAdd = [
105  'name' => $name,
106  'request' => $request,
107  'options' => $options,
108  'attached_files' => $attachedFiles,
109  ];
110 
111  $this->requests[] = $requestToAdd;
112 
113  return $this;
114  }
115 
123  public function addFallbackDefaults(FacebookRequest $request)
124  {
125  if (!$request->getApp()) {
126  $app = $this->getApp();
127  if (!$app) {
128  throw new FacebookSDKException('Missing FacebookApp on FacebookRequest and no fallback detected on FacebookBatchRequest.');
129  }
130  $request->setApp($app);
131  }
132 
133  if (!$request->getAccessToken()) {
134  $accessToken = $this->getAccessToken();
135  if (!$accessToken) {
136  throw new FacebookSDKException('Missing access token on FacebookRequest and no fallback detected on FacebookBatchRequest.');
137  }
138  $request->setAccessToken($accessToken);
139  }
140  }
141 
151  public function extractFileAttachments(FacebookRequest $request)
152  {
153  if (!$request->containsFileUploads()) {
154  return null;
155  }
156 
157  $files = $request->getFiles();
158  $fileNames = [];
159  foreach ($files as $file) {
160  $fileName = uniqid();
161  $this->addFile($fileName, $file);
162  $fileNames[] = $fileName;
163  }
164 
165  $request->resetFiles();
166 
167  // @TODO Does Graph support multiple uploads on one endpoint?
168  return implode(',', $fileNames);
169  }
170 
176  public function getRequests()
177  {
178  return $this->requests;
179  }
180 
184  public function prepareRequestsForBatch()
185  {
186  $this->validateBatchRequestCount();
187 
188  $params = [
189  'batch' => $this->convertRequestsToJson(),
190  'include_headers' => true,
191  ];
192  $this->setParams($params);
193  }
194 
200  public function convertRequestsToJson()
201  {
202  $requests = [];
203  foreach ($this->requests as $request) {
204  $options = [];
205 
206  if (null !== $request['name']) {
207  $options['name'] = $request['name'];
208  }
209 
210  $options += $request['options'];
211 
212  $requests[] = $this->requestEntityToBatchArray($request['request'], $options, $request['attached_files']);
213  }
214 
215  return json_encode($requests);
216  }
217 
223  public function validateBatchRequestCount()
224  {
225  $batchCount = count($this->requests);
226  if ($batchCount === 0) {
227  throw new FacebookSDKException('There are no batch requests to send.');
228  } elseif ($batchCount > 50) {
229  // Per: https://developers.facebook.com/docs/graph-api/making-multiple-requests#limits
230  throw new FacebookSDKException('You cannot send more than 50 batch requests at a time.');
231  }
232  }
233 
244  public function requestEntityToBatchArray(FacebookRequest $request, $options = null, $attachedFiles = null)
245  {
246 
247  if (null === $options) {
248  $options = [];
249  } elseif (!is_array($options)) {
250  $options = ['name' => $options];
251  }
252 
253  $compiledHeaders = [];
254  $headers = $request->getHeaders();
255  foreach ($headers as $name => $value) {
256  $compiledHeaders[] = $name . ': ' . $value;
257  }
258 
259  $batch = [
260  'headers' => $compiledHeaders,
261  'method' => $request->getMethod(),
262  'relative_url' => $request->getUrl(),
263  ];
264 
265  // Since file uploads are moved to the root request of a batch request,
266  // the child requests will always be URL-encoded.
267  $body = $request->getUrlEncodedBody()->getBody();
268  if ($body) {
269  $batch['body'] = $body;
270  }
271 
272  $batch += $options;
273 
274  if (null !== $attachedFiles) {
275  $batch['attached_files'] = $attachedFiles;
276  }
277 
278  return $batch;
279  }
280 
286  public function getIterator()
287  {
288  return new ArrayIterator($this->requests);
289  }
290 
294  public function offsetSet($offset, $value)
295  {
296  $this->add($value, $offset);
297  }
298 
302  public function offsetExists($offset)
303  {
304  return isset($this->requests[$offset]);
305  }
306 
310  public function offsetUnset($offset)
311  {
312  unset($this->requests[$offset]);
313  }
314 
318  public function offsetGet($offset)
319  {
320  return isset($this->requests[$offset]) ? $this->requests[$offset] : null;
321  }
322 }
Facebook\FacebookBatchRequest\$attachedFiles
$attachedFiles
Definition: FacebookBatchRequest.php:47
Facebook\FacebookRequest\setApp
setApp(FacebookApp $app=null)
Definition: FacebookRequest.php:171
Facebook\FacebookRequest\getHeaders
getHeaders()
Definition: FacebookRequest.php:289
Facebook\FacebookBatchRequest\addFallbackDefaults
addFallbackDefaults(FacebookRequest $request)
Definition: FacebookBatchRequest.php:123
Facebook\FacebookBatchRequest
Definition: FacebookBatchRequest.php:38
Facebook\Exceptions\FacebookSDKException
Definition: FacebookSDKException.php:32
use
GNU LESSER GENERAL PUBLIC LICENSE February Free Software Inc Franklin Fifth MA USA Everyone is permitted to copy and distribute verbatim copies of this license but changing it is not allowed[This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it By the GNU General Public Licenses are intended to guarantee your freedom to share and change free software to make sure the software is free for all its users This the Lesser General Public applies to some specially designated software packages typically libraries of the Free Software Foundation and other authors who decide to use it You can use it but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular based on the explanations below When we speak of free we are referring to freedom of use
Definition: license.txt:27
Facebook\FacebookRequest\resetFiles
resetFiles()
Definition: FacebookRequest.php:393
Facebook\FacebookRequest\containsFileUploads
containsFileUploads()
Definition: FacebookRequest.php:413
php
Facebook\FacebookRequest\getUrl
getUrl()
Definition: FacebookRequest.php:505
Facebook\FacebookRequest\setAccessToken
setAccessToken($accessToken)
Definition: FacebookRequest.php:115
Facebook\Authentication\AccessToken
Definition: AccessToken.php:32
Facebook\FacebookRequest\getMethod
getMethod()
Definition: FacebookRequest.php:228
Facebook\FacebookBatchRequest\getIterator
getIterator()
Definition: FacebookBatchRequest.php:286
Facebook\FacebookRequest\getFiles
getFiles()
Definition: FacebookRequest.php:403
Facebook\FacebookBatchRequest\validateBatchRequestCount
validateBatchRequestCount()
Definition: FacebookBatchRequest.php:223
Facebook\FacebookBatchRequest\getRequests
getRequests()
Definition: FacebookBatchRequest.php:176
Facebook\FacebookBatchRequest\offsetUnset
offsetUnset($offset)
Definition: FacebookBatchRequest.php:310
Facebook\FacebookBatchRequest\$requests
$requests
Definition: FacebookBatchRequest.php:42
Facebook\FacebookApp
Definition: FacebookApp.php:30
Facebook\FacebookBatchRequest\prepareRequestsForBatch
prepareRequestsForBatch()
Definition: FacebookBatchRequest.php:184
Facebook\FacebookBatchRequest\requestEntityToBatchArray
requestEntityToBatchArray(FacebookRequest $request, $options=null, $attachedFiles=null)
Definition: FacebookBatchRequest.php:244
Facebook
Facebook\FacebookRequest\getUrlEncodedBody
getUrlEncodedBody()
Definition: FacebookRequest.php:451
Facebook\FacebookRequest\getApp
getApp()
Definition: FacebookRequest.php:181
Facebook\FacebookBatchRequest\extractFileAttachments
extractFileAttachments(FacebookRequest $request)
Definition: FacebookBatchRequest.php:151
Facebook\FacebookBatchRequest\offsetSet
offsetSet($offset, $value)
Definition: FacebookBatchRequest.php:294
Facebook\FacebookBatchRequest\__construct
__construct(FacebookApp $app=null, array $requests=[], $accessToken=null, $graphVersion=null)
Definition: FacebookBatchRequest.php:57
Facebook\FacebookBatchRequest\add
add($request, $options=null)
Definition: FacebookBatchRequest.php:75
Facebook\FacebookRequest\getAccessToken
getAccessToken()
Definition: FacebookRequest.php:151
Facebook\FacebookBatchRequest\offsetGet
offsetGet($offset)
Definition: FacebookBatchRequest.php:318
as
as
Definition: Filter.ExtractStyleBlocks.Escaping.txt:10
Facebook\FacebookBatchRequest\convertRequestsToJson
convertRequestsToJson()
Definition: FacebookBatchRequest.php:200
Facebook\FacebookRequest
Definition: FacebookRequest.php:40
Facebook\FacebookBatchRequest\offsetExists
offsetExists($offset)
Definition: FacebookBatchRequest.php:302