vorontsov_aa
@vorontsov_aa
интересуюсь веб-разработкой

Как написать метод laravel?

Коллеги, моя первая задача по laravel.
Очень прошу помочь разобраться
Вот что дано:

Таблица notifications:
1. id
2. to - char (50) not null (Email или Номер телефона)
3. type - tinyint (1) тип события (1 - TYPE_EMAIL, 2 - TYPE_TELEGRAM)
4. template - char (50) default null
5. class_provider - string(255)
6. subject - string (150) default null
7. content - text not null
8. created_at
9. updated_at
10. status - tinyint (1) default 0 (0 - STATUS_WAIT, 1 - STATUS_SENT, 2 - STATUS_ERROR)

Нужно создать метод sendNotification, который осуществляет отправку уведомления в зависимости от его типа (email или телеграм)
В емэйл нужно учесть class_provider (Например App\Modules\Site\Mail\CallbackRequestMail) через который происходит отправка, тема письма (subject) и content (json)
Если отправка произошла успешно ставим status = 1 или 2 в случае ошибки
  • Вопрос задан
  • 76 просмотров
Пригласить эксперта
Ответы на вопрос 1
@kalsc12345
Неизвестный человек.
Задача из не простых конечно уж.
Если готовые коды но неизвестно рабочие или нет.
Юзаем библиотеку Laravel SwiftMailer
И для телеги Laravel Telegram Bot API.

Начинаем наш скрипт делать.

// app/Models/Notification.php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Notification extends Model
{
    const TYPE_EMAIL = 1;
    const TYPE_TELEGRAM = 2;
    const STATUS_WAIT = 0;
    const STATUS_SENT = 1;
    const STATUS_ERROR = 2;

    protected $fillable = ['to', 'type', 'template', 'class_provider', 'subject', 'content', 'status'];

    public function sendNotification()
    {
        // ...
    }
}


public function sendNotification()
{
    switch ($this->type) {
        case self::TYPE_EMAIL:
            $this->sendEmailNotification();
            break;

        case self::TYPE_TELEGRAM:
            $this->sendTelegramNotification();
            break;

        default:
            throw new \Exception('Unknown notification type');
    }
}


public function sendEmailNotification()
{
    // Получаем провайдера email из поля class_provider
    $provider = app($this->class_provider);

    // Получаем получателя и контент сообщения из модели уведомления
    $to = $this->to;
    $content = json_decode($this->content);

    // Создаем экземпляр класса MailMessage
    $message = new \Illuminate\Mail\Message();

    // Устанавливаем адрес отправителя и получателя
    $message->setFrom(config('mail.from.address'), config('mail.from.name'));
    $message->addTo($to);

    // Устанавливаем тему и контент сообщения
    $message->setSubject($this->subject);
    $message->setBody($content->message, 'text/html');

    // Отправляем сообщение
    try {
        $provider->send($message);
        $this->status = self::STATUS_SENT;
    } catch (\Exception $e) {
        $this->status = self::STATUS_ERROR;
    }

    $this->save();
}


public function sendTelegramNotification()
{
    // Получаем получателя и контент сообщения из модели уведомления
    $to = $this->to;
    $content = json_decode($this->content);

    // Отправляем сообщение
    try {
        \Telegram::sendMessage([
            'chat_id' => $to,
            'text' => $content->message,
        ]);
        $this->status = self::STATUS_SENT;
    } catch (\Exception $e) {
        $this->status = self::STATUS_ERROR;
    }

    $this->save();


Ну теперь почта.

config/mail.php

// config/mail.php

return [

    'default' => env('MAIL_MAILER', 'smtp'),

    'mailers' => [
        'smtp' => [
            'transport' => 'smtp',
            'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
            'port' => env('MAIL_PORT', 587),
            'encryption' => env('MAIL_ENCRYPTION', 'tls'),
            'username' => env('MAIL_USERNAME'),
            'password' => env('MAIL_PASSWORD'),
            'timeout' => null,
            'auth_mode' => null,
        ],
    ],

    // ...

];


И юзаем метод для отправки уведомление в любое место нашего приложения.

$notification = Notification::find(1);
$notification->sendNotification();
Ответ написан
Ваш ответ на вопрос

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

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