IwanQ
@IwanQ
Плохие времена часто дают прекрасные возможности

Проблема при попытке отправить письмо?

Здравствуйте. Столкнулся с проблемой, решить которую не могу решить и вообще понять почему она произошла.

Структура:

UserActivationService.php

<?php
namespace Models\Users;
use Services\Db;
class UserActivationService{
    private const TABLE_NAME = 'users_activation_codes';
    public static function createActivationCode(User $user): string{
        $code = bin2hex(random_bytes(16));
        $db = Db::getInstance();
        $db->query(
            'INSERT INTO ' . self::TABLE_NAME . ' (user_id, code) VALUES (:user_id, :code)',
            [
                'user_id' => $user->getId(),
                'code' => $code
            ]
        );
        return $code;
    }
    public static function checkActivationCode(User $user, string $code): bool{
        $db = Db::getInstance();
        $result = $db->query(
            'SELECT * FROM ' . self::TABLE_NAME . ' WHERE user_id = :user_id AND code = :code',
            [
                'user_id' => $user->getId(),
                'code' => $code
            ]
        );
        return !empty($result);
    }
}
 ?>


EmailSender.php

<?php
namespace Services;
use Models\Users\User;
class EmailSender{
    public static function send(
        User $receiver,
        string $subject,
        string $templateName,
        array $templateVars = []
    ): void {
        extract($templateVars);
        ob_start();
        require __DIR__ . '/../templates/mail/' . $templateName;
        $body = ob_get_contents();
        ob_end_clean();
        mail($receiver->getEmail(), $subject, $body, 'Content-Type: text/html; charset=UTF-8');
    }
}
 ?>


UsersController.php

<?php
namespace Controllers;
use View\View;
use Models\Users\User;
use Exceptions\InvalidArgumentException;
use Models\Users\UserActivationService;
use Services\EmailSender;
class UsersController{
private $view;
        public function __construct(){
            $this->view = new View(__DIR__ . '/../templates');
        }
        public function signUp(){
            if (!empty($_POST)) {
                try {
                    $user = User::signUp($_POST);
                } catch (InvalidArgumentException $e) {
                    $this->view->renderHtml('users/signUp.php', ['error' => $e->getMessage()]);
                    return;
                }
                if ($user instanceof User) {
                    $code = UserActivationService::createActivationCode($user);
                    EmailSender::send($user, 'Активация', 'userActivation.php', [
                        'userId' => $user->getId(),
                        'code' => $code
                    ]);
                    $this->view->renderHtml('users/signUpSuccessful.php');
                    return;
                }
            }
            $this->view->renderHtml('users/signUp.php');
        }
}
 ?>


Это основные файлы.

Скриншот ошибки прикрепляю. На сколько я понял, не может быть найден метод, но почему? Путь
require __DIR__ . '/../templates/mail/' . $templateName;
сразу скажу что правильный, запись в бд добавляется, но само письмо на почту не отправляется.

Заранее спасибо за любые идеи.

5daef00b94a00369344483.jpeg
  • Вопрос задан
  • 82 просмотра
Решения вопроса 1
glaphire
@glaphire Куратор тега PHP
PHP developer
Автор, вы написали так много кода с стремлением к ООП, но ответ же в самой ошибке белым по черному - нет такого метода в классе User. Если взять и посмотреть файл и строчку, то видно:
mail($receiver->getEmail(), $subject, $body, 'Content-Type: text/html; charset=UTF-8');

Оформляйте код по PSR-4 - сейчас код сливается в одно целое из-за плохого форматирования
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
не могу понять почему она произошла.

Для этого следует прочитать сообщение об ошибке.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы