Viblo Learning
+1

Laravel và những điều cần biết - phần 2

Giới thiệu

Tiếp theo loạt bài viết về Laravel. Hôm nay chúng ta sẽ đi tìm hiểu:

  • Mail
  • Schedule

Nội dung

1. Mail

Laravel cũng cấp một API với trình điều khiển cho SMTP, Mailgun, SparkPost, Amazon SES, sendmail giúp việc gửi mail nhanh chóng và dễ dàng hơn.

Chuẩn bị

Để có thể gửi được mail bạn cần cài thêm package guzzlehttp/guzzle

composer require guzzlehttp/guzzle

Config

Tiếp theo cần quan cấu hình các tham số cho quá trình gửi mail Tất cả cấu hình và cài đặt để gửi được một email đều có trong file app/config/mail.php. Các tham số

  • driver: Config driver bạn muốn dùng để gửi mail. Mặc định của Laravel sẽ dùng SMTP driver. Tuy nhiên bạn cũng có thể thay đổi sang một driver khác.
  • host: Địa chỉ của mail server
  • post: Cổng của để gửi mail.
  • from: Trường này cho phép bạn cài đặt trường from trong email như: Địa chỉ gửi mail, tên người gửi
  • encryption: Đây là giao thức mã hóa sẽ được sử dụng bất cứ khi nào email được gửi đi. Thường sử dụng với 2 giao thức mã hóa chính là ssl và tls.
  • username: Địa chỉ email gửi đi
  • password: Mật khẩu email gửi đi
  • sendmail: Đường dẫn tới SendMail, nếu SendMail driver được sử dụng trên server

Thông thường, ta cấu hình các thông số trên trong file .env với các trường tương ứng: MAIL_DRIVER, MAIL_HOST, MAIL_PORT, MAIL_FROM_ADDRESS, MAIL_FROM_NAME, MAIL_ENCRYPTION, MAIL_USERNAME, MAIL_PASSWORD.

Sử dụng Mailgun

Để sử dụng được Mailgun bạn cần phải đăng kí tài khoản tại đây và config MAIL_DRIVER trong file .env thành mailgun. Tiếp đó config mailgun trong file config/services.php hoặc file .env. Nhập domain (MAILGUN_DOMAIN) và secret (MAILGUN_SECRET) mà bạn nhận được khi đăng kí tài khoản.

Trong laravel từng loại mail gửi đi sẽ được thể hiện như 1 class Mailables. Tất cả Mailables sẽ được lưu trong thư mục app/Mail. Tạo lớp Mailables gửi mail:

php artisan make:mail MailTest

Cấu hình view cho nội dung của mail trong phương thức build:

public function build()
{
    return $this->view('emails.mailTp');
}

Thêm data cho view

Để truyền data vào view ta sẽ khai báo biến public trong Mailables class và tạo nó trong hàm khởi tạo __construct. Laravel sẽ tự động truyền vào view cho ta.

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\User;

class MailTest extends Mailable
{

    use Queueable,
        SerializesModels;

    public $user;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct(User $user)
    {
        $this->user = $user;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('emails.mailTp');
    }

}

Tạo view:

{!! $user->id !!}
<br/>
{!! $user->name !!}
<br/>
{!! $user->email !!}

Gửi mail: Để gửi mail cho 1 hay nhiều người ta dùng câu lệnh: Mail::to(User::find(2)->email)->send(new MailTest(User::find(2))); Chúng ta có thể CC, BCC mail cho địa chỉ mail khác bằng cách sử dụng hàm ccbcc

Mail::to($request->user())
    ->cc($moreUsers)
    ->bcc($evenMoreUsers)
    ->send(new OrderShipped($order));

Đính kèm: Để đính kèm 1 tập tin trong mail ta sử dụng phương thức attach. Tham số truyền vào là đường dẫn đến file cần đính kèm.

public function build()
{
    return $this->view('emails.orders.shipped')
        ->attach('/path/to/file.pdf');
}

2. Schedule

Schedule là gì

Schedule cũng giống như Cron Job thôi. Nó cũng có mục đích là tạo các task, chạy tự động trên server. Cơ chế hoạt động của Schedule là máy chủ sẽ có 1 Cron chạy Laravel Schedule sau một khoảng thời gian ngắn. Schedule sẽ chạy theo lịch thế nào là do bạn lập trình trong code của Laravel. Như vậy, khi muốn thêm 1 Cron Job bạn không cần SSH vào máy chủ và thêm các mục Cron nữa mà chỉ cần cấu hình trực tiếp trên code laravel.

Bắt tay vào việc thôi:

Tạo Cron

Đầu tiên bạn phải tạo 1 Cron duy nhất để Server chạy Laravel Schedule mỗi phút: Mở file crontab: $ sudo nano /etc/crontab Thêm dòng * * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1

Tạo task Schedule Bạn có thể lên lịch cho tất cả các công việc của bạn trong phương thức schedule của class App\Console\Kernel.

Ví dụ: Xóa các user chưa active

<?php

namespace App\Console;

use DB;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use Carbon\Carbon;

class Kernel extends ConsoleKernel
{
    protected $commands = [
        \App\Console\Commands\Inspire::class,
    ];

    protected function schedule(Schedule $schedule)
    {
        $schedule->call(function () {
            DB::table('users')->where('is_active', false)->where('created_at', '<', Carbon::now()->addWeeks(-1)->toDateTimeString())->delete();
        })->daily();
    }
}

Ngoài việc gọi Closure ta có thể gọi Artisan commands bằng hàm command:

$schedule->command('emails:send --force')->daily();

Hoặc chạy các lệnh của hệ điều hành:

$schedule->exec('node sever.js')->daily();

Các thiết lập thời gian

Thiết lập thời gian

Method Description
->cron(' *'); chạy công việc trong custom Cron schedule
->everyMinute(); chạy mỗi phút 1 lần
->everyFiveMinutes(); chạy mỗi 5 phút 1 lần
->everyTenMinutes(); chạy mỗi 10 phút 1 lần
->everyThirtyMinutes(); chạy mỗi 30 phút 1 lần
->hourly(); chạy mỗi giờ 1 lần
->daily(); chạy mỗi ngày vào 00:00
->dailyAt('13:00'); chạy mỗi ngày vào 13:00
->twiceDaily(1, 13); chạy 2 lần 1 ngày vào 1:00 & 13:00
->weekly(); chạy mỗi tuần 1 lần
->monthly(); chạy mỗi tháng 1 lần
->yearly(); chạy mỗi năm 1 lần

Dưới đây là một danh sách của những hạn chế lịch trình bổ sung:

Method Description
->weekdays(); giới hạn công việc các ngày trong tuần
->sundays(); giới hạn công việc trong chủ nhật
->mondays(); giới hạn công việc trong thứ hai
->tuesdays(); giới hạn công việc trong thứ ba
->wednesdays(); giới hạn công việc trong thứ tư
->thursdays(); giới hạn công việc trong thứ năm
->fridays(); giới hạn công việc trong thứ sáu
->saturdays(); giới hạn công việc trong thứ bảy
->when(Closure); giới hạn công việc khi thỏa điều kiện
->at('13:00'); chạy công việc vào lúc 13h00

Ví dụ: Gửi mail cho các thành viên vào thứ 2 hàng tuần khi thỏa mãn 1 điều kiện nào đó

$schedule->command('emails:send')->weekly()->mondays()->when(function () {
    // Some code
    return true;
});

Tham khảo


All Rights Reserved