Я работаю над проектом 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