2012-07-11 1 views
1

zend-project에서 내 라이브러리 폴더의 서브 디렉토리에있는 클래스가 있습니다.(젠드 기반)에서 PHP 클래스를 찾을 수 없습니다. include_path

<?php echo get_include_path(); ?> 

/Library/WebServer/Foo/application/../library:/Library/WebServer/Foo/library:/usr/share/zend-framework/library/

그래서 지금은 임의의 논리를,이 클래스를 만들 무시하려면, 내가 할 수 있어야한다 : 그래서 내 애플/라이브러리/웹 서버/푸/다음의 경로가 포함 PHP에서 말할 수 있습니다

:
class MyValidator_Usernameunique extends Zend_Validate_Abstract 
{ 
    const USERNAME_ALREADY_EXISTS = 'usernameAlreadyUsed'; 
    const DATABASE_FAILED = 'userDatabaseFailure'; 

    protected $_messageTemplates = array(
     self::USERNAME_ALREADY_EXISTS => "De gebruikersnaam '%value%' is al in gebruik, gebruik een andere." 
     self::DATABASE_FAILED => "Er ging iets mis bij het verbinden met de database." 
    ); 

    public function isValid($value) 
    { 
     $magic = rand(0,3) 
     if($magic==0) { 
      $this->_error(self::USERNAME_ALREADY_EXISTS); 
      return false; 
     } 
     if($magic==1) { 
      $this->_error(self::DATABASE_FAILED); 
      return false; 
     } 
     return true; 
    } 
} 

/Library/WebServer/Foo/library/MyValidator/Usernameunique.php

그래서 내가 정확히 않았다 : 그냥 같은 "새 MyValidator_Usernameunique()"또는 뭔가를 말하여 도달 내가 코드를 조금 단순화로

[Wed Jul 11 14:07:41 2012] [error] [client 127.0.0.1] PHP Fatal error: Class 'MyValidator_Usernameunique' not found in /Library/WebServer/Foo/library/Form/Register.php on line 14, referer: http://foo/

이 줄 번호를 무시 - : 제공
class Form_Register extends Form_FooForm 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
     $username = $this->createText('username', 'Gebruikersnaam')->setRequired(true); 
     $username->addValidator(new MyValidator_Usernameunique()); 
    } 
} 

.

물론 이것은/Library/WebServer/Foo/library/MyValidator /가 내 PHP include_path에 없기 때문에 자연스럽고 필자는 'require'또는 'include'또는 'require_once'파일을 작성하지 않았습니다. 아직 이해할 수 있듯이 젠드 프레임 워크는 _을 /로 대체하고 include_path를 검색하여 파일을 자동로드한다고 가정합니다. 그리고 이것은 register-form에서는 잘 작동하지만 validator에서는 실패합니다. 왜 이래야하지? 거의 동일한 시나리오입니다. 또한 MyValidator_UsernameUnique를 동일한 오류 메시지가있는 컨트롤러 클래스에서 직접 만들려고하면 오류가 발생합니다.

왜 이런 일이 발생했는지에 대한 생각이나 표시는 감사하게 생각합니다. 또한,이 오류를 수정하려고하지 않고 있습니다. zend에서 자동 로딩을 더 잘 이해하려고합니다. 따라서 유효성 검사기를 중복 사용하는 솔루션을 제안하지 마십시오.

+0

죄송합니다. Zend Framework에서 클래스가로드되지 않는 이유 또는 자동로드에 대한 설명을 찾으십니까? 귀하의 게시물은 약간 불분명합니다. – vascowhite

+0

실제로 자동 로딩하는 경우에도 알아 두어야합니다. – Ponsjuh

답변

1

코드를 보면, 그리고 내가 그것을 놓친 수도 있지만 정말

난 종류의 당신의 웹 애플리케이션의 경로에 다음에 기대하는 "표준"젠드 레이아웃이 아니다 (/ 라이브러리/웹 서버/푸 /)

  • 응용 프로그램
    • CONFIGS
    • 컨트롤러
  • 라이브러리
  • 공공

이제 내가

라이브러리

  • MyApp를
    • 검증
        을처럼 할 것 라이브러리에 검사기를 추가 할
      • Validator.php

내부 Validator.php 이제 우리는 우리가 우리가 별도의 네임 스페이스를 젠드에게 필요한 도서관에서 여분의 부분을 가지고

class MyApp_Validate_Validator extends Zend_Validate_Abstract 
{ 
    //Do stuff here 
} 

그것에있는 우리 자신의 코드

그래서 application.ini에서 이것을 다음과 같이 구성하십시오 :

autoloaderNamespaces.0 = MyApp_ 

이제 응용 프로그램 (젠드는) 귀하의 유효성 검사기를 찾을 위치를 알고 있어야합니다

그래서

당신이 지금 할 수있는

응용 프로그램/형태로 배치하는 (최고의 양식을 만들 /하지만이야 다음 당신에게 ofcourse)

class Form_Register extends Zend_Form { 

    public function __construct() { 
     parent::__construct(); 

     $username = $this->createText('username', 'Gebruikersnaam') 
     ->setRequired(true) 
     ->addValidator(new MyApp_Validate_Validator()); 

    } 
} 
+0

그렇다면 클래스의 include_paths를 모두 검색하는 대신 zends를 사용하여 네임 스페이스를 먼저 검색 한 다음 클래스를 검색하면됩니까? 아마도 '부팅'에서 모든 네임 스페이스를 추적 할 것입니다. 그런 다음 Forms에서 작동하는 이유를 나타낼 수 있습니까? 이 폴더를 라이브러리 폴더에서 직접 만들었고, 네임 스페이스에 구성하지 않았지만 제대로 작동합니다 : S 그런데 여러분의 제안을 시도한 결과, 나는 당신의 대답을 좋아했습니다. 나는 확실히 그것을 받아 들일 것이지만, 이것이 폼에서 작동하는 이유를 설명 할 수 있다면 바람직합니다. :) 고맙습니다! – Herbert

+0

Zend는 classpath에서 등록 된 네임 스페이스를 찾습니다. – Florent

+0

여기서 classpath는 include_path입니까? – Herbert

3

이 답변의 목적 상 관련성이 없으므로 경로에서 'Foo'이상의 모든 내용을 무시할 것입니다.

유효성 검사기를 자동로드하려면 몇 가지 작업을 수행해야합니다.

은 첫째로 당신은`푸/라이브러리/내 '다음 application.ini 파일에 다음 줄을 추가 폴더를 만들어야합니다 -

autoloadernamespaces[] = "My_" 

이 어디 클래스를 찾을하는 젠드 프레임 워크를 알려드립니다 .

다음 폴더를 만들 '푸/라이브러리/내/검사기'다음 해당 폴더에이 같은 찾아야한다 'Usernameunique.php'생성 - 다음

class My_Validator_Usernameunique extends Zend_Validate_Abstract 
{ 
    //All your class stuff goes here. 
} 

당신이 : -

$username->addValidator(new My_Validator_Usernameunique()); 

자동로드됩니다.

자세한 내용은 manual을 참조하십시오.

양식에 자동 로딩이 작동하는 이유는 'Forms'디렉토리가 프레임 워크에서 자동 로더 포함 경로에 자동으로 추가되므로 어디서 찾을 수 있는지 알 수 있습니다.

짐작할 수 있듯이 자동 로딩은 '/'을 '_'로 대체 한 다음 결과 경로에서 클래스를로드합니다. 그러나 기본 경로 이외의 경로는 예제에서와 같이 application.ini에서 '등록'해야합니다. 실제로 일어나는 것을 배우려면 Zend/Loader/Autoloader.php의 코드를보십시오.

+0

답장을 보내 주셔서 감사합니다.하지만 아래에있는 것이 더 좋습니다 (미안). 정직하게 말하면, "이것은 Zend Framework에게 클래스를 찾을 위치를 알려줍니다."와 같은 문장입니다. 네임 스페이스가 무엇인지, 왜 필요한지를 전혀 설명하지 않으므로 혼란에 빠지십시오. 내가 정확하게 내 include_path에 넣어 폴더에 대해 동일하게 말할 수있는, 그래서 include_path에 해당하는 네임 스페이스가 무엇입니까? 그렇게 생각하지 마십시오.또한 "설명서를 참조하십시오"나중에 약간 때 이상한 내 질문을 무시할 것 같아요 왜이 작동하지 않는 폼 및 MyValidator 않습니다. 나는 매뉴얼에서 그걸 발견하지 못했습니다. – Herbert

+0

@Herbert 귀하의 의견에 따라 작은 문장을 추가했습니다. 공정하기 위해서, 나는 당신의 질문에 대한 논평에서 당신에게 명확한 설명을 요구했으나 당신은 답장을하지 않았다. – vascowhite

+0

대답에서 zend-framework-documentation을 반복하기 전에 명확히하기 위해 약 15 분이 걸립니다. 그러나 네가 네임 스페이스를 등록 할 필요가 있음을 분명히했다. 나는 아직도 그것이 형식을 위해 일하는 이유는 분명하지만 검증자를위한 이유는 분명하지 않다 : 나는 그와 함께 살아야한다고 생각한다. :) 어쨌든, 노력에 감사드립니다. – Herbert

관련 문제