2012-05-22 4 views
0

Я пытаюсь интегрировать Evernote SDK в мое веб-приложение CodeIgniter, а некоторые классы из библиотеки загружаются, а другие нет: -S Не могу понять, почему.Почему некоторые классы не загружаются из моих библиотек в CodeIgniter

У меня есть, что простой кусок кода:

$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); 

While $userStoreTrans и $userStoreProt созданы правильно, THttpClient и TBinaryProtocol классы от Evernote SDK, $userStoreClient бросает Class 'UserStoreClient' not found in .../home.php

Я не понимаю, почему некоторые классы распознаются, а некоторые другие нет, основное отличие, которое я вижу, заключается в том, что «TClasses» находятся под evernote-sdk-php/lib/transport/*.php и evernote-sdk-php/lib/protocol/*.php, а UserStoreClient имеет дополнительную папку evernote-sdk-php/lib/packages/UserStore/*.php

Я объясню, как я в том числе Evernote-СДК-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 Бережливость генератора, я только объявления d некоторые регистрации, чтобы увидеть проблему.

autoload.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 <[email protected]> 
*/ 

/** 
* 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.

ответ

0

Начиная с наших последних обновлений SDK, UserStoreClient (и другие классы SDK) находятся в соответствующих пространствах имен. Предполагая, что вы используете наш сгенерированный код, импортировали ли вы классы, которые используете? Например.

use EDAM\UserStore\UserStoreClient; 
Смежные вопросы