2016-08-29 11 views
2

スリムフレームワークベースのAPIを開発中です。 mvcパターンに続いて、私は自分のルートをロガーとレンダラーがすべてのコントローラーに注入されたコントローラー駆動にしたい。スリムフレームワーク3(mvcパターン)でルートコントローラを構成する方法

私はスリムスケルトンをMVCの例の数をチェックアウトして、この設定では、1つの特定のチュートリアルとサンプルプロジェクト(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') 
    ); 
}; 

これは、素敵なきれいなルートとコントローラを可能に:

ルートの例:

$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コントローラとアクション –

答えて

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私はそうだと思いますが、それは私が持っているベストプラクティスです。これまでのところ、私は自分のコードをテストするのに何の問題もありません。デバッグのために、スリムフレームワークはかなりいいです。 そうでなければ、イルミネート/ファサードまたは別のファサードパッケージを使用することができます。だからどこでも静的なクラス::メソッドを呼び出すことができます。 –

関連する問題