Внедрить приложение Silex $ в мой пользовательский класс

Я работаю над проектом Silex, и я использую классы для разных видов лечения:

$connection = new Connection($app); $app->match('/connection', function () use ($app, $connection) { $connexion->connectMember(); return $app->redirect($app['url_generator']->generate('goHome')); })->method('GET|POST')->bind('doConnection'); 

В функции 'connectMember ()' моего класса 'Connection' у меня есть:

  [...] if($isMember){ [...] }else{ return $this->_app['twig']->render( 'message.twig', array('msg' => "This member does not exist.", 'class' => 'Warning')); } [...] 

Но метод render () не работает. Сообщение об ошибке, которое я хочу отобразить, не отображается и вместо этого запускается «$ app-> redirect (…)».

Как заставить мой класс использовать текущий объект Silex \ Application? Есть ли лучший способ привязать пользовательский класс к экземпляру приложения Silex?

Большое спасибо за ваши ответы!


Издание: Добавить информацию

Если я использую:

 return $connexion->connectMember(); 

Отобразится сообщение об ошибке. Но это нехорошее решение. Класс 'connection' вызывает другие классы, которые также используют этот код:

 $this->_app['twig']->render(...). 

Как заставить $ this -> _ app (присутствует в моих классах) соответствовать переменной $ app, созданной в моем контроллере?

Создайте службу для класса Connection (или Connexion ??) и введите приложение:

 use Silex\Application; class Connection { private $_app; public function __construct(Application $app) { $this->_app = $app; } // ... } 
 $app['connection'] = function () use ($app) { return new Connection($app); // inject the app on initialization }; $app->match('/connection', function () use ($app) { // $app['connection'] executes the closure which creates a Connection instance (which is returned) return $app['connection']->connectMember(); // seems useless now? return $app->redirect($app['url_generator']->generate('goHome')); })->method('GET|POST')->bind('doConnection'); 

Узнайте больше об этом в документации по силексу и прыщам (прыщ – это контейнер, используемый силекс).

если вы используете $ app-> share (…) для инъекции зависимостей, вы можете настроить что-то вроде этого (это псевдо-код):

 <?php namespace Foo; use Silex\Application as ApplicationBase; interface NeedAppInterface { public function setApp(Application $app); } class Application extends ApplicationBase { // from \Pimple public static function share($callable) { if (!is_object($callable) || !method_exists($callable, '__invoke')) { throw new InvalidArgumentException('Service definition is not a Closure or invokable object.'); } return function ($c) use ($callable) { static $object; if (null === $object) { $object = $callable($c); if ($object instanceof NeedAppInterface) { // runtime $app injection $object->setApp($c); // setApp() comes from your NeedAppInterface } } return $object; }; } } 

Теперь сделаем следующее:

 $app['mycontroller'] = $app->share(function() use ($app) { return new ControllerImplementingNeedAppInterface(); }); 

автоматически установит $ приложение при вызове $ app ['mycontroller']!

PS: если вы не хотите использовать -> share (), попробуйте использовать __invoke ($ app), потому что \ Pimple :: offsetGet () вызывает его: p