2016-08-20 62 views
0

你好,我正在學習PHP和我正在用Slim3框架構建一個REST API。我喜歡這個創建路線:Slim3容器的良好做法?

$container['HomeController'] = function() { 
    return new HomeController(); 
}; 

$currentContainer = CurrentContainer::getInstance(); 
$currentContainer->setContainer($container); 

$app->get('/', 'HomeController:index')->setName("index"); 

我的問題是,我不得不在$容器傳遞給每一個控制器類iv'e創建的,因爲我需要在控制器容器上下文路由等

那麼IM建立一個Singleton容器類是這樣的:

class CurrentContainer 
{ 

    private static $instance; 
    private $container; 

    private function __construct() 
    { 
    } 

    private function __clone() 
    { 
    } 

    public static function getInstance() 
    { 
     if (self::$instance == null) { 
     self::$instance = new CurrentContainer(); 
     } 
     return self::$instance; 
    } 

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

    /** 
    * @return mixed 
    */ 
    public function getContainer() 
    { 
     return $this->container; 
    } 
} 

所以現在它可以創建一個 「MainController」 是這樣的:

class Controller 
{ 


    /** 
    * @var mixed 
    */ 
    protected $view; 

    /** 
    * @var 
    */ 
    protected $router; 

    public function __construct() 
    { 
     $container = CurrentContainer::getInstance()->getContainer(); 
     $this->view = $container->view; 
     $this->router = $container->router; 
    } 


    } 

現在我所有的控制器都從控制器類擴展... 我的問題是現在...它是一個好主意還是有沒有理由不這樣做呢? 即時感謝每一個輸入

回答

2

我已經用Slim Framework構建了一些API,並且嘗試了很多方法來完成它(當然是正確的)。我在Slim Framework上實現了MVC模式。代碼示例如下:

  1. 對於控制器,我創建了一個注入容器的基礎控制器。因此,代碼:
<?php 

namespace App\Controller; 

use Slim\Container; 

class Controller 
{ 
    protected $container; 

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

    public function __get($name) 
    { 
     return $this->container->get($name); 
    } 
} 
  • 我裝上依賴容器中的基本控制器。
  • <?php 
    
    // controller 
    $container['controller'] = function ($c) { 
        return new App\Controller\Controller($c); 
    }; 
    
  • 因此,我可以得到來自控制器的容器中。
  • <?php 
    
    namespace App\Controller; 
    
    use App\Controller\Controller; 
    use Slim\Http\Request; 
    use Slim\Http\Response; 
    
    class HomeController extends Controller 
    { 
        public function __invoke(Request $request, Response $response, $args) 
        { 
         return $this->renderer->render($response, 'home'); 
        } 
    } 
    

    我希望它有幫助。

    +1

    這是更多的RouteAction,而不是控制器,因爲當使用__invoke() – geggleto

    +0

    時,類不能有多個動作哦,我明白了。我想你想用Facades調用容器。我建議你使用照明/外牆。您可以關注[此鏈接](https://www.sitepoint.com/how-laravel-facades-work-and-how-to-use-them-elsewhere/)。 –