2013-02-05 49 views
1

我有什麼:

# index.php 
$app = new Silex\Application(); 

... (loading routes file by YamlFileLoader) ... 

$app['routes']->addCollection($loader->load('routes.yml')); 
$app->run(); 

路由:

# routes.yml 
home: 
    pattern:/
    defaults: { _controller: 'Controllers\DefaultController::indexAction' } 

我怎樣才能獲取內幕控制器$應用程序實例? 很簡單:

# controllers/DefaultController.php 
class DefaultController 
{ 
    public function indexAction(Request $request, Application $app) 
    { 
     // this is the place! 
     return $app['twig']->render('index.twig'); 
    } 
} 

好吧,這很好,但也有幾個原因,這種方法是不能接受我。我想用經典的方式:

# controllers/DefaultController.php 
class DefaultController 
{ 
    public function indexAction() 
    { 
     return $this->twig->render('index.twig'); 
    } 
} 

爲了提供這一點,我想用父基類:

# controllers/BaseController.php 
class BaseController 
{ 
    protected $twig; 

    public function __construct(Application $app) 
    { 
     $this->twig = $app['twig']; 
    } 
} 

正如你所期望的:

# controllers/DefaultController.php 
class DefaultController extends BaseController 
... 

那麼,哪種方式更適合將基本控制器注入到應用程序中?

+1

請注意,您可以將控制器定義爲服務:http://silex.sensiolabs.org/doc/providers/service_controller.html – igorw

回答

1

我用它來做和你想要做的一樣的BaseController

在控制器類,定義connect方法是這樣的:

class MyController implements ControllerProviderInterface                                               
{                                                            
    protected $app;                                                       

    public function connect(Application $app)                                                 
    {                                                           
     $this->app = $app;                                                      
     $controller_collection = $app['controllers_factory'];                                             

     $controller_collection->get('/', array($this, 'searchForm'))->bind('user_search_form'); 

     // DECLARE ALL YOUR ROUTES HERE 
    } 

    public function searchForm() 
    { 
     return $this->app['twig']->render("search_form", array ...) 
    } 
} 

它工作得很好。我也不建議你使用YML進行路由,除非你在某處緩存PHP或者你想要性能問題。

+1

這種方式不再適用於silex 1.2.0。 – CSchulz

+0

@CSchulz - 如果這種方式不起作用,因爲它現在提供了ServiceControllerServiceProvider,但是如何將它掛接到像他一樣使用YAML的silex系統? – azngunit81