php - 邮件发送/失败后重定向并显示 Slim Flash 消息

标签 php slim

我是 Slim 的新手。一切都很好,但我尝试引入 Slim-Flash 包,并希望在联系表单消息发送或失败时通知我的用户。

我正在使用 PhpMailer 的标准方法。为了保持我的路线清洁,我创建了一个类来处理邮件,一切都很好:

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

成功后我想执行重定向并显示我的 slim 消息,如下所示:

$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}

最佳答案

使用 use 关键字让 __invoke 方法(它是 Mailer 类的成员,而不是 anonymous function )可以访问 $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'));
   }
}

关于php - 邮件发送/失败后重定向并显示 Slim Flash 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53696967/

相关文章:

php - 如何使用Slim Router在PHP MVC中向用户显示错误消息?

php - Mysql 正则表达式按数字选择

java - 应为 BEGIN_ARRAY,但在第 1 行第 1 列处为 STRING : getting JSON from PHP to Java with Gson

php - 同时执行多个 Python 脚本导致 PHP/Apache 挂起

PHP MySql URL重写字符串特殊字符作为参数问题

php - 利用 ? (问号)代替/使用 Slim Framework

php - Slim v3 重复缓存控制 header

php - 从 ADDTIME(CURTIME(), '14400 hour' ) 格式中选择内容时出错

php - 在php mysql中使用 "case ... when"时出错返回数据null?

php - Docker容器在运行php代码后立即退出