2013-07-25 3 views
0

У меня есть следующие DemoControllerInject Применения в контроллер

class DemoController { 

    public function test() { 
     return new Response('This is a test!'); 
    } 

} 

Я хочу, чтобы связать этот контроллер $app ['demo.controller']

$app ['demo.controller'] = $app->share (function() use($app) { 
    return new DemoController(); 
}); 

Внутри DemoController я хочу иметь Application $app объект для работы с зарегистрированными услугами. Каков правильный путь? В настоящее время я использую __construct($app) для DemoController и прохожу $app. Это выглядит как

$app ['demo.controller'] = $app->share (function() use($app) { 
    return new DemoController ($app); 
}); 

Какова наилучшая практика для этого?

ответ

1

Это, безусловно, один из способов сделать это. Я хочу показать две альтернативы.

Один, чтобы получить приложение, впрыскиваемого в метод действия, непосредственно используя тип подсказки:

use Silex\Application; 
use Symfony\Component\HttpFoundation\Request; 

class DemoController 
{ 
    public function test(Request $request, Application $app) 
    { 
     $body = 'This is a test!'; 
     $body .= ':'.$request->getRequestUri(); 
     $body .= ':'.$app['foo']->bar(); 
     return new Response($body); 
    } 
} 

Преимущество этого варианта заключается в том, что вы на самом деле не нужно зарегистрировать контроллер в качестве службы.

Другая возможность состоит в том, чтобы придать конкретную услугу вместо инъекций весь контейнер:

use Silex\Application; 
use Symfony\Component\HttpFoundation\Request; 

class DemoController 
{ 
    private $foo; 

    public function __construct(Foo $foo) 
    { 
     $this->foo = $foo; 
    } 

    public function test() 
    { 
     return new Response($this->foo->bar()); 
    } 
} 

Определение сервиса:

$app['demo.controller'] = $app->share(function ($app) { 
    return new DemoController($app['foo']); 
}); 

Преимущество этого варианта в том, что ваш контроллер больше не зависит от silex, контейнер или любое конкретное имя службы. Это делает его более изолированным, повторно используемым и легче тестировать изолированно.

Смежные вопросы