【问题标题】:Facebook SDK v4 for PHP Minimal ExampleFacebook SDK v4 for PHP 最小示例
【发布时间】:2014-06-18 07:04:23
【问题描述】:

我正在尝试获取最小的示例

using Facebook\FacebookSession;

FacebookSession::setDefaultApplication('YOUR_APP_ID','YOUR_APP_SECRET');

// Use one of the helper classes to get a FacebookSession object.
//   FacebookRedirectLoginHelper
//   FacebookCanvasLoginHelper
//   FacebookJavaScriptLoginHelper
// or create a FacebookSession with a valid access token:
$session = new FacebookSession('access-token-here');

// Get the GraphUser object for the current user:

try {
  $me = (new FacebookRequest(
    $session, 'GET', '/me'
  ))->execute()->getGraphObject(GraphUser::className());
  echo $me->getName();
} catch (FacebookRequestException $e) {
  // The Graph API returned an error
} catch (\Exception $e) {
  // Some other error occurred
}

来自README 工作,但我不明白第一行代码的含义。我必须在 SDK 文件结构中使用该最小代码示例将 PHP 文件放在哪里。我直接在 src 文件夹中尝试过,但是返回了以下 PHP 错误

[01-May-2014 20:12:26 Europe/Berlin] PHP Parse error:  syntax error, unexpected 'Facebook' (T_STRING) in /Applications/MAMP/htdocs/facebook-php-sdk-v4/src/test.php on line 9

文件结构如下所示

├── src
│   ├── Facebook
│   │   ├── FacebookAuthorizationException.php
│   │   ├── FacebookCanvasLoginHelper.php
│   │   ├── FacebookClientException.php
│   │   ├── FacebookJavaScriptLoginHelper.php
│   │   ├── FacebookOtherException.php
│   │   ├── FacebookPermissionException.php
│   │   ├── FacebookRedirectLoginHelper.php
│   │   ├── FacebookRequest.php
│   │   ├── FacebookRequestException.php
│   │   ├── FacebookResponse.php
│   │   ├── FacebookSDKException.php
│   │   ├── FacebookServerException.php
│   │   ├── FacebookSession.php
│   │   ├── FacebookThrottleException.php
│   │   ├── GraphLocation.php
│   │   ├── GraphObject.php
│   │   ├── GraphSessionInfo.php
│   │   ├── GraphUser.php
│   │   └── fb_ca_chain_bundle.crt
│   └── test.php

【问题讨论】:

  • Facebook PHP SDK 是我这辈子见过的最可耻的一段代码——这是在我用微软软件 10 年的头脑之后...
  • @PalDev 是的,你是对的。 Facebook的那些程序员真是天才!

标签: php namespaces


【解决方案1】:

最近解决了这个问题。 因为 sdk 有 autoload.php 文件,所以你不需要使用 require 等。 只需在开始时包含该 autoload.php

 <?php
session_start();
// added in v4.0.0
require_once 'autoload.php';

use Facebook\FacebookSession;
use Facebook\FacebookRedirectLoginHelper;
use Facebook\FacebookRequest;
use Facebook\FacebookResponse;
use Facebook\FacebookSDKException;
use Facebook\FacebookRequestException;
use Facebook\FacebookAuthorizationException;
use Facebook\GraphObject;
use Facebook\Entities\AccessToken;
use Facebook\HttpClients\FacebookCurlHttpClient;
use Facebook\HttpClients\FacebookHttpable;

// start session

// init app with app id and secret
FacebookSession::setDefaultApplication( 'app-id','app-secret' );

// login helper with redirect_uri

    $helper = new FacebookRedirectLoginHelper('http://yourhost/facebook/' );

try {
  $session = $helper->getSessionFromRedirect();
} catch( FacebookRequestException $ex ) {
  // When Facebook returns an error
} catch( Exception $ex ) {
  // When validation fails or other local issues
}

// see if we have a session
if ( isset( $session ) ) {
  // graph api request for user data
  $request = new FacebookRequest( $session, 'GET', '/me' );
  $response = $request->execute();
  // get response
  $graphObject = $response->getGraphObject();

  // print data
  echo '<pre>' . print_r( $graphObject, 1 ) . '</pre>';
} else {
  // show login url
  echo '<a href="' . $helper->getLoginUrl() . '">Login</a>';
}

?>

在此之后,您必须检查 autoload.php 文件中的路径

$base_dir = defined('FACEBOOK_SDK_V4_SRC_DIR') ? FACEBOOK_SDK_V4_SRC_DIR : __DIR__ . '/src/Facebook/';

如果您更改了目录的名称,例如将所有文件从 /src/Facebook/ 放置到 /sdk/,则此行是默认代码,然后只需替换名称 始终使用 die(__DIR__ . '/src/Facebook/'); 检查包含的路径 确认是否正确。

【讨论】:

  • +1 我无法让自动加载器工作,但在更改 autoload.php 中的路径后,我让它工作了
  • 您可能想从答案中删除您的应用密码
【解决方案2】:

这里有一个完整的(工作)示例:http://metah.ch/blog/2014/05/facebook-sdk-4-0-0-for-php-a-working-sample-to-get-started/

代码:

session_start();
require_once( 'Facebook/FacebookSession.php' );
require_once( 'Facebook/FacebookRedirectLoginHelper.php' );
require_once( 'Facebook/FacebookRequest.php' );
require_once( 'Facebook/FacebookResponse.php' );
require_once( 'Facebook/FacebookSDKException.php' );
require_once( 'Facebook/FacebookRequestException.php' );
require_once( 'Facebook/FacebookAuthorizationException.php' );
require_once( 'Facebook/GraphObject.php' );

use Facebook\FacebookSession;
use Facebook\FacebookRedirectLoginHelper;
use Facebook\FacebookRequest;
use Facebook\FacebookResponse;
use Facebook\FacebookSDKException;
use Facebook\FacebookRequestException;
use Facebook\FacebookAuthorizationException;
use Facebook\GraphObject;

// init app with app id (APPID) and secret (SECRET)
FacebookSession::setDefaultApplication('APPID','SECRET');

// login helper with redirect_uri
$helper = new FacebookRedirectLoginHelper( 'http://www.metah.ch/' );

try {
  $session = $helper->getSessionFromRedirect();
} catch( FacebookRequestException $ex ) {
  // When Facebook returns an error
} catch( Exception $ex ) {
  // When validation fails or other local issues
}

// see if we have a session
if ( isset( $session ) ) {
  // graph api request for user data
  $request = new FacebookRequest( $session, 'GET', '/me' );
  $response = $request->execute();
  // get response
  $graphObject = $response->getGraphObject();

  // print data
  echo  print_r( $graphObject, 1 );
} else {
  // show login url
  echo '<a href="' . $helper->getLoginUrl() . '">Login</a>';
}

【讨论】:

    【解决方案3】:

    我认为你需要改变这一行:

    using Facebook\FacebookSession;
    

    use Facebook\FacebookSession;
    

    要在 php 中使用命名空间,关键字是 use 更多 php using namespaces

    更新:

    使用命名空间不会自动包含脚本,您需要在自动加载中包含路径(如果有的话)或简单地:

    include 'path/to/FacebookSession.php';
    

    Update2:首先,请阅读手册中的php命名空间,其次,不,如果它已经包含在原始类中,那么你不。或者如果它遵守 psr-* 那么你可以使用一些自动加载器或使用spl_autoload_register

    【讨论】:

    • 谢谢,删除了解析错误并创建了一个新的 PHP 致命错误:在 /Applications/MAMP/htdocs/facebook-php-sdk-v4/src/ 中找不到类 'Facebook\FacebookSession'第 11 行的 test.php
    • @NickWeisser - 什么是新的?
    • 你也需要包含它
    • 将在最初的问题中添加我的 SDK 文件结构。
    • 感谢您迄今为止的所有宝贵帮助。我仍然没有从 Github 工作中得到最小的例子。我希望有一个完整的 v4 SDK 教程。
    【解决方案4】:

    为避免使用requirerequire_once 并获得更好的项目结构,您应该遵循以下步骤:

    1. https://getcomposer.org/安装作曲家
    2. 在您的 Web 应用程序根目录中创建 composer.json 文件,其中包含以下内容: { "require" : { "facebook/php-sdk-v4" : "4.0.*" } }

    3. 致电php composer.phar install

    4. 创建文件夹src/Acme/App
    5. 创建一个文件src/Acme/App/Run.php,内容如下:

    &lt;?php

    namespace Acme\App;
    
    use Facebook\FacebookSession;
    use Facebook\FacebookRequest;
    use Facebook\GraphUser;
    use Facebook\FacebookRequestException;
    
    class Run {
        const APP_ID = 'app_id';
        const APP_SECRET = 'app_secret';
    
        public function __construct()
        {
            FacebookSession::setDefaultApplication(self::APP_ID, self::APP_SECRET);
           // ...your code goes here...
        }
    
    }
    
    1. 创建一个index.php 文件,内容如下:

    &lt;?php

    $loader = require_once 'vendor/autoload.php';
    $loader->add('Acme\App', __DIR__.'/src');
    $app = new Run();
    

    这将是您的 Facebook 应用程序的框架(您的所有其他类都应遵循 PSR-4 标准)。使用 Composer 的自动加载器,您无需为任何已注册命名空间中的类使用 require_once

    附:您可能希望从 Web 根目录中删除所有库。这将有助于防止从网络直接访问他们。然后你可以调整路径名并在你的 web 根目录中只保留 index.php。我希望,这很清楚。

    【讨论】:

    • 我应该认为这会在 FB 网站上得到很好的记录,但我无法找到它。非常感谢您花时间解释这一点。您的示例使用 facebook 登录完美运行。
    【解决方案5】:

    是的,新教程不是很有帮助。

    我自己正在浏览它们,只是为了让示例能够正常工作,我这样做了:

    function facebookLoader($class) {
        require "/path/to/facebook-php-sdk-v4-master/src/" . str_replace("\\", "/", $class) . ".php";
    }
    
    spl_autoload_register("facebookLoader");
    
    Facebook\FacebookSession::setDefaultApplication([...]
    

    并在任何调用类名的地方添加Facebook\

    此外,教程中有一部分说要使用: FacebookRedirectLoginHelper();

    当你,事实上,还是要给东西输入:

    FacebookRedirectLoginHelper("http://yourRedirectUri.com/");

    让我完成了教程 - !现在开始弄清楚如何获取用户的电子邮件/完整的个人资料信息。

    【讨论】:

      【解决方案6】:
      1. 需要 PHP 5.4.0 或更高版本。
      2. Facebook 使用Implementations of PSR-4。因此,您不必使用 require 或 require_once 或 include 或 include_once
      3. 在 PSR-4 中,您只需要包名(命名空间),即目录名和类文件名。它将从给定的包名动态注册类。例如:-use packaname\classname
      4. 您会在Facebook SDK Autoload 根目录中找到文件autoload.php
      5. use 用于使用spl_autoload_register 加载动态类
      6. Facebook 使用autoload.phpautoload_fb.php 注册所有库
      7. 您必须在下载的库中找到 autoload.php,例如 facebook-php-sdk-v4-4.0-dev/
      8. 如果您只想使用下载源中的Facebook库。那么您必须将autoload.php复制到您的根目录或Facebook目录中。
      9. FACEBOOK_SDK_V4_SRC_DIR 定义的常量,即facebook 库的路径
      10. 您需要在php中使用

      注意:我已将/var/www/stack/24006673/facebook-php-sdk-v4-4.0-dev/src/Facebook目录和/var/www/stack/24006673/facebook-php-sdk-v4-4.0-dev/autoload.php文件复制到根目录/var/www/stack/24006673/

      define('FACEBOOK_SDK_V4_SRC_DIR','/var/www/stack/24006673/Facebook/');
      require_once("autoload.php");
      use Facebook\FacebookSession;
      use Facebook\FacebookRequest;
      use Facebook\GraphUser;
      use Facebook\FacebookRequestException;
      use Facebook\FacebookRedirectLoginHelper;
      FacebookSession::setDefaultApplication('YOUR_APP_ID','YOUR_APP_SECRET');
      

      【讨论】:

      • 您还可以在第 49 行的 autoload.php 中编辑目录值,而不是在包含文件之前定义常量。例如,我将 /src/Facebook/ 更改为 /Facebook/
      【解决方案7】:

      我解决了。只需在脚本顶部使用以下行:

      define('FACEBOOK_SDK_V4_SRC_DIR', __DIR__ . '/facebook-php-sdk-v4/src/Facebook/');
      

      你就完成了。

      【讨论】:

        【解决方案8】:

        只需将其放在包含页面上:

        需要 DIR 。 '/path/to/facebook-php-sdk-v4/autoload.php';

        使用前也要调用类,每次需要时:

        使用 Facebook\FacebookSession;

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多