Bir kullanıcı bir kursu tamamladığında, iş başvurusu ile iliştirebileceği, tam kalitede basılabilir ve bir işverenin doğruluğunu kontrol edebileceği bir belge gibi davranan bir sertifika ister. Bu makalede, Laravel ile tam olarak bunu nasıl yapacağınızı öğreneceksiniz: bir Blade ile tasarlanmış sertifika, bir doğrulama sayfasına yönlendiren bir QR kodu ile birlikte, otomatik olarak teslim edilen bir e-posta.
Blade’de Tasarımı Koruyun
Sertifika, tek bir dosyada yaşayan sıradan bir Blade görünümüdür, stiller inline olarak tanımlanır, böylece tarayıcıda önizlediğiniz işaretleme, üretilen ile tam olarak aynıdır. Boş bir sayfa yerine tasarlanmış bir başlangıç noktası arıyorsanız, tamamlanmış sertifika şablonu iyi bir temel sunar.
{{-- resources/views/certificates/template.blade.php --}}
Certificate of Completion
has completed {{ $certificate->course }}
Issued {{ $certificate->issued_at->format('j F Y') }}
{!! QrCode::size(110)->generate(route('certificates.verify', $certificate)) !!}
{{ route('certificates.verify', $certificate) }}
İki şey burada sessizce çalışıyor. Tasarım, sabit piksel boyutlarında sabitlenmek yerine bir belge gibi akıyor, çünkü PDF, A4 portre sayfalarına render edilmektedir. QR kodu, dışarıdan bir şey almaya ihtiyaç duymadan inline SVG olarak üretilmektedir.
Her Sertifikaya Doğrulanabilir Bir Kimlik Verin
Doğrulama yalnızca sabit bir kamu tanımlayıcısı ve bunu çözen bir sayfa gerektirir. Sertifika satırında bir UUID yeterlidir.
Schema::create('certificates', function (Blueprint $table) {
$table->id();
$table->uuid()->unique();
$table->foreignId()->constrained();
$table->string();
$table->timestamp();
$table->timestamps();
});
Doğrulama rotası, UUID ile bağlandığı için, ardışık kimliklerin tahmin edilmesi kimseyi bir yere götürmez.
Route::get(, function (Certificate $certificate) {
return view(, [=> $certificate]);
})->name();
Doğrula görünümü, öğrenicinin adı, kursu ve basım tarihi gösterir. Basılı sertifikanın QR kodunu tarayan herkes, alan adınızda bu kaydı görür ve bu, güven hikayesinin tamamıdır: kağıt bunu iddia eder, veritabanınız doğrular.
QR kodu için, standart paketi ekleyin. Varsayılan renderlayıcı SVG çıkışı veriyor, bu da tam olarak istediğiniz şey:
composer require simplesoftwareio/simple-qrcode
Bunu Vektör PDF Olarak Render Edin
Bu Blade görünümünü PDF’ye dönüştürmenin üç yolu vardır. DomPDF, saf PHP’dir ama sınırlı CSS desteği vardır ve bir sertifika tam olarak bu tür bir tasarıma sahiptir. Browsershot doğru bir şekilde render eder çünkü gerçek Chrome’u çalıştırır, ancak şimdi sunucunuzda Chrome’u yüklemek ve idare etmek zorundasınız. Üçüncü yol, bir HTML to PDF API: renderlanmış HTML’yi format: "pdf" ile POST edersiniz ve tamamlanmış bir belgeye dair bir URL alırsınız, bu da işletmeye bağlı bir tarayıcı motoru tarafından render edilir.
Servis çok kısa:
namespace App\Services;
use App\Models\Certificate;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Storage;
class CertificateService
{
public function issue(Certificate $certificate): string
{
$html = view(, [
=> $certificate,
])->render();
$response = Http::withHeaders([
=> config(),
])->post(, [
=> $html,
=> ,
])->throw()->json();
$path = {->uuid.pdf";
Storage::put(, Http::get([])->body());
return ;
}
}
Anahtarın config/services.php dosyasına eklenmesi, onun kod tabanından çıkmasını sağlar:
=> [
=> env(),
],
Geri dönen dosya gerçek bir vektör PDF’dir. Metin seçilebilir ve arama yapılabilir, yazı tipleri gömülüdür ve her boyutta net bir şekilde yazdırılır. Bu da tam olarak bir sertifikanın ihtiyaç duyduğu şeydir ve PNG’nin sunamayacağı bir özellik.
Öğrenciye E-posta Gönderin
PDF’yi bir kez depolayın ve ardından bir mailable içinde depolamadan ekleyin:
namespace App\Mail;
use App\Models\Certificate;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Attachment;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
class CertificateIssued extends Mailable
{
public function __construct(public Certificate $certificate)
{
}
public function envelope(): Envelope
{
return new Envelope(
subject: .$this->certificate->course,
);
}
public function content(): Content
{
return new Content(markdown: );
}
public function attachments(): array
{
return [
Attachment::fromStorage({$this->certificate->uuid}.pdf")
->as()
->withMime(),
];
}
}
Kurs Tamamlanması ile Bağlayın
Bir geçmiş olayı dinleyici içine kurulum ve teslimat yaparak, kursun tamamlandığını işaret eden bir etkinlik için işleyin:
public function handle(CourseCompleted $event): void
{
$certificate = Certificate::create([
=> () Str::uuid(),
=> ->user->id,
=> ->course->title,
=> now(),
]);
app(CertificateService::class)->issue();
Mail::to(->user)->send(new CertificateIssued());
}
Dinleyiciyi bir kuyruğa gönderin ve öğrenici, tamamladıktan birkaç saniye sonra doğrulanabilir bir belgeyi gelen kutusunda bulsun. Ekibinizden hiç kimse bir şey yapmadan.
Toplu İşlem ve Değişiklik Kanıtı
Hacim büyüdüğünde iki iyileştirme yapılabilir. Kitlesel verme, tarihi kohortlar veya dönem sonu çalışmaları için, her isteğe bir webhook_url geçirin ve bağlantıları açık tutmak yerine PDF’leri bitirildikçe toplayın. Ayrıca, doğrulamanın veritabanı sorgusunun ötesinde bir incelemeye dayanabilmesi gerekiyorsa, içerik hash’leri ve imzalı tanımlayıcılar belgenin kendisini değiştirilemez hale getirir; bu yaklaşım ölçekle imzalı dijital sertifikalar üretmek hakkındada ele alınmıştır.
Bu makalede Blade’de bir sertifika tasarladınız, bunu bir vektör PDF olarak render ettiniz, doğrulama bağlantılı bir QR kodu verdiniz ve kurs tamamlandığında e-posta ile teslim ettiniz. Tam sürüm, sabit genişlik ölçeklendirme notları ve Open Badges eşlemesi ile birlikte Accreditly‘de yer almaktadır.
Şu anda Laravel uygulamalarınızda sertifikaları nasıl veriyorsunuz? Yaklaşımınızı aşağıdaki yorumlarda paylaşın.
Kaynak: Orijinal Makale


