2
  • 저는 Codeigniter 2.1.0을 사용하고 있습니다.
  • 나는이 잘 작동 require_once APPPATH . "/libraries/aws_sdk/sdk.class.php";

사용하여 사용자 정의 모델에서 아마존 웹 서비스 SDK를 포함하고있다. CI 나중에 결정 그러나 그것은 (CI_DB_driver를 통해 :: _ cache_init)를 호출, 그것은 DB 캐시 클래스의로드해야 : 이것은 AWS SDK의 자동로드를 (정확한 방법은 CFLoader::autoloader 인) 트리거PHP AWS SDK 오토로더가 Codeigniter와 충돌합니다

if (! class_exists('CI_DB_Cache')) 
{ 
    if (! @include(BASEPATH.'database/DB_cache.php')) 
    { 
     return $this->cache_off(); 
    } 
} 

.

이 DB_cache.php 거짓 어쨌든 경우 class_exists 반환 포함되어 있는지 보인다 내가, 자동로드에 class_exists하지를 말함으로써이 문제를 해결 얻을 수 있습니다 :

if (! class_exists('CI_DB_Cache', false)) 
{ 
    if (! @include(BASEPATH.'database/DB_cache.php')) 
    { 
     return $this->cache_off(); 
    } 
} 

이 더러운 수정 작업을하지만, 분명히에만 즉시 문제를 해결 . 일반적으로 CodeIgniter가 다른 라이브러리의 자동로드와 혼동되지 않도록하는 가장 좋은 방법은 무엇입니까?

참고 : spl_autoload_register 사용에 대한

  • 내가 읽은 비트와 조각을. Codeigniter가 이것을 사용하지 않는 것 같아요. 어떻게 안전하게 구현해야하는지 모르겠습니다. 나는 이것이 가장 유용한 방법을 구현해야하는 방법과 장소에 대한 견고한 예를 찾을 수있을 것이다 (물론 이것이 해결책 일 경우).
  • AWS SDK는 이미 spl_autoload_register을 사용 나타납니다 spl_autoload_register(array('CFLoader', 'autoloader')); 당신은 아마 알다시피

답변

4

, 당신은 정말 CI의 핵심 방법을 수정되고 싶지 않아.

이 그대로 폴더 구조를 그대로두고 있지만 새 파일 외부 당신의 aws_sdk 폴더를 만들 : 그래서, 당신의 클래스와 충돌하는 CI를 방지하기 위해, 다음과 매우 비슷한 일을하고 싶다. * Aws_loader * 또는 당신에게 의미가있는 것과 같은 이름을 지정하십시오. sdk를 자동로드하려면 CI 자동 로더 파일에 다음을 추가하십시오.

CI 자동로드 파일 (application/config/autoload.PHP) :

$autoload['libraries'] = array('Aws_loader'); 

귀하의 초기화 파일 :

class CI_Aws_sdk{ 
    // for use with PHP < version 5 
    /*public function CI_Aws_sdk(){ 
     require dirname(__FILE__) . DIRECTORY_SEPARATOR . "aws_sdk" .DIRECTORY_SEPARATOR . 'sdk.class.php'; 
    }*/ 

    // for use with PHP >= 5 
    public function __construct(){ 
     require dirname(__FILE__) . DIRECTORY_SEPARATOR . "aws_sdk" .DIRECTORY_SEPARATOR . 'sdk.class.php'; 
    } 
} 

그래서 디렉토리 구조는 이제 다음과 같습니다

application -- 
    config -- 
    ... 
    libraries -- 
    Aws_loader.php 
    aws_sdk -- 
     sdk.class.php 

당신이 SDK를 자동 로딩하지 않는 경우, 컨트롤러에 할 수 있습니다.

$this->load->library('Aws_loader'); 

어느 쪽이든, CI 클래스를로드하고 그 안에있는 메소드를 효과적으로 분리하면 이제는 CI의 메소드를 방해하지 않고 이전에로드 한 다른 라이브러리 나 모델처럼 해당 클래스 내에서 작동 할 수 있습니다.

$this->Aws_loader->do_something(); 

제 3 자 클래스 라이브러리 나 직접 작성한 클래스 라이브러리에도 동일한 방법을 사용할 수 있습니다. 모델, 라이브러리, 도우미 등과 같이 매우 유사한 배열이 사용될 수 있습니다. 희망이 도움이됩니다!