2016-08-29 2 views
2

슬림 프레임 워크 기반 API에서 작업 중입니다. mvc 패턴에 따라, 로거와 렌더러를 모든 컨트롤러에 주입하여 내 경로를 컨트롤러 구동으로하고 싶습니다. 시작점으로서 슬림 프레임 워크 3에서 경로 컨트롤러를 구성하는 방법 (mvc 패턴)

내가 예 MVC 슬림형 골격의 수를 조사하고, 하나 개의 특정 가이드 샘플 프로젝트 ( http://jgrundner.com/slim-oo-004-controller-classes/)이 설정에서

내 structor 기초로 결정 주입 라우터를 추가함으로써 행해진 다

$container = $app->getContainer(); 

$container['\App\Controllers\DefaultController'] = function($c){ 
    return new \App\Controllers\DefaultController(
     $c->get('logger'), 
     $c->get('renderer') 
    ); 
}; 

이것은 다음에 좋은 깨끗한 경로와 컨트롤러를 허용 :

경로 예 :

과 같은 응용 프로그램 컨테이너 컨트롤러 16,
$app->get('/[{name}]', '\App\Controllers\DefaultController:index'); 

컨트롤러 예컨대 : 기본 컨트롤러를 확장

namespace App\Controllers; 

use Psr\Log\LoggerInterface; 
use Psr\Http\Message\RequestInterface; 
use Psr\Http\Message\ResponseInterface; 

    class DefaultController{ 
     private $logger; 
     private $renderer; 

     public function __construct(LoggerInterface $logger, $renderer){ 
      $this->logger = $logger; 
      $this->renderer = $renderer; 
     } 

     public function index(RequestInterface $request, ResponseInterface $response, $args){ 
      // Log message 
      $this->logger->info("Slim-Skeleton '/' route"); 

      // Render index view 
      return $this->renderer->render($response, 'index.phtml', $args); 
     } 

     public function throwException(RequestInterface $request, ResponseInterface $response, array $args){ 
      $this->logger->info("Slim-Skeleton '/throw' route"); 
      throw new \Exception('testing errors 1.2.3..'); 
     } 
    } 

은 깔끔한 컨트롤러를 유지하지만 당신이 수업을 많이 가지고 때 비효율적이고 지저분한 것 같다 먼저 응용 프로그램 컨테이너마다 새로운 컨트롤러 객체를 추가해야합니다.

더 좋은 방법이 있습니까?

+0

이 문서 http://glenneggleton.com/page/slim-에서 할 그 수있는 더 좋은 방법이있다 3-controllers-and-actions –

답변

0

acontainer가 포함 된 basecontroller를 만들 수 있습니다.

<?php 

namespace App\Controller; 

use Slim\Container; 

class Controller 
{ 
    var $container; 

    public function __construct(Container $container) 
    { 
     $this->container = $container; 
    } 

    public function __get($var) 
    { 
     return $this->container->{$var}; 
    } 
} 

용기 :

<?php 

$container['App\Controller\Controller'] = function ($c) { 
    return new App\Controller\Controller($c); 
}; 

그리고 컨트롤러

<?php 

namespace App\Controllers; 

use Psr\Http\Message\RequestInterface; 
use Psr\Http\Message\ResponseInterface; 
use App\Controller\Controller; 

class DefaultController extends Controller{ 

} 
+0

@tirita_keniten 이것이 가능하다는 것을 알고 있지만 테스트가 어렵 기 때문에 전체 컨테이너를 사방에 추가하는 것은 좋지 않다고 들었습니다. 당신은 그것에 대해 논평 할 수 있습니까? – Finglish

+0

@Finglish 나는 그렇게 생각한다. 그러나 그것은 내가 가지고있는 가장 좋은 습관이다. 지금까지 코드를 테스트 할 때 아무런 문제가 없습니다. 디버깅을 위해 슬림 프레임 워크는 꽤 좋습니다. 그렇지 않으면 Illuminate/Facades 또는 다른 facades 패키지를 사용할 수 있습니다. 따라서 정적 클래스 :: 메서드를 어디에서나 호출 할 수 있습니다. –