2008-09-05 4 views
18

인증이 필요한 CodeIgniter를 사용하여 webapp을 작성했습니다. 내 모든 인증을 처리하는 모델을 만들었습니다. 그러나 다른 모델 내부에서이 인증 모델에 액세스하는 방법을 찾을 수 없습니다. 다른 모드에서 모델에 접근하는 방법이 있습니까, 아니면 CodeIgniter에서 인증을 처리하는 더 좋은 방법입니까?CodeIgniter에서 다른 모델 내부에서 모델에 액세스 할 수 있습니까?

답변

14

일반적으로 개체 내부에 개체를 만들고 싶지는 않습니다. 이는 나쁜 습관입니다. 대신 명확한 API를 작성하고 모델에 모델을 삽입하십시오.

<?php 
// in your controller 
$model1 = new Model1(); 
$model2 = new Model2(); 
$model2->setWhatever($model1); 
?> 
+0

좋은 방법입니까? Model2의 사용자는 Model1에 의존한다는 것을 알고 있어야합니다. 좋은 연습이란 무엇입니까? – Sabya

+2

예, Model1 내부에서 Model2를 초기화하는 대신 종속성을 "주입"하는 것이 더 좋습니다. – Till

+0

DRY 관점에서는 좋지 않습니다. 한 모델의 측면을 변경하고 다른 모델에 대한 동작을 트리거하는 기능이 있다면 어떻게됩니까? – wag2639

1

모델에서 인증을 처리하지 마십시오. 모델을 사용하여 데이터베이스와 인터페이스하거나 ldap 또는 기타와 인터페이스하십시오.

나는 인증 및 권한 부여를 관리하는 데 사용하는 Auth 라이브러리를 만들었습니다. 컨트롤러에서 이와 같은 라이브러리에 액세스 할 수 있습니다.

+0

필자는 항상 모델에 oauth 구현을 넣었습니다. 인증 코드 –

+0

으로 컨트롤러를 망가뜨리는 일은 싫지만 MY_controller를 만들고 모든 oauth를 수행합니다. – tomexsans

18

모델 내부에서 모델을로드 할 수 있지만 다른 방법으로는이를 해결해야합니다. 자세한 내용은 CodeIgniter forums을 참조하십시오.

class SomeModel extends Model 
{ 
    function doSomething($foo) 
    { 
    $CI =& get_instance(); 
    $CI->load->model('SomeOtherModel','NiceName',true); 

    // use $CI instead of $this to query the other models 
    $CI->NiceName->doSomethingElse(); 
    } 
} 

또한 내게는 오브젝트 내부에 오브젝트를 생성해서는 안된다는 것을 이해할 수 없습니다. 당연히 당신은해야합니다! 인자를 인자로 보내는 것은 나에게 분명하지 않다.

+3

불만 사항은 불필요하게 더 강력하게 두 모델 간의 종속성을 만드는 것입니다. 예를 들어, 테스트 할 때 SomeModel에 SomeOtherModel의 모의 버전을 제공하는 것이 좋습니다. 전자가 후자를 직접로드하는 경우에는 그렇게 할 수 없습니다. 또는 플러그 인 시스템을 사용하도록 기존 코드를 리팩토링 할 때와 같이 나중에 동일한 인터페이스를 사용하는 다른 모델을 사용하도록 코드를 수정하십시오. –

+1

구글은 오픈 소스 의존성 주입 프레임 워크를 가지고있다. 그것은 Java 용이지만 종속성 삽입의 장점과 단점을 설명합니다. http://code.google.com/p/google-guice/ –

+1

@Rob Howard 의존성 주입을 너무 많이 수행하는 것과 같은 일이 있습니다. 사용하는 모든 단일 객체를 개별적으로 테스트해야하는 것은 아니므로 사용하는 모든 단일 객체를 주입 할 필요는 없습니다. 오히려 당신은 전체적으로 함께 작동하는 시스템과 모듈을 테스트하기를 원하며 서로 격리되고 주입되어야합니다. –

1

새로운 CodeIgniter를 사용하여 모델 내에 모델을로드 할 수 있습니다.

관련 문제