Laravel: Автоматски сосема нови работни простори за клиенти со визуелни средства извлечени со ВИ
Започнување со извлекување на Brand Kit
Во брзиот свет на веб-развојот и дигиталното брендирање, ефикасното воведување нови клиенти е од клучно значење. Замислете сценарио во кое, веднаш по потпишувањето со нов клиент, можете инстантно да го пополните неговиот нов работен простор со неговиот воспоставен идентитет на брендот – лого, примарни бои и фонтови. Ова не е далечна иднина; остварливо е денес со помош на услуги напојувани со ВИ и робусна рамка како Laravel. Овој туторијал ќе ве води низ интеграцијата на моќен Brand Kit Extractor API во вашата Laravel апликација за автоматизирање на овој клучен чекор, заштедувајќи драгоцено време и обезбедувајќи конзистентност на брендот уште од првиот ден.
Пристап до Brand Kit Extractor API
Пред да навлеземе во кодот, да ве поставиме со Brand Kit Extractor API. Оваа услуга анализира даден URL на веб-страница и детерминистички извлекува средства на брендот како логоа, палети на бои и семејства на фонтови.
За почеток, ќе ви треба сметка.
Регистрирајте се или најавете се на дадениот портал. Откако ќе се најавите, одете во делот за API услуги и пронајдете го Brand Kit Extractor. Ќе имате неколку опции за план: Free, Plus и Pro. Изберете го оној што најдобро одговара на вашите потреби и завршете го процесот на активирање.
Откако ќе го активирате избраниот план, преминете на официјалната документација:
Документација за Brand Kit Extractor. Во документацијата, пронајдете го панелот „Service token“. Тука ќе го најдете вашиот единствен токен ограничен на услугата. Од клучно значење е да разберете дека повторното генерирање на овој токен ќе ги поништи сите претходно издадени токени. Затоа, постапувајте внимателно со него и чувајте го безбедно.
За оваа интеграција, ќе го складираме овој токен во конфигурацијата на околината на нашата Laravel апликација. API поддржува автентикација преку Bearer токен, заглавие X-API-Token или параметар за токен во барањето. За оваа имплементација ќе се одлучиме за заглавието X-API-Token.
Разбирање на API договорот
Brand Kit Extractor API работи со едноставен, но ефективен договор. Основната функционалност е изложена преку барање POST до следната крајна точка:
https://ai.mihajlo.mk/api/brand-kit-extractor/v1/extract-brand-kit
Телото на барањето мора да биде JSON објект што содржи единствен клуч, url, кој е јавниот URL на веб-страницата што сакате да ја анализирате. На пример:
{
"url": "https://example.com"
}
Одговорот на API е исто така JSON објект што содржи големо количество информации за брендот, вклучувајќи:
brand_name: Идентификуваното име на брендот.logos: Листа на извлечени URL-адреси на логоа.colors: Низа од доминантни хексадецимални кодови за бои.fonts: Низа од идентификувани семејства на фонтови.imagery: URL-адреси на истакнати слики пронајдени на страницата.social_profiles: Откриени врски до профили на социјалните мрежи.css_variables: CSS променливи поврзани со стилизирањето на брендот.
Од суштинско значење е да се потврди секое од овие полиња при приемот на одговорот за да се обезбеди интегритет на податоците пред нивното складирање во вашата апликација.
Архитектура на Laravel интеграцијата
За оваа Laravel интеграција, ќе усвоиме чиста архитектура што ги раздвојува одговорностите и ја поттикнува тестирабилноста. Основните компоненти ќе вклучуваат:
- Конфигурација на околината: Безбедно складирање на API ингеренциите.
- Сервисна класа: Капсулирање на логиката за интеракција со API. Оваа класа ќе се справува со испраќањето HTTP барање, поставувањето заглавија и управувањето со истекувањата на времето.
- Контролер/Job: Оркестрирање на процесот. За овој туторијал, ќе користиме наменска Artisan команда за активирање на извлекувањето, правејќи ја лесно извршлива по потреба или преку закажана задача.
- Мапирање на податоци: Трансформирање на суровиот JSON одговор на API во структуриран доменски објект со кој вашата апликација може лесно да работи.
- Автоматизирани тестови: Обезбедување дека интеграцијата работи како што се очекува, дури и кога надворешниот API не е достапен или враќа неочекувани податоци.
Ќе го искористиме вградениот HTTP клиент на Laravel за испраќање надворешни барања, што го поедноставува управувањето со барањата и обработката на одговорите. За тестирање, Http::fake() ќе биде непроценлив.
Поставување на проектот и конфигурација на околината
Прво, осигурете се дека имате поставен Laravel проект. Ако немате, можете да креирате еден со Composer:
composer create-project laravel/laravel ai-brand-extractor
cd ai-brand-extractor
Потоа, треба да го складираме нашиот API токен. Отворете ја датотеката .env и додајте ја следната линија:
BRAND_KIT_API_TOKEN=YOUR_SERVICE_TOKEN_HERE
Заменете го YOUR_SERVICE_TOKEN_HERE со вистинскиот токен што сте го копирале од документацијата. Добра практика е и да се дефинира основниот URL на API:
BRAND_KIT_API_URL=https://ai.mihajlo.mk/api/brand-kit-extractor/v1
По ажурирањето на вашата датотека .env, исчистете го кешот на конфигурацијата за да се осигурате дека новите променливи се вчитани:
php artisan config:clear
Креирање на сервисната класа
Ајде да креираме наменска сервисна класа за справување со комуникацијата со Brand Kit Extractor API. Ова промовира повторна употребливост и ги одржува нашите контролери или команди почисти.
Креирајте нова датотека во app/Services/BrandKitExtractorService.php:
namespace App\Services;
use Illuminate\Support\Facades\Http;
use Illuminate\Http\Client\RequestException;
use Illuminate\Support\Facades\Log;
class BrandKitExtractorService
{
protected string $apiUrl;
protected string $apiKey;
public function __construct()
{
$this->apiUrl = config('services.brand_kit.url');
$this->apiKey = config('services.brand_kit.token');
}
/**
* Extracts brand kit information from a given URL.
*
* @param string $websiteUrl The URL of the website to analyze.
* @return array|null The extracted brand kit data or null on failure.
*/
public function extract(string $websiteUrl): ?array
{
try {
$response = Http::withHeaders([
'X-API-Token' => $this->apiKey,
'Accept' => 'application/json',
])->timeout(30)->post("{$this->apiUrl}/extract-brand-kit", [
'url' => $websiteUrl,
]);
// Basic check for HTTP errors
$response->throw();
$data = $response->json();
// Validate essential fields before returning
if ($this->isValidBrandKitResponse($data)) {
return $data;
} else {
Log::warning('Brand Kit API returned invalid data structure.', ['response' => $data]);
return null;
}
} catch (RequestException $e) {
Log::error('Brand Kit API request failed.', [
'url' => $websiteUrl,
'error_message' => $e->getMessage(),
'response_status' => $e->response()->status() ?? 'N/A',
'response_body' => $e->response()->json() ?? $e->response()->body() ?? 'N/A',
]);
return null;
} catch (\Throwable $e) {
Log::error('An unexpected error occurred during Brand Kit extraction.', [
'url' => $websiteUrl,
'error_message' => $e->getMessage(),
]);
return null;
}
}
/**
* Basic validation of the Brand Kit API response structure.
*
* @param array $data The API response data.
* @return bool True if the response structure is considered valid.
*/
protected function isValidBrandKitResponse(array $data): bool
{
// This is a simplified validation. In a production app, you might want more robust checks.
return isset($data['brand_name']) &&
isset($data['logos']) && is_array($data['logos']) &&
isset($data['colors']) && is_array($data['colors']) &&
isset($data['fonts']) && is_array($data['fonts']);
}
}
Исто така треба да ја конфигурираме услугата во config/services.php. Додајте го следното во низата:
'brand_kit' => [
'url' => env('BRAND_KIT_API_URL'),
'token' => env('BRAND_KIT_API_TOKEN'),
],
Не заборавајте повторно да го исчистите кешот на конфигурацијата ако сè уште не сте го направиле тоа:
php artisan config:clear
Креирање Artisan команда
За да го активираме извлекувањето на brand kit, ќе креираме Artisan команда. Оваа команда ќе прифати URL на веб-страницата на клиентот како аргумент, а потоа ќе ја користи нашата услуга за преземање и обработка на податоците за брендот.
Генерирајте ја командата:
php artisan make:command ExtractClientBrandKit
Сега, отворете app/Console/Commands/ExtractClientBrandKit.php и имплементирајте ја следната логика:
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Services\BrandKitExtractorService;
use App\Models\Client; // Assuming you have a Client model
use Illuminate\Support\Str;
class ExtractClientBrandKit extends Command
{
protected $signature = 'client:extract-brand-kit {websiteUrl}';
protected $description = 'Extracts brand kit information for a given website URL and creates/updates a client.';
protected BrandKitExtractorService $brandKitService;
public function __construct(BrandKitExtractorService $brandKitService)
{
parent::__construct();
$this->brandKitService = $brandKitService;
}
public function handle()
{
$websiteUrl = $this->argument('websiteUrl');
if (!filter_var($websiteUrl, FILTER_VALIDATE_URL)) {
$this->error('Invalid website URL provided.');
return Command::FAILURE;
}
$this->info("Attempting to extract brand kit for: {$websiteUrl}");
$brandData = $this->brandKitService->extract($websiteUrl);
if ($brandData) {
$this->info('Brand kit extracted successfully!');
$this->displayBrandData($brandData);
// --- Integration with your application's client model ---
// This is a simplified example. In a real application, you'd likely
// fetch an existing client or create a new one based on context.
$client = $this->findOrCreateClient($websiteUrl, $brandData);
if ($client) {
$this->updateClientWorkspace($client, $brandData);
$this->info("Client workspace updated/created for {$client->name}.");
return Command::SUCCESS;
} else {
$this->error('Failed to find or create client record.');
return Command::FAILURE;
}
// --- End of integration example ---
} else {
$this->error('Failed to extract brand kit data.');
return Command::FAILURE;
}
}
/**
* Displays the extracted brand data in a readable format.
*
* @param array $brandData The extracted brand data.
*/
protected function displayBrandData(array $brandData): void
{
$this->comment("Brand Name: " . ($brandData['brand_name'] ?? 'N/A'));
$this->comment("Logos: " . implode(', ', $brandData['logos'] ?? ['N/A']));
$this->comment("Colors: " . implode(', ', $brandData['colors'] ?? ['N/A']));
$this->comment("Fonts: " . implode(', ', $brandData['fonts'] ?? ['N/A']));
// You can display other fields like imagery and social_profiles as needed.
}
/**
* Placeholder for finding or creating a client record.
* In a real app, this would interact with your database.
*
* @param string $websiteUrl
* @param array $brandData
* @return \App\Models\Client|null
*/
protected function findOrCreateClient(string $websiteUrl, array $brandData): ?Client
{
// Replace with your actual client creation/finding logic
// For demonstration, let's assume a Client model with 'name', 'website_url', 'logo_url', 'primary_color', 'font_family' fields.
$clientName = $brandData['brand_name'] ?? 'Untitled Client - ' . Str::random(4);
$logoUrl = $brandData['logos'][0] ?? null;
$primaryColor = $brandData['colors'][0] ?? null;
$fontFamily = $brandData['fonts'][0] ?? null;
// Example: Find existing client or create a new one
$client = Client::updateOrCreate(
['website_url' => $websiteUrl],
[
'name' => $clientName,
'logo_url' => $logoUrl,
'primary_color' => $primaryColor,
'font_family' => $fontFamily,
// Other fields as needed
]
);
return $client;
}
/**
* Placeholder for updating the client's workspace with extracted assets.
* This would involve updating UI elements, storing assets, etc.
*
* @param Client $client
* @param array $brandData
*/
protected function updateClientWorkspace(Client $client, array $brandData): void
{
// In a real application, you might:
// 1. Download and store the logo file.
// 2. Update the client's profile settings in your database.
// 3. Trigger other frontend or backend processes that rely on these brand assets.
// Example: Log an action indicating workspace update
$this->info("Simulating workspace update for client: {$client->name}");
// For instance, if you have a dedicated 'BrandSettings' model or similar.
// $client->brandSettings()->updateOrCreate(
// [],
// [
// 'primary_color' => $brandData['colors'][0] ?? null,
// 'font_family' => $brandData['fonts'][0] ?? null,
// // ...
// ]
// );
}
}
Забелешка: Моделот Client и неговата поврзана табела во базата на податоци се претпоставени. Ќе треба да ги креирате ако не постојат во вашиот проект. На пример, со користење на Eloquent:
php artisan make:model Client -m
Потоа, дефинирајте ги колоните во генерираната миграциска датотека (на пр., database/migrations/xxxx_xx_xx_xxxxxx_create_clients_table.php):
Schema::create('clients', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('website_url')->unique();
$table->string('logo_url')->nullable();
$table->string('primary_color')->nullable();
$table->string('font_family')->nullable();
$table->timestamps();
});
И извршете ја миграцијата:
php artisan migrate