برنامه نویسی

تولید خودکار تصاویر نمودار باز با لاراول

لاراول یک فریمورک محبوب PHP است که ساخت برنامه های تحت وب را آسان می کند. در این مقاله به نحوه تولید خودکار تصاویر Open Graph با لاراول می پردازیم.

برای این قابلیت، ما می‌خواهیم تصویر را در پس‌زمینه تولید کنیم، این تصویر را در حافظه پنهان ذخیره کنیم و سپس این تصویر را به کاربر ارائه دهیم. به این ترتیب می توانیم یک بار تصویر را تولید کنیم و سپس بدون نیاز به تولید هر بار آن را به کاربر ارائه دهیم.

برای انجام این کار از بسته استفاده می کنیم spatie/browsershot که از مرورگر بدون سر برای تولید تصویر استفاده می کند. این به ما امکان می دهد مسیری ایجاد کنیم که مرورگر بدون هد از آن برای ذخیره خروجی به عنوان تصویر استفاده کند.

Browsershot را نصب کنید

اولین کاری که باید انجام دهید این است که نصب کنید spatie/browsershot بسته بندی این بسته ابزاری برای تولید تصاویر با استفاده از یک مرورگر هدلس است. می توانید آن را با استفاده از آهنگساز نصب کنید.

composer require spatie/browsershot
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مسیر را برای تصویر ایجاد کنید

هنگامی که شما را نصب کردید spatie/browsershot بسته، می توانید یک مسیر جدید ایجاد کنید که تصویر Open Graph را ایجاد کند. این مسیر از browsershot بسته برای تولید تصویر و ذخیره آن در حافظه محلی.

در اینجا مثالی از نحوه ایجاد مسیری برای ایجاد یک تصویر Open Graph آورده شده است:

Route::get('/og-image', OgImageController::class);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در این مثال، ما یک مسیر جدید ایجاد می کنیم که از مسیر استفاده می کند OgImageController برای تولید تصویر Open Graph.

کنترلر را ایجاد کنید

چند مرحله برای این کنترلر وجود دارد، بنابراین ما آن را به چند مرحله تقسیم می کنیم.

ابتدا باید کنترلری را با متد invoke ایجاد کنیم که تصویر را تولید کند.



namespace App\Http\Controllers;

use Illuminate\Http\Request;

class OgImageController extends Controller
{
    public function __invoke(Request $request)
    {

    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ما یک querystring را به مسیری که به عنوان عنوان در تصویر تولید شده استفاده می کنیم، منتقل می کنیم. با این کار مسیر به شکل زیر در می آید:

/og-image?title=Hello%20World
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در کنترلر باید به این querystring دسترسی داشته باشیم تا از آن به عنوان متن در تصویر استفاده کنیم که این کار را با استفاده از عبارت انجام می دهیم $request هدف – شی.

$request->validate([
    'title' => 'required|string',
]);

$title = $request->get('title');
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

HTML را از Blade ایجاد کنید

ما باید HTML را از فایل blade دریافت کنیم زیرا می‌خواهیم این را به بسته مرورگر شات منتقل کنیم، نمی‌خواهیم HTML را در کنترلر برگردانیم، اما باید HTML را رندر کنیم.

$html = view('ogimage', [
    'title' => $title,
])->render();
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

فایل blade را در دایرکتوری sources/views به نام ایجاد کنید ogimage.blade.php با محتوای زیر:


 lang="en">

    @vite('resources/js/app.js')


class="border-2 border-gray-800 w-[1200px] h-[630px] bg-gray-900">

class="flex flex-col items-center justify-center h-full w-full bg-cover bg-center bg-no-repeat">

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توجه کنید @vite دستورالعمل این یک دستورالعمل سفارشی است که دارایی های Vite را در فایل blade شامل می شود. یا باید از فایل CSS اصلی خود استفاده کنید یا در این مورد ما از جاوا اسکریپت برای وارد کردن CSS استفاده می کنیم. از موردی استفاده کنید که مناسب برنامه شماست.

ایجاد تصویر

اکنون می‌توانیم با استفاده از کنترلر، تصویر را تولید کنیم browsershot بسته بندی ما قصد داریم از browsershot بسته برای تولید تصویر و ذخیره آن در حافظه محلی.

$slugTitle = Str::slug($title);

$browsershot = Browsershot::html($html)
    ->noSandbox()
    ->showBackground()
    ->windowSize(1200, 630)
    ->setScreenshotType('png');

if (config('ogimage.node_path')) {
    $browsershot->setNodeBinary(config('chrome.node_path'));
}

if (config('ogimage.npm_path')) {
    $browsershot->setNpmBinary(config('chrome.npm_path'));
}

$image = $browsershot->screenshot();

// Store image locally
Storage::disk('local')->put('public/og-images/' . $slugTitle . '.png', $image);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در این مثال، HTML تولید شده را می گیریم و آن را به بسته Browsershot ارسال می کنیم. اندازه پنجره را روی آن قرار می دهیم 1200x630 پیکسل و نوع اسکرین شات را روی PNG قرار دهید. سپس تصویر را در حافظه محلی ذخیره می کنیم.

سرویس تصویر

اکنون که تصویر را تولید کرده و در حافظه محلی ذخیره کرده ایم، می توانیم این تصویر را به کاربر ارائه دهیم. ما می توانیم این کار را با برگرداندن تصویر از کنترلر انجام دهیم.

return response($image, 200, [
    'Content-Type' => 'image/png',
]);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بررسی تصویر موجود

کد بالا هر بار تصویر را تولید می کند و آن را در حافظه محلی ذخیره می کند، اما ما نیازی به تولید تصویر در هر زمان نداریم. ما می توانیم بررسی کنیم که آیا تصویر وجود دارد یا خیر، می توانیم تصویر را از ذخیره سازی محلی برگردانیم.

if (Storage::disk('local')->exists('public/og-images/'.$slugTitle.'.png')) {
    return response(Storage::disk('local')->get('public/og-images/'.$slugTitle.'.png'), 200, [
        'Content-Type' => 'image/png',
    ]);
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ما می توانیم این کد را در بالای کنترلر قرار دهیم و در صورت وجود تصویر می توانیم تصویر را از حافظه محلی برگردانیم.

کد کامل کنترلر

در زیر کد کامل استفاده شده در کنترلر وجود دارد که می توانید از آن برای تولید ogimage استفاده کنید



namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Spatie\Browsershot\Browsershot;

class OgImageController extends Controller
{
    public function __invoke(Request $request)
    {
        $request->validate([
            'title' => 'required|string',
        ]);

        $title = $request->get('title');
        $slugTitle = Str::slug($title);

        if ($this->hasImage($slugTitle)) {
            return response($this->getImage($slugTitle), 200, [
                'Content-Type' => 'image/png',
            ]);
        }

        $html = view('ogimage', [
            'title' => $title,
        ])->render();

        $browsershot = Browsershot::html($html)
            ->noSandbox()
            ->showBackground()
            ->windowSize(1200, 630)
            ->setScreenshotType('png');

        if (config('chrome.node_path')) {
            $browsershot->setNodeBinary(config('chrome.node_path'));
        }

        if (config('chrome.npm_path')) {
            $browsershot->setNpmBinary(config('chrome.npm_path'));
        }

        $image = $browsershot->screenshot();

        $this->saveImage($slugTitle, $image);

        return response($image, 200, [
            'Content-Type' => 'image/png',
        ]);
    }

    private function getFilePath($slugTitle)
    {
        return 'public/og-images/'.$slugTitle.'.png';
    }

    private function hasImage($slugTitle)
    {
        return Storage::disk('local')->exists($this->getFilePath($slugTitle));
    }

    private function getImage($slugTitle)
    {
        return Storage::disk('local')->get($this->getFilePath($slugTitle));
    }

    private function saveImage($slugTitle, $image)
    {
        Storage::disk('local')->put($this->getFilePath($slugTitle), $image);
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

تگ های متا را به سایت خود اضافه کنید

برای استفاده از این تصویر هنگام ارسال در رسانه های اجتماعی، باید متا تگ های Open Graph را به سایت اضافه کنیم. این به پلت فرم رسانه های اجتماعی می گوید که از تصویری که ما تولید کرده ایم استفاده کند.

 property="og:title" content="Hello World">
 property="og:image" content="/og-image?title=Hello%20World">
 property="og:image:width" content="1200">
 property="og:image:height" content="630">
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در این مثال، عنوان پست را روی “Hello World” و تصویر را روی مسیری که قبلا ایجاد کردیم، قرار می دهیم.

نتیجه

در این مقاله، نحوه تولید خودکار تصاویر Open Graph با لاراول را بررسی کردیم. ما استفاده کردیم spatie/browsershot بسته برای تولید تصویر و ذخیره آن در حافظه محلی. این به ما این امکان را می دهد که یک بار تصویر را تولید کنیم و سپس بدون نیاز به تولید هر بار آن را به کاربر ارائه دهیم.

این قابلیت می‌تواند برای تولید تصاویر Open Graph برای پست‌های وبلاگ، پست‌های رسانه‌های اجتماعی و سایر محتوایی که نیاز به تصویر دارند مفید باشد.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا