在我的模型中使用 Slim 3 捕获致命错误,必须实现接口互操作容器容器接口



我在Models上遇到 Slim 3 的可捕获致命错误,我的Controllers上也有类似的设置,它工作得很好。当我在Modal class上实现相同的操作时,出现以下错误。

Catchable fatal error: Argument 1 passed to BaseModelsBaseModel::__construct() must implement interface InteropContainerContainerInterface, none given, called in bootstrapapp.php on line 111 and defined in ModelsBaseModel.php on line 11

这是我的引导程序文件

use NoodlehausConfig;
session_start();
require __DIR__ . '/../vendor/autoload.php';
$app = new App([
    'settings' => [
        'determineRouteBeforeAppMiddleware' => true,
        'displayErrorDetails' => true,
        'addContentLengthHeader' => false
    ],
]);
$container = $app->getContainer();
$container['config'] = function() {
    return new Config(__DIR__ . '/../config/' . file_get_contents(__DIR__ . '/../env.php') . '.php');
};
$container['mailer'] = function($container) {
    return new MailgunEmail; ///LINE 110
};
require __DIR__ . '/../app/routes.php';

这是环境.php

return [
    'mailgun' => [
        'apikey' => 'key-123456',
        'domain' => 'sandbox123456.mailgun.org',
        'from' => 'noreply@anydomain.com',
    ],
];

我的基本模型

namespace BaseModels;
use InteropContainerContainerInterface;
abstract class BaseModel {
    protected $container;
    public function __construct(ContainerInterface $container) { /// LINE 11
        $this->container = $container;
    }
    public function __get($property) {
        if($this->container->{$property}) {
            return $this->container->{$property};
        }
    }
}

我的电子邮件模型

namespace BaseModels;
use BaseModelsBaseModel;
use HttpAdapterGuzzle6Client;
use MailgunMailgun;
class MailgunEmail extends BaseModel {
    public function sendWithApi($to, $subject, $html) {
        $client = new Client();
        /// INSTEAD OF HARD CODING LIKE THIS
        $mailgun = new Mailgun('key-123456', $client);
        /// I WANT TO DO SOMETHING LIKE THIS
        $mailgun = new Mailgun($this->config->get('mailgun.apikey'), $client);
        $domain = 'sandbox123456.mailgun.org';
        $builder = $mailgun->MessageBuilder();
        $builder->setFromAddress('noreply@anydomain.com');
        $builder->addToRecipient($to);
        $builder->setSubject($subject);
        $builder->setHtmlBody($html);
        return $mailgun->post("{$domain}/messages", $builder->getMessage());
    }
}

我不确定为什么会出现此错误或如何解决它。

只需将 $container 变量传递给引导程序中的MailgunEmail构造函数即可。

$container['mailer'] = function($container) {
    return new MailgunEmail($container); ///LINE 110
};

最新更新