2013-02-05 5 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 
... 

을 그리고 고전적인 방법을 사용하려면 그래서,베이스 컨트롤러에 silex $ app을 주입하는 것이 더 좋습니다.

+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 ...) 
    } 
} 

. PHP를 어딘가에 캐시하지 않거나 성능 문제를 원한다면 YML을 라우팅에 사용하도록 권하지 않습니다.

+1

이 방법은 더 이상 silex 1.2.0에서 작동하지 않습니다. – CSchulz

+0

@CSchulz -이 방법은 현재 ServiceControllerServiceProvider를 제공하기 때문에 작동하지 않지만 YAML을 사용하는 silex 시스템에 어떻게 연결합니까? – azngunit81

관련 문제