Slide 1

Slide 1 text

FACEBOOK PHP SDK V4 THE NEW GRAPH API AND WHY YOU'RE GONNA HAVE TO REWRITE all the things

Slide 2

Slide 2 text

HI! I'M @SAMMYK

Slide 3

Slide 3 text

HISTORY OF GRAPH

Slide 4

Slide 4 text

New IN GRAPH

Slide 5

Slide 5 text

VERSIONING! HTTPS://GRAPH.FACEBOOK.COM/V2.0/

Slide 6

Slide 6 text

APP-SCOPED USER ID'S

Slide 7

Slide 7 text

BETTER PERMISSION MANAGEMENT

Slide 8

Slide 8 text

NEW GRAPH edges ▸ /user/taggable_friends ▸ /user/invitable_friends ▸ /user/idsforbusiness

Slide 9

Slide 9 text

MORE NEW STUFFS ▸ 48-hour bug fix commitment ▸ Test apps ▸ New review process for extended permissions ▸ Loads more

Slide 10

Slide 10 text

THE OLD SDK ...AND WHAT sucked ABOUT IT

Slide 11

Slide 11 text

FULL OF bugs

Slide 12

Slide 12 text

IMPOSSIBLE TO extend

Slide 13

Slide 13 text

COMMITMENT TO Open Source HTTPS://CODE.FACEBOOK.COM/

Slide 14

Slide 14 text

SDK v3 WAS ...FACEBOOK'S RED-HEADED STEP CHILD

Slide 15

Slide 15 text

WRITE YOUR OWN SDK, DARNET!

Slide 16

Slide 16 text

FOSCO TO THE RESCUE!

Slide 17

Slide 17 text

THE NEW SDK v4 THE GOOD, THE BAD, AND THE ANNOYING

Slide 18

Slide 18 text

THE GOOD

Slide 19

Slide 19 text

COMPOSER SUPPORT ...AND PSR-4 AUTOLOADING

Slide 20

Slide 20 text

{ "require" : { "facebook/php-sdk-v4" : "4.0.*" } }

Slide 21

Slide 21 text

OBJECT-ORIENTED ...BUT NOT A STELLAR ARCHITECTED DESIGN

Slide 22

Slide 22 text

IT'S NAMESPACED UNDER THE \Facebook NAMESPACE

Slide 23

Slide 23 text

IT'S mostly UNIT TESTED

Slide 24

Slide 24 text

FOSCO IS awesome SEEMS TO BE FIGHTING FOR US

Slide 25

Slide 25 text

THE BAD IT AINT ALL DANDELIONS AND RAINBOWS

Slide 26

Slide 26 text

THE API Kinda Sucks

Slide 27

Slide 27 text

use Facebook\FacebookSession; use Facebook\FacebookRequest; use Facebook\GraphUser; $session = new FacebookSession('access-token-here'); $user = (new FacebookRequest( $session, 'GET', '/me?fields=id,name' ))->execute()->getGraphObject(GraphUser::className());

Slide 28

Slide 28 text

FacebookSession IS A HORRIBLE NAME FOR WHAT IT ACTUALLY DOES

Slide 29

Slide 29 text

Extensibility ISN'T FUN IT'S DONE WITH SUPPER-CLASS EXTENSION

Slide 30

Slide 30 text

...WHICH SUCKS WHEN THE DEV MANAGES all the things

Slide 31

Slide 31 text

UNIT TESTS AREN'T IN ISOLATION & MIXED WITH FUNCTIONAL TESTS

Slide 32

Slide 32 text

ENOUGH complaining LET'S DIVE INTO THE CODE!

Slide 33

Slide 33 text

GETTING AN Access Token

Slide 34

Slide 34 text

HELPERS GET THE ACCESS TOKEN ▸ FacebookRedirectLoginHelper ...for your website ▸ FacebookCanvasLoginHelper ..for canvas apps ▸ FacebookJavaScriptLoginHelper ..cookies from Javascript SDK

Slide 35

Slide 35 text

use Facebook\FacebookRedirectLoginHelper; $helper = new FacebookRedirectLoginHelper($redirect_url); $login_url = $helper->getLoginUrl();

Slide 36

Slide 36 text

$helper = new FacebookRedirectLoginHelper($redirect_url); try { $session = $helper->getSessionFromRedirect(); } catch(FacebookRequestException $ex) { // When Facebook returns an error } catch(\Exception $ex) { // When validation fails or other local issues } if ($session) { // Logged in. }

Slide 37

Slide 37 text

BEWARE! OF storeState() AND loadState()

Slide 38

Slide 38 text

protected function loadState() { if ($this->checkForSessionStatus === true && session_status() !== PHP_SESSION_ACTIVE) { throw new FacebookSDKException( 'Session not active, could not load state.', 721 ); } if (isset($_SESSION[$this->sessionPrefix . 'state'])) { $this->state = $_SESSION[$this->sessionPrefix . 'state']; return $this->state; } return null; }

Slide 39

Slide 39 text

session_status() ▸ PHP_SESSION_DISABLED if sessions are disabled. ▸ PHP_SESSION_NONE if sessions are enabled, but none exists. ▸ PHP_SESSION_ACTIVE if sessions are enabled, & one exists.

Slide 40

Slide 40 text

$helper->disableSessionStatusCheck();

Slide 41

Slide 41 text

Poking GRAPH GET IT? ...ANYONE? ...ANYONE?

Slide 42

Slide 42 text

YOU'LL NEED TWO OBJECTS TO DO IT ▸ FacebookSession the access-token object ▸ FacebookRequest handles requests made to Graph

Slide 43

Slide 43 text

$session = new FacebookSession('access-token-here'); $request = new FacebookRequest( $session, 'GET', '/some-object-id?fields=id,name' ); $something = $request->execute()->getGraphObject();

Slide 44

Slide 44 text

FacebookRequest() RETURNS FacebookResponse()

Slide 45

Slide 45 text

FacebookResponse() CAN GET A GraphObject()

Slide 46

Slide 46 text

$some_graph_object = $request->execute()->getGraphObject();

Slide 47

Slide 47 text

IT'S A "GETTER OBJECT" getProperty('some_field')

Slide 48

Slide 48 text

GraphObject()'S CAN BE CAST TO SUB OBJECTS

Slide 49

Slide 49 text

SUB GraphObject'S ▸ GraphUser casts a DateTime() ▸ GraphLocation ▸ GraphSessionInfo casts some DateTime()'s ▸ new: GraphAlbum casts some DateTime()'s

Slide 50

Slide 50 text

WTF!? SO REDUNDANT & ANNOYING TO USE A BUNCH OF GETTERS

Slide 51

Slide 51 text

DIGGING DEEPER GETTING A CRAP-TON OF DATA FROM GRAPH

Slide 52

Slide 52 text

GET A USER'S NAME & 5 photos

Slide 53

Slide 53 text

THERE'S A MUCH BETTER WAY WITH Field Expansion A.K.A "NESTED REQUESTS"

Slide 54

Slide 54 text

/{node-id}?fields={first-level}.fields({second-level})

Slide 55

Slide 55 text

/me?fields=name,photos.limit(5)

Slide 56

Slide 56 text

$request = new FacebookRequest( $session, 'GET', '/me?fields=name,photos.limit(5)' ); $something = $request->execute()->getGraphObject();

Slide 57

Slide 57 text

GIVE ME all the things! ▸ User's Name ▸ Last profile update time ▸ The first 4 events that the user is attending & first 2 photos from each event ▸ The first 3 pages the user likes ▸ The first 5 photos the user is tagged in

Slide 58

Slide 58 text

/me?fields=name,updated_time,photos.limit(5).fields(name,source), likes.limit(3).fields(name,link), events.limit(4).fields(name,start_time,end_time, photos.limit(2).fields(name,source))

Slide 59

Slide 59 text

$request = new FacebookRequest( $session, 'GET', '/me?fields=name,updated_time,photos.limit(5).fields(name,source), likes.limit(3).fields(name,link), events.limit(4).fields(name,start_time,end_time, photos.limit(2).fields(name,source))' ); $something = $request->execute()->getGraphObject();

Slide 60

Slide 60 text

THERE must BE A BETTER WAY! THERE IS. ENTER FACEBOOK QUERY BUILDER HTTPS://GITHUB.COM/SAMMYK/FACEBOOKQUERYBUILDER

Slide 61

Slide 61 text

$user = $fqb->object('me')->get();

Slide 62

Slide 62 text

{ "require": { "sammyk/facebook-query-builder": "1.0.*" } }

Slide 63

Slide 63 text

use SammyK\FacebookQueryBuilder\FQB; FQB::setAppCredentials('your_app_id', 'your_app_secret'); FQB::setAccessToken('access_token'); $fqb = new FQB();

Slide 64

Slide 64 text

// Get first 5 photos the user is tagged in $photos_user_tagged_in = $fqb ->edge('photos') ->fields('name', 'source') ->limit(5); // Get first 3 pages this user likes $pages_user_likes = $fqb ->edge('likes') ->fields('name', 'link') ->limit(3); // Get first 4 events that this user is attending // And first 2 photos from each event $event_photos = $fqb ->edge('photos') ->fields('name', 'source') ->limit(2); $events_user_attending = $fqb ->edge('events') ->fields('name', 'start_time', 'end_time', $event_photos) ->limit(4); // Get the logged in user's name, last profile update time, and all those edges $user_data = $fqb->object('me') ->fields('name', 'updated_time', $photos_user_tagged_in, $pages_user_likes, $events_user_attending); ->get();

Slide 65

Slide 65 text

$event_photos = $fqb ->edge('photos') ->fields('name', 'source') ->limit(2);

Slide 66

Slide 66 text

END @SAMMYK