routes.php
dosya aracılığıyla yönlendirmeleri bildirmek yerine, belirli bir adlandırma kuralını izleyen görünümler oluştururuz.sh
php artisan folio:install
resources/views/pages
.sh
composer require livewire/volt
sh
php artisan volt:install
app/Providers/VoltServiceProvider.php
yöntemde kullanılan dizideki iki öğeyi değiştirelim mount()
:VoltServiceProvider.php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Livewire\Volt\Volt;
class VoltServiceProvider extends ServiceProvider
{
public function boot(): void
{
Volt::mount([
- resource_path('views/livewire'),
- resource_path('views/pages'),
+ resource_path('views/pages'),
+ resource_path('views/livewire'),
]);
}
}
resources/views/welcome.blade.php
İlk sayfanızı oluşturmak için . içindeki route bildirimini de kaldırmanızı öneririm routes/web.php
. Laravel Folio sayesinde artık buna ihtiyacımız olmayacak.resources/views/pages
. İçinde .gitkeep
kaldırabileceğiniz bir tane var. index.blade.php
Biraz geçici metin oluşturun ve ekleyin.index.blade.php
<h1>Hello, world!</h1>
php artisan serve
yazan bir sayfa görürseniz , Folio kullanıma hazır demektir.Standart komuta benzer şekilde , tüm Folio'ya özgü rotaların listesini görüntülemek için route:listde çalıştırabilirsiniz .php artisan folio:list
resources/views/components/layouts/app.blade.php
ve şu kodu yapıştırın:app.blade.php
<html class="bg-gray-50 text-gray-600">
<title>{{ config('app.name') }}</title>
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = {
theme: {
container: {
center: true,
padding: '1rem',
},
}
}
</script>
<div class="container py-16">
{{ $slot }}
</div>
</html>
php artisan serve
yazan bir sayfa görürseniz , Folio kullanıma hazır demektir.Standart komuta benzer şekilde , tüm Folio'ya özgü rotaların listesini görüntülemek için route:listde çalıştırabilirsiniz .php artisan folio:list
resources/views/components/layouts/app.blade.php
ve şu kodu yapıştırın:Çevrimiçi mağazamızın ana bileşeni olan sepeti oluşturarak başlayalım. İçeride, eklenen ürünleri listeleyeceğiz ve kullanıcılara sayfayı yeniden yüklemelerine gerek kalmadan bunları kaldırma olanağı vereceğiz.
app.blade.php
<html class="bg-gray-50 text-gray-600">
<title>{{ config('app.name') }}</title>
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = {
theme: {
container: {
center: true,
padding: '1rem',
},
}
}
</script>
<div class="container py-16">
{{ $slot }}
</div>
</html>
php artisan serve
yazan bir sayfa görürseniz , Folio kullanıma hazır demektir.Standart komuta benzer şekilde , tüm Folio'ya özgü rotaların listesini görüntülemek için route:listde çalıştırabilirsiniz .php artisan folio:list
resources/views/components/layouts/app.blade.php
ve şu kodu yapıştırın:Çevrimiçi mağazamızın ana bileşeni olan sepeti oluşturarak başlayalım. İçeride, eklenen ürünleri listeleyeceğiz ve kullanıcılara sayfayı yeniden yüklemelerine gerek kalmadan bunları kaldırma olanağı vereceğiz.
app.blade.php
<html class="bg-gray-50 text-gray-600">
<title>{{ config('app.name') }}</title>
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = {
theme: {
container: {
center: true,
padding: '1rem',
},
}
}
</script>
<div class="container py-16">
{{ $slot }}
</div>
</html>
Çevrimiçi mağazamızın ana bileşeni olan sepeti oluşturarak başlayalım. İçeride, eklenen ürünleri listeleyeceğiz ve kullanıcılara sayfayı yeniden yüklemelerine gerek kalmadan bunları kaldırma olanağı vereceğiz.
sh
php artisan make:volt Cart
Bu komut resources/views/pages/cart.blade.php'de yeni bir bileşen oluşturacaktır . Livewire'ı kullanmanın geleneksel yolundan farklı olarak, ayrı bir PHP sınıfına ihtiyacımız yoktur, bu da süreci hızlandırır ve kod tabanını basitleştirir.
cart.blade.ph
<?php
use function Livewire\Volt\state;
state('count', fn () => cache()->get('count', 0));
$remove = function () {
if ($this->count > 0) {
cache()->put('count', --$this->count);
}
};
?>
<x-layouts.app>
@volt
<div>
<div>
<a href="/">
← Back
</a>
</div>
@if ($count)
<div class="grid gap-8 mt-8">
@foreach (range(1, cache()->get('count')) as $item)
<div class="flex items-center justify-between gap-4">
<div class="flex items-center gap-4">
<img src="https://via.placeholder.com/256x256.png/f3f4f6" width="128" height="128" />
<div>
<div>{{ fake()->sentence(2) }}</div>
<div class="font-bold text-2xl">${{ rand(10, 100) }}</div>
</div>
</div>
<button
class="bg-red-400 text-white rounded py-2 px-3 text-sm font-bold"
wire:click="remove"
>
Remove
</button>
</div>
@endforeach
</div>
@else
<p class="mt-16 font-light text-center text-3xl">
Your cart is empty.
</p>
@endif
</div>
@endvolt
</x-layouts.app>
Yukarıdaki kodu incelemek için bir dakikanızı ayırın. Dikkat edilmesi gereken birkaç şey şunlardır:
php artisan folio:list
.@volt
Bileşen , içindeki ayrı bir dosya yerine yönergenin içine sarılır resources/views/livewire
. Bu onu anonim bir bileşen yapar.fake()
yardımcı kullanılarak rastgele üretilir. Bu büyük bir zaman kazancıdır.remove()
. Volt'un yeni bildirimsel API'sinde, remove()
metodu bir değişkenin içindeki bir kapanış olarak tanımlarız.@php
Livewire kodu PHP etiketleri arasında tanımlanmıştır. Direktifi Volt ile ilgili herhangi bir şeyi kurmak için kullanamazsınız .$count
Yardımcıyı kullanmanın başlangıç durumunu tanımlarız state()
. Önbellekten değeri getiren bir kapatma içerir.remove()
, azaltmadan önce sayımın 0'dan büyük olduğundan emin oluruz. Daha sonra, yeni değeri önbelleğe kaydederiz.Bir sonraki adımımız bir Item
bileşen oluşturmaktır. Mağazamızda satın alınabilecek bireysel ürünleri temsil eder. Bu sefer, bileşeni oluşturmak için Volt yerine Livewire kullanacağız. Bunu resources/views/livewire
klasörün içinde istiyoruz.
sh
php artisan make:livewire Item
app/Livewire/Item.php
ve 'a gidin resources/views/livewire/item.blade.php
. Sonra, şu kodu ekleyin:item.blade.php
<?php
use function Livewire\Volt\state;
state('done', false);
$add = function () {
$this->dispatch('product-added-to-cart');
$this->done = true;
};
?>
<div>
<img src="https://via.placeholder.com/512x512.png/f3f4f6" alt="Product Image" />
<div class="flex items-start justify-between mt-4">
<div>
<div>{{ fake()->sentence(2) }}</div>
<div class="text-2xl font-bold">${{ rand(10, 100) }}</div>
</div>
<button
class="px-3 py-2 text-sm font-bold text-white bg-blue-600 rounded disabled:bg-gray-200 disabled:text-gray-400"
@if ($done) disabled @endif
wire:click="add"
>
@if ($done)
Added
@else
Add to Cart
@endif
</button>
</div>
</div>
Bu bileşende:
add()
$done
ayarlanır .true
add()
, bir ürünün eklendiğini belirten bir olay gönderir. Bu olayı bekleyen bileşen (sepet önizlemesi) önbellekteki değeri artıracaktır (bir sonraki adımda yapacağımız şey budur).Sepet önizleme bileşeni, kullanıcının alışveriş sepetinin mini bir gösterimi olacak ve kullanıcıların sepet sayfasına gitmeden kaç ürün eklediklerini hızlı bir şekilde görmelerine olanak tanıyacak.
Bunu nasıl yaratabileceğimizi anlatalım:
sh
php artisan make:livewire CartPreview
resources/views/pages/cart-preview.blade.php
:cart-preview.blade.php
<?php
use function Livewire\Volt\{on,state};
state('count', fn () => cache()->get('count', 0));
on(['product-added-to-cart' => function () {
cache()->put('count', ++$this->count);
}]);
?>
<a href="/cart">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="inline-block mr-1 w-6 h-6 translate-y-[-2px]"><path stroke-linecap="round" stroke-linejoin="round" d="M15.75 10.5V6a3.75 3.75 0 10-7.5 0v4.5m11.356-1.993l1.263 12c.07.665-.45 1.243-1.119 1.243H4.25a1.125 1.125 0 01-1.12-1.243l1.264-12A1.125 1.125 0 015.513 7.5h12.974c.576 0 1.059.435 1.119 1.007zM8.625 10.5a.375.375 0 11-.75 0 .375.375 0 01.75 0zm7.5 0a.375.375 0 11-.75 0 .375.375 0 01.75 0z" /></svg>
<span class="font-bold">
{{ $count }}
</span>
</a>
Bu bileşende:
count
) kullanarak takip ediyoruz. Başlangıç değeri, önbellekte bulunan değere eşittir.product-added-to-cart
Bir dinleyici , sayımın güncellenmesi için olayı bekler .count
.Ana sayfa yazmamız gereken en basit kod parçasıdır. Sadece daha önce yazdığımız bileşenleri düzenler. Aşağıdaki kodu ekleyin resources/views/pages/index.blade.php
:
index.blade.php
<x-layouts.app>
<div class="text-right">
<livewire:cart-preview />
</div>
<div class="grid grid-cols-3 gap-8 mt-8">
@foreach (range(1, 9) as $item)
<livewire:item />
@endforeach
</div>
</x-layouts.app>
range()
. Unutmayın, hepsi rastgele oluşturulmuştur.wire:navigate
Çevrimiçi mağazamız zaten oldukça etkileyici. Peki ya size onu minimum çabayla geliştirebileceğimizi söyleseydim? Livewire v3, adında yeni bir HTML niteliğiyle birlikte gelir wire:navigate
. Kullanıldığında, tüm sayfayı yeniden yüklemek yerine yalnızca yeni HTML'yi alır ve geçerli olanı değiştirir.
wire:navigate
Bağlantıdaki özniteliği sepete ekleyelim resources/views/livewire/cart-preview.blade.php
:
cart-preview.blade.php
-<a href="/cart">
+<a href="/cart" wire:navigate>
…
</a>
cart.blade.php
-<a href="/">
+<a href="/" wire:navigate>
← Back
</a>
Şimdi bunu tarayıcınızda test edin. Bu da işin en güzel yanı, değil mi?
Kullanıcı dostu bir çevrimiçi mağaza oluşturmak için bu üç güçlü paketi nasıl entegre edeceğinizi inceledik. Artık JavaScript'te uzman olmasanız bile, modern SPA benzeri web uygulamalarını hızla oluşturmak için gereken temel bilgiye sahipsiniz.
Bu kod üzerinde daha fazla zaman harcamak istiyorsanız, geliştirebileceğiniz birkaç alan şunlardır: