2017-09-21 1 views
1

컨트롤러가있는 패키지를 개발 중입니다.이 패키지를 Laravel 및 Lumen 프로젝트와 호환 (또는 사용할 수 있음)하고 싶습니다. 내 문제는 Laravel 컨트롤러가 Illuminate\Routing\Controller까지 확장되고 루멘 컨트롤러가 Laravel\Lumen\Routing\Controller까지 확장됩니다. 내 패키지 안의 컨트롤러는 둘 다 확장 할 수 없습니다.Laravel 및 Lumen 컨트롤러를 패키지에 넣기

내가 가진 유일한 해결책은 패키지 내부의 컨트롤러를 확장하는 것입니다. App\Http\Controllers\Controller.

  1. App\Http\Controllers\Controller이 존재한다 :

    는하지만 몇 가지 문제를 참조 즉, App 네임 스페이스의 이름이 다르게 지정되면 작동하지 않습니다.

  2. 패키지가 현재 패키지에 포함되어 있다고 인식하고 있습니다.
  3. 테스트 가능성 : App\Http\Controllers\Controller에 대한 참조로 인해 컨트롤러를 독립적으로 테스트 할 수 없습니다.

더 좋은 방법이 있나요?

편집 한

나는 비슷한 방식으로 영향을받는 다른 클래스를 찾는거야. 예를 들어, 특성 Authorizable의 네임 스페이스는 Laravel에서 Illuminate\Foundation\Auth\Access이고 Lumen에서는 Laravel\Lumen\Auth입니다. 그 특성을 사용하는 모델을 사용하고 있습니다. 내 모델을 Lumen과 Laravel과 호환되게하려면 어떻게합니까?

+0

이것을 알아 냈습니까? – Laurence

+0

불행히도, 아니오. –

답변

0

글쎄, 단순히 두 개의 다른 파일과 클래스를 if 문에 넣고 확장 할 해당 클래스가 있는지 확인할 수 있습니다. 그래서 :

LaravelClass.php : 두 파일을로드

if(class_exists(Illuminate\Routing\Controller:class)){ 
    class LaravelClass extends Illuminate\Routing\Controller { 
    use YourCodeTrait; 

    // any more code that is not in your trait 
    } 
} 

LumenClass.php는

if(class_exists(Laravel\Lumen\Routing\Controller:class)){ 
    class LaravelClass extends Laravel\Lumen\Routing\Controller { 
    use YourCodeTrait; 

    // any more code that is not in your trait 
    } 
} 

단지 클래스 중 하나를로드합니다. 위의 코드에서 컨트롤러의 내용을로드하는 특성을 사용합니다. 내용이 같다고 가정하면 동일한 특성을 사용할 수 있고 반복 할 필요가 없습니다.

trait YourCodeTrait{ 
    // whatever would normally go in your controllers 
} 
+0

그렇다면 각 파일에 대해 컨트롤러를 두 번 코딩해야한다는 의미일까요? –

+0

아니오 - 위의 그림과 같이 각 컨트롤러에서 사용할 수있는 모든 코드를 특성에 작성하십시오. 실제로, 귀하의 특성에있는 모든 것을 컨트롤러로 가져옵니다. – jgile

+0

나는 더 우아한 뭔가를 찾고 있는데, 뭔가 '해킹'이 아닙니다. 그러나 당신의 제안에 감사드립니다. –

관련 문제