Перенаправить и показать сообщение Slim Flash после отправки / отказа почты - PullRequest
0 голосов
/ 10 декабря 2018

Я новичок в Слиме.Все было хорошо, но я попытался представить пакет Slim-Flash и хотел уведомить своих пользователей о том, что сообщение формы контакта отправляется или не получается.

Я использую стандартный метод PhpMailer.Чтобы поддерживать чистоту моих маршрутов, я создал класс для обработки почты, который прекрасно работает:

class Mailer
{
   public function __invoke($request, $response, $args) use ($app) {
   // SMTP & Fields
   }
}

В случае успеха я хочу выполнить перенаправление и показать свои тонкие сообщения примерно так:

$this->flash->addMessage('global', 'Message sent!');
return $response->withRedirect($app->router->pathFor('contact'));

Однако, когда я пытаюсь выполнить действие, я сталкиваюсь со следующей ошибкой:

Call to a member function getContainer() on null

Я довольно новичок, и я явно что-то здесь упускаю - любые советы будут действительно полезны.

Это полный след:

#0 /Applications/MAMP/htdocs/portalSlim/vendor/composer/ClassLoader.php(444): include()
#1 /Applications/MAMP/htdocs/portalSlim/vendor/composer/ClassLoader.php(322): Composer\Autoload\includeFile('/Applications/M...')
#2 [internal function]: Composer\Autoload\ClassLoader->loadClass('App\\Mail\\Mailer')
#3 [internal function]: spl_autoload_call('App\\Mail\\Mailer')
#4 /Applications/MAMP/htdocs/portalSlim/vendor/slim/slim/Slim/CallableResolver.php(89): class_exists('App\\Mail\\Mailer')
#5 /Applications/MAMP/htdocs/portalSlim/vendor/slim/slim/Slim/CallableResolver.php(67): Slim\CallableResolver->resolveCallable('App\\Mail\\Mailer')
#6 /Applications/MAMP/htdocs/portalSlim/vendor/slim/slim/Slim/CallableResolverAwareTrait.php(45): Slim\CallableResolver->resolve('App\\Mail\\Mailer')
#7 /Applications/MAMP/htdocs/portalSlim/vendor/slim/slim/Slim/Route.php(351): Slim\Routable->resolveCallable('App\\Mail\\Mailer')
#8 /Applications/MAMP/htdocs/portalSlim/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(117): Slim\Route->__invoke(Object(Slim\Http\Request), Object(Slim\Http\Response))
#9 /Applications/MAMP/htdocs/portalSlim/vendor/slim/slim/Slim/Route.php(334): Slim\Route->callMiddlewareStack(Object(Slim\Http\Request), Object(Slim\Http\Response))
#10 /Applications/MAMP/htdocs/portalSlim/vendor/slim/slim/Slim/App.php(515): Slim\Route->run(Object(Slim\Http\Request), Object(Slim\Http\Response))
#11 /Applications/MAMP/htdocs/portalSlim/vendor/slim/csrf/src/Guard.php(171): Slim\App->__invoke(Object(Slim\Http\Request), Object(Slim\Http\Response))
#12 [internal function]: Slim\Csrf\Guard->__invoke(Object(Slim\Http\Request), Object(Slim\Http\Response), Object(Slim\App))
#13 /Applications/MAMP/htdocs/portalSlim/vendor/slim/slim/Slim/DeferredCallable.php(43): call_user_func_array(Object(Slim\Csrf\Guard), Array)
#14 [internal function]: Slim\DeferredCallable->__invoke(Object(Slim\Http\Request), Object(Slim\Http\Response), Object(Slim\App))
#15 /Applications/MAMP/htdocs/portalSlim/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(70): call_user_func(Object(Slim\DeferredCallable), Object(Slim\Http\Request), Object(Slim\Http\Response), Object(Slim\App))
#16 /Applications/MAMP/htdocs/portalSlim/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(117): Slim\App->Slim\{closure}(Object(Slim\Http\Request), Object(Slim\Http\Response))
#17 /Applications/MAMP/htdocs/portalSlim/vendor/slim/slim/Slim/App.php(406): Slim\App->callMiddlewareStack(Object(Slim\Http\Request), Object(Slim\Http\Response))
#18 /Applications/MAMP/htdocs/portalSlim/vendor/slim/slim/Slim/App.php(314): Slim\App->process(Object(Slim\Http\Request), Object(Slim\Http\Response))
#19 /Applications/MAMP/htdocs/portalSlim/public/index.php(7): Slim\App->run()
#20 {main}

1 Ответ

0 голосов
/ 10 декабря 2018

Использование ключевого слова use для того, чтобы метод __invoke (являющийся членом класса Mailer, а не анонимная функция ) имел доступ к $app, как

public function __invoke($request, $response, $args) use ($app)

не делает то, что вы ожидаете, и вызовет синтаксическую ошибку.Slim передает экземпляр контейнера в ваш конструктор класса всякий раз, когда ему требуется создать новый экземпляр вашего класса, поэтому у вашего Mailer класса должен быть метод __construct, принимающий параметр Psr\Container\ContainerInterface.Затем вы можете извлечь маршрутизатор из контейнера ($this->continer->router вместо $app->router):

use Psr\Container\ContainerInterface

class Mailer
{
   protected $container;

   public function __construct(ContainerInterface $container) {
       $this->container = $container;
   }
   public function __invoke($request, $response, $args) {
       $this->container->flash->addMessage('global', 'Message sent!');
       return $response->withRedirect($this->container->router->pathFor('contact'));
   }
}
...