Laravel và những điều cần biết - phần 2
Bài đăng này đã không được cập nhật trong 7 năm
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:
- 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 serverpost
: 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ửiencryption
: Đâ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 đipassword
: Mật khẩu email gửi đisendmail
: Đườ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 cc
và bcc
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