0

我正在尝试将 Evernote SDK 集成到我的 CodeIgniter Web 应用程序中,并且库中的一些类已加载,而其他类则没有,:-SI 不明白为什么。

我有一段简单的代码:

$access_token = 'my validated access token ';

// Get User Store
$userStoreTrans;
try{
    $userStoreTrans = new THttpClient(USER_STORE_HOST, USER_STORE_PORT, USER_STORE_URL, USER_STORE_PROTO);
}
catch(TTransportException $e)
{
    print $e->errorCode.' Message:'.$e->parameter;
}

$userStoreProt = new TBinaryProtocol($userStoreTrans);
$userStoreClient = new UserStoreClient($userStoreProt, $userStoreProt);

在正确创建 and 时,来自 Evernote SDK 的$userStoreTransand类会抛出一个$userStoreProtTHttpClientTBinaryProtocol$userStoreClientClass 'UserStoreClient' not found in .../home.php

我不明白为什么有些类被识别而另一些类不被识别,我可以看到的主要区别是“TClasses”在evernote-sdk-php/lib/transport/*.phpandevernote-sdk-php/lib/protocol/*.php和 UserStoreClient 有一个额外的文件夹evernote-sdk-php/lib/packages/UserStore/*.php

我将解释如何将 evernote-sdk-php 包含到我的 CodeIgniter 安装中:

这是我的 CodeIgniter 配置/autoload.php

$autoload['libraries'] = array('database','session','form_validation','security','tank_auth','Evernote_bootstrap');

这是我的 Evernote_bootstrap.php 文件

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

define("EVERNOTE_LIBS", dirname(__FILE__) . DIRECTORY_SEPARATOR . "evernote-sdk-php/lib");

// add ourselves to include path
ini_set("include_path", ini_get("include_path") . ":" . EVERNOTE_LIBS);

require_once("evernote-sdk-php/lib/autoload.php");
require_once("evernote-oauth/functions.php");

class Evernote_Bootstrap
{
    function __construct()
    {
        // log_message('debug','Evernote_Bootstrap');
    }
}
?>

Evernote_Bootstrap 类的主要目的是require_once of evernote-sdk-php/lib/autoload.php,这个类是使用 -phpa Thrift 生成器标志自动生成的,我只添加一些日志来查看问题。

自动加载.php:

<?php

/**
 * Copyright (c) 2006- Facebook
 * Distributed under the Thrift Software License
 *
 * See accompanying file LICENSE or visit the Thrift site at:
 * http://developers.facebook.com/thrift/
 *
 * @package thrift
 * @author Mark Slee <mcslee@facebook.com>
 */

/**
 * Include this file if you wish to use autoload with your PHP generated Thrift
 * code. The generated code will *not* include any defined Thrift classes by
 * default, except for the service interfaces. The generated code will populate
 * values into $GLOBALS['THRIFT_AUTOLOAD'] which can be used by the autoload
 * method below. If you have your own autoload system already in place, rename your
 * __autoload function to something else and then do:
 * $GLOBALS['AUTOLOAD_HOOKS'][] = 'my_autoload_func';
 *
 * Generate this code using the -phpa Thrift generator flag.
 */

/**
 * This parses a given filename for classnames and populates
 * $GLOBALS['THRIFT_AUTOLOAD'] with key => value pairs
 * where key is lower-case'd classname and value is full path to containing file.
 *
 * @param String $filename Full path to the filename to parse
 */
function scrapeClasses($filename) {
  $fh = fopen($filename, "r");
  while ($line = fgets($fh)) {
    $matches = array();
    if ( preg_match("/^\s*class\s+([^\s]+)/", $line, $matches)) {
      if (count($matches) > 1)
        $GLOBALS['THRIFT_AUTOLOAD'][strtolower($matches[1])] = $filename;
    }
  }
}

function findFiles($dir, $pattern, &$finds) {
  if (! is_dir($dir))
    return;
  if (empty($pattern))
    $pattern = "/^[^\.][^\.]?$/";
  $files = scandir($dir);
  if (!empty($files)) {
    foreach ($files as $f) {
      if ($f == "." || $f == "..")
        continue;
      if ( is_file($dir . DIRECTORY_SEPARATOR . $f) && preg_match($pattern, $f)) {
        $finds[] = $dir . DIRECTORY_SEPARATOR . $f;
      } else if ( is_dir($dir . DIRECTORY_SEPARATOR . $f) && substr($f, 0, 1) != ".") {
        findFiles($dir . DIRECTORY_SEPARATOR . $f, $pattern, $finds);
      }
    }
  }
}
function str_var_dump($object)
  {
    ob_start();
    var_dump($object);
    $dump = ob_get_clean();
    return $dump;
  }


// require Thrift core
require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "Thrift.php");

if (! isset($GLOBALS['THRIFT_ROOT']))
  $GLOBALS['THRIFT_ROOT'] = dirname(__FILE__);

log_message('debug','bootstrap autoload.php is executing');

// stuff for managing autoloading of classes
$GLOBALS['THRIFT_AUTOLOAD'] = array();
$GLOBALS['AUTOLOAD_HOOKS'] = array();
$THRIFT_AUTOLOAD =& $GLOBALS['THRIFT_AUTOLOAD'];


// only populate if not done so already
if (empty($GLOBALS['THRIFT_AUTOLOAD'])) {
  //$allLibs = glob( dirname(__FILE__) . "/**/*.php");  // oh poor winblows users can't use glob recursively
  $allLibs = array();
  findFiles( dirname(__FILE__), "/\.php$/i", $allLibs);
  log_message('debug',str_var_dump($allLibs));
  if (!empty($allLibs)) {
    foreach ($allLibs as $libFile) {
      scrapeClasses($libFile);
    }
    log_message('debug','all scrapped classes: ' . str_var_dump($GLOBALS['THRIFT_AUTOLOAD']));
  }
}else{
  log_message('debug','$GLOBALS[THRIFT_AUTOLOAD] already defined');
}


// main autoloading
if (!function_exists('__autoload')) {
  function __autoload($class) {
    log_message('debug','__autoload');
    global $THRIFT_AUTOLOAD;
    $classl = strtolower($class);
    if (isset($THRIFT_AUTOLOAD[$classl])) {
      // log_message('debug','$THRIFT_AUTOLOAD[$classl] is set, do require_once');
      //include_once $GLOBALS['THRIFT_ROOT'].'/packages/'.$THRIFT_AUTOLOAD[$classl];
      require_once($THRIFT_AUTOLOAD[$classl]);
    } else if (!empty($GLOBALS['AUTOLOAD_HOOKS'])) {
      log_message('debug','$GLOBALS[AUTOLOAD_HOOKS]is no empty, lets foreach');
      foreach ($GLOBALS['AUTOLOAD_HOOKS'] as $hook) {
        // log_message('debug','iterate');
        $hook($class);
      }
    } else {
        log_message('debug','nothing to do');
    }
  }  
}

然后我记录了那个库,似乎工作正常。您可以看到主要的重要日志:log_message('debug',str_var_dump($allLibs));log_message('debug','all scrapped classes: ' . str_var_dump($GLOBALS['THRIFT_AUTOLOAD']));输出:http ://pastebin.com/8w1MCKx9 :

正如你所看到的,UserStore 类似乎与 THttpClient 或 TBinaryProtocol 一样好加载......关于这个问题的任何想法?

我不知道这是否重要,但我注意到$GLOBALS['THRIFT_ROOT']在 autoload.php 上定义的,不能从 CI 控制器访问。可能我错过了关于 CI 架构的一些东西。

4

1 回答 1

0

在我们最新的 SDK 更新中,UserStoreClient(和其他 SDK 类)位于适当的命名空间中。假设您正在使用我们生成的代码,您是否导入了您正在使用的类?例如

use EDAM\UserStore\UserStoreClient;
于 2012-05-22T16:37:40.843 回答