Por qué algunas clases no se cargan desde mis bibliotecas en CodeIgniter

Estoy tratando de integrar Evernote SDK a mi aplicación web CodeIgniter y algunas clases de la biblioteca están cargadas y otras no, :-SI no puedo ver por qué.

Tengo ese simple fragmento de código:

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

Aunque la $userStoreTrans y $userStoreProt se crean correctamente, un THttpClient y TBinaryProtocol clases de Evernote SDK, $userStoreClient lanza un Class 'UserStoreClient' not found in .../home.php

No entiendo por qué algunas clases se reconocen y otras no, la principal diferencia que puedo ver es que "TClasses" están debajo evernote-sdk-php/lib/transport/*.php y evernote-sdk-php/lib/protocol/*.php y UserStoreClient tiene una carpeta extra evernote-sdk-php/lib/packages/UserStore/*.php

Explicaré cómo incluyo evernote-sdk-php en mi instalación de CodeIgniter:

Esta es mi configuración de CodeIgniter/autoload.php

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

Este es mi archivo 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');
    }
}
?>

El objetivo principal de la clase Evernote_Bootstrap es la require_once of evernote-sdk-php/lib/autoload.php, esta clase se genera automáticamente usando el indicador del generador Thrift -phpa, solo agrego algunos registros para ver el problema.

autocarga.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');
    }
  }  
}

Luego registré esa biblioteca y parece funcionar bien. Puede ver los principales registros importantes: log_message('debug',str_var_dump($allLibs)); y log_message('debug','all scrapped classes: ' . str_var_dump($GLOBALS['THRIFT_AUTOLOAD'])); y la salida: http://pastebin.com/8w1MCKx9:

Como puede ver, la clase UserStore parece estar igualmente bien cargada que THttpClient o TBinaryProtocol... ¿alguna idea sobre el problema?

no se si es importante pero lo noto $GLOBALS['THRIFT_ROOT'], definido en autoload.php, no es accesible desde un controlador CI. Probablemente me estoy perdiendo algo sobre la arquitectura CI.

preguntado el 22 de mayo de 12 a las 15:05

1 Respuestas

A partir de nuestras últimas actualizaciones de SDK, UserStoreClient (y las otras clases de SDK) se encuentran en espacios de nombres apropiados. Suponiendo que está utilizando nuestro código generado, ¿ha importado las clases que está utilizando? P.ej

use EDAM\UserStore\UserStoreClient;

contestado el 22 de mayo de 12 a las 17:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.