<p>Ve modeli kurun:</p>
<div class="highlight js-code-highlight">
<pre class="highlight php">
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Note extends Model
{
protected $fillable = ['title', 'body'];
}
<p>Özel bir şey yok. İşte güzelliği burada. Bu sadece Laravel.</p>
<h2>
<a name="step-5-build-the-ui-with-livewire" href="#step-5-build-the-ui-with-livewire"></a>
Adım 5: Livewire ile Arayüzü Oluşturun
</h2>
<p>İki Livewire bileşeni oluşturalım: biri notlar listesi için diğeri ise not oluşturma/düzenleme için.</p>
<div class="highlight js-code-highlight">
<pre class="highlight shell">
php artisan make:livewire NotesList
php artisan make:livewire NoteEditor
<h3>
<a name="the-notes-list-component" href="#the-notes-list-component"></a>
Notlar Listesi Bileşeni
</h3>
<p>Burada NativePHP ilginçleşiyor. Gerçek yerel işlevsellikleri PHP'den tetiklemek için Diyalog ve Paylaşım fasadlarını kullanacağız.</p>
<p>NativePHP'nin Diyalog eklentisi etkinlik tabanlı bir pattern kullanır. <code>Dialog::alert()</code> çağrısı ile bir yerel diyalog gösterirsiniz, ona bir <code>.id()</code> verirsiniz, böylece daha sonra onu tanımlayabilir, ardından Livewire bileşeninizde <code>#[OnNative]</code> özelliğini kullanarak <code>ButtonPressed</code> olayını dinleyebilirsiniz. Paylaşım eklentisi daha basit: <code>Share::file()</code> çağrısıyla bir başlık, mesaj ve isteğe bağlı bir dosya yolunu açarak yerel paylaşım sayfasını açarsınız.</p>
<p>İşte hepsi nasıl bir araya geliyor:</p>
<div class="highlight js-code-highlight">
<pre class="highlight php">
<?php
namespace App\Livewire;
use App\Models\Note;
use Livewire\Component;
use Native\Mobile\Facades\Dialog;
use Native\Mobile\Facades\Share;
use Native\Mobile\Attributes\OnNative;
use Native\Mobile\Events\Alert\ButtonPressed;
class NotesList extends Component
{
public function confirmDelete(int $noteId): void
{
Dialog::alert(
'Delete Note',
'Are you sure you want to delete this note?',
['Cancel', 'Delete']
)
->id("delete-note-{$noteId}")
->show();
}
#[OnNative(ButtonPressed::class)]
public function handleDialogButton($index, $label, $id = null): void
{
if ($label === 'Delete' && str_starts_with($id ?? '', 'delete-note-')) {
$noteId = (int) str_replace('delete-note-', '', $id);
Note::destroy($noteId);
}
}
public function shareNote(int $noteId): void
{
$note = Note::findOrFail($noteId);
Share::file(
$note->title,
$note->body,
''
);
}
public function render()
{
return view('livewire.notes-list', [
'notes' => Note::latest()->get(),
]);
}
}
<p>Bakın o <code>confirmDelete</code> metoduna. <code>Dialog::alert()</code>, gerçek yerel OS diyalogunu tetikler (bu bir JavaScript <code>confirm()</code> değil). <code>.id()</code> metodu, diyalogu etiketleyerek kullanıcı bir butona dokunduğunda <code>ButtonPressed</code> olayının o ID’yi Livewire bileşeninize taşımasını sağlar. Buton etiketine ve ID’ye göre hangi notun silineceğini belirlemek adına eşleşme yaparsınız.</p>
<p>Ve <code>Share::file()</code>, yerel paylaşım sayfasını açarak kullanıcıların notları WhatsApp, e-posta veya yüklenmiş herhangi bir uygulama ile göndermesini sağlar. Üçüncü argüman olarak boş bir dize geçirildiğinde, bu metin dosyası eklemeden paylaşım yapılmasını sağlar. Bu, PHP ile yazılmış gerçek yerel işlevsellik.</p>
<h3>
<a name="the-notes-list-blade-template" href="#the-notes-list-blade-template"></a>
Notlar Listesi Blade Şablonu
</h3>
<div class="highlight js-code-highlight">
<pre class="highlight html">
@forelse ($notes as $note)
@empty
No notes yet
Tap + to create your first note
@endforelse
<h3>
<a name="the-note-editor-component" href="#the-note-editor-component"></a>
Not Düzenleyici Bileşeni
</h3>
<div class="highlight js-code-highlight">
<pre class="highlight php">
<?php
namespace App\Livewire;
use App\Models\Note;
use Livewire\Component;
class NoteEditor extends Component
{
public ?Note $note = null;
public string $title = '';
public string $body = '';
public function mount(?int $id = null): void
{
if ($id) {
$this->note = Note::findOrFail($id);
$this->title = $this->note->title;
$this->body = $this->note->body;
}
}
public function save(): void
{
$validated = $this->validate([
'title' => 'required|max:255',
'body' => 'required',
]);
if ($this->note) {
$this->note->update($validated);
} else {
Note::create($validated);
}
$this->redirect("https://dev.to/");
}
public function render()
{
return view('livewire.note-editor');
}
}
<div class="highlight js-code-highlight">
<pre class="highlight html">
<h3>
<a name="set-up-the-routes" href="#set-up-the-routes"></a>
Rotaları Ayarlama
</h3>
<div class="highlight js-code-highlight">
<pre class="highlight php">
// routes/web.php
use App\Livewire\NotesList;
use App\Livewire\NoteEditor;
Route::get("/", NotesList::class);
Route::get('/notes/create', NoteEditor::class);
Route::get('/notes/{id}/edit', NoteEditor::class);
<p>Standart Laravel yönlendirmesi. Burada özel bir şey yok.</p>
<h2>
<a name="step-6-configure-vite-for-nativephp" href="#step-6-configure-vite-for-nativephp"></a>
Adım 6: NativePHP için Vite’i Yapılandırma
</h2>
<p>Bir şeyi netleştirelim. Vite’deki NativePHP eklentisini eklemeniz gerekiyor, böylece varlıklarınız mobil için doğru bir şekilde derlenir:</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript">
// vite.config.js
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
import tailwindcss from '@tailwindcss/vite';
import { nativephpMobile, nativephpHotFile } from './vendor/nativephp/mobile/resources/js/vite-plugin.js';
export default defineConfig({
plugins: [
laravel({
input: [
'resources/css/app.css',
'resources/js/app.js',
],
refresh: true,
hotFile: nativephpHotFile(),
}),
tailwindcss(),
nativephpMobile(),
],
});
<p>Sonrasında uygulamayı çalıştırmadan önce varlıklarınızı derleyin:</p>
<div class="highlight js-code-highlight">
<pre class="highlight shell">
npm install
npm run build
<p>Geliştirme sırasında sıcak yeniden yükleme istiyorsanız (simülatörde muhteşemdir), <code>npm run dev</code> komutunu ayrı bir terminalde çalıştırabilirsiniz. Sadece telefonunuzun geliştirme makinenizle aynı Wi-Fi’da olduğuna emin olun.</p>
<h2>
<a name="step-7-test-with-jump" href="#step-7-test-with-jump"></a>
Adım 7: Jump ile Test Etme
</h2>
<p>Bu eğlenceli kısım. Jump, uygulamanızı gerçek bir telefon üzerinde Xcode veya Android Studio’ya dokunmadan çalıştırmanızı sağlar.</p>
<div class="highlight js-code-highlight">
<pre class="highlight shell">
php artisan native:jump
<p>Bu, yerel bir geliştirme sunucusu başlatır ve terminalinizde bir QR kodu gösterir. Telefonunuzdaki Jump uygulamasını açın, kodu tarayın ve Laravel uygulamanız doğrudan cihazınıza yüklenir.</p>
<p>Hepsi bu kadar. Notlar uygulamanız telefonunuzda yerel olarak çalışıyor.</p>
<p>Not oluşturabilir, düzenleyebilir, silebilir (yerel onay diyalogları ile), ve yerel paylaşım sayfasını kullanarak paylaşım yapabilirsiniz. SQLite veritabanı cihazda yaşıyor. Çevrimdışı çalışır ve hiçbir Swift veya Kotlin satırı yazmadınız.</p>
<p>Bir bonus: Jump, tüm birinci taraf NativePHP eklentilerini (premium olanlar da dahil) içeriyor, böylece gelişim sırasında Biyometrik, Coğrafi Konum ve diğer ücretli özelliklerle deneme yapma imkanınız var.</p>
<h2>
<a name="step-8-going-beyond-jump-production-builds" href="#step-8-going-beyond-jump-production-builds"></a>
Adım 8: Jump’ı Geçmek (Üretim Geliştirmeleri)
</h2>
<p>Jump, geliştirme ve test için mükemmel. Ancak uygulamanızı App Store veya Google Play'e göndermeye hazır olduğunuzda, gerçek yapıların derlenmesi gerekecek.</p>
<p>iOS için bir Mac'e ihtiyacınız var:</p>
<div class="highlight js-code-highlight">
<pre class="highlight shell">
php artisan native:run ios
<p>Android için:</p>
<div class="highlight js-code-highlight">
<pre class="highlight shell">
php artisan native:run android
<p>NativePHP derlemeyi yönetir. Doğrudan Xcode veya Android Studio'yu açmanıza gerek yok (ama isterseniz açabilirsiniz). Çerçeve, PHP'yi, Laravel kodunuzu ve tüm yerel eklentileri düzgün bir uygulamaya paketleme işini üstlenir.</p>
<p>Mağazalara dağıtım yapmak için NativePHP, imzalanma, paketleme ve hatta yüklemeyi yöneten <code>native:package</code> komutunu sağlar. Süreç, sertifikalar ve dağıtım profilleri ile karmaşıklaşabilir, ancak <a href="https://nativephp.com/docs/mobile/3/getting-started/deployment" target="_blank" rel="noopener noreferrer">resmi dağıtım belgeleri</a> her şeyi aşama aşama gösterir.</p>
<p>Tüm dağıtım sıkıntısını atlamak istiyorsanız, NativePHP ekibi <a href="https://bifrost.nativephp.com/" target="_blank" rel="noopener noreferrer">Bifrost</a> adında, derleme ve dağıtımı yöneten bir ücretli hizmet sunmaktadır. Bir kez ayarlayın ve sertifika yönetimini kendiniz yapmadan güncellemeleri gönderin. Gereklidir değil, ama bilinmesi gerekli.</p>
<h2>
<a name="where-does-nativephp-fit-an-honest-take" href="#where-does-nativephp-fit-an-honest-take"></a>
NativePHP Nerede İşe Yarar? Dürüst Bir Değerlendirme
</h2>
<p>NativePHP v3'ün nerede parladığını ve nerede parlamadığını netleştireyim:</p>
<p><strong>İyi olduğu alanlar:</strong></p>
<ul>
<li>Ekibin kullandığı iç araçlar ve yönetim uygulamaları</li>
<li>Hızla bir fikir doğrulamak için MVP’ler</li>
<li>Mevcut Laravel web projeleri için yan uygulamalar</li>
<li>CRUD ağırlıklı uygulamalar (notlar, görev yöneticileri, envanter takipçileri)</li>
<li>Bir Laravel API’si ile senkronize olan çevrimdışı uygulamalar</li>
</ul>
<p><strong>En iyi seçim değil:</strong></p>
<ul>
<li>Oyunlar veya karmaşık animasyonlar gerektiren uygulamalar</li>
<li>Her yerinde piksel mükemmel yerel UI kontrolüne ihtiyaç duyan uygulamalar</li>
<li>Ağır medya veya gerçek zamanlı veri işleyen performans kritik uygulamalar</li>
<li>Platforma özgü tasarım desenlerinin (Material Design, Human Interface Guidelines) zorunlu olduğu uygulamalar</li>
</ul>
<p>Bu şekilde düşünün. Eğer siz bir Laravel ekibisiniz ve bir müşteri mobil uygulama isterse, NativePHP demektir ki, bunu mobil geliştiriciler kiralamadan veya React Native öğrenmeden de yapabilirsiniz. MVP’ler ve iç araçlar için bu çok önemli. Spotify veya Instagram ile rekabet eden bir tüketici uygulaması istiyorsanız, yine özel bir yerel veya çapraz platform ekibine sahip olmanız gerekecektir.</p>
<p>Artık ücretsiz olması, denemeyi mantıklı hale getiriyor. V3 öncesinde, deneme ile lisans maliyetini hesaba katmanız gerekiyordu. Şimdi bir öğleyin bir şey hazırlayabilir ve gerçekten kullanmak isteyip istemediğinize karar verebilirsiniz.</p>
<p>Eğer <a href="https://hafiz.dev/blog/how-to-make-your-laravel-app-ai-agent-friendly-the-complete-2026-guide" target="_blank" rel="noopener noreferrer">AI ajan dostu Laravel uygulamaları</a> inşa ediyor veya <a href="https://hafiz.dev/blog/the-complete-laravel-claude-code-ecosystem-every-tool-plugin-and-config-you-actually-need" target="_blank" rel="noopener noreferrer">Laravel + Claude Code ekosisteminde</a> çalışıyorsanız, NativePHP işiniz için yeni bir dağıtım kanalı açıyor. Kullanıcının telefonunda tamamen çalışan bir AI destekli araç oluşturmanızı hayal edin; bu artık mümkün.</p>
<h2>
<a name="frequently-asked-questions" href="#frequently-asked-questions"></a>
Sıkça Sorulan Sorular
</h2>
<h3>
<a name="do-i-need-a-mac-to-build-ios-apps-with-nativephp" href="#do-i-need-a-mac-to-build-ios-apps-with-nativephp"></a>
NativePHP ile iOS uygulamaları oluşturmak için bir Mac'e ihtiyacım var mı?
</h3>
<p>Evet, üretim iOS yapıları için bir Mac'e ve Xcode'a ihtiyacınız var. Bu Apple'ın kısıtlaması, NativePHP'nin bir gereksinimi değil. Ancak, Jump ile herhangi bir işletim sisteminde geliştirme yapabilir ve test edebilirsiniz; bu, günlük çalışma akışınızın çoğunu kapsar. Sadece App Store'a göndermeye hazır olduğunuzda Mac'e ihtiyacınız olacak.</p>
<h3>
<a name="can-i-use-my-existing-laravel-app-or-do-i-need-to-start-from-scratch" href="#can-i-use-my-existing-laravel-app-or-do-i-need-to-start-from-scratch"></a>
Mevcut Laravel uygulamamı kullanabilir miyim, yoksa sıfırdan mı başlamam gerek?
</h3>
<p>Mevcut bir Laravel uygulamasına NativePHP ekleyebilirsiniz. Projeyi kurmak için <code>composer require nativephp/mobile</code> ve <code>php artisan native:install</code> komutlarını çalıştırmanız yeterli. Ancak, NativePHP, cihaz üzerinde SQLite kullanır, bu yüzden uygulamanızın SQLite ile çalışması gerekir. Eğer göçlerinizde MySQL'e özel özellikler kullanıyorsanız, bunları ayarlamanız gerekecektir.</p>
<h3>
<a name="how-does-nativephp-compare-to-react-native-or-flutter" href="#how-does-nativephp-compare-to-react-native-or-flutter"></a>
NativePHP, React Native veya Flutter ile nasıl karşılaştırılır?
</h3>
<p>NativePHP, mevcut PHP ve Laravel becerilerinizi kullanmanızı sağlar. React Native, JavaScript/TypeScript bilgisi gerektirirken, Flutter Dart gerektirir. Bir Laravel ekibi için, NativePHP demektir ki yeni bir dil öğrenmeye gerek kalmaz. Ancak React Native ve Flutter daha büyük ekosistemlere, daha fazla UI bileşenine ve karmaşık yerel UI'lar için daha iyi destek sunar. Ekibinizin becerilerine ve uygulamanızın karmaşıklığına göre seçim yapın.</p>
<h3>
<a name="is-nativephp-v3-productionready" href="#is-nativephp-v3-productionready"></a>
NativePHP v3 üretime hazır mı?
</h3>
<p>NativePHP ile yapılan uygulamalar, App Store ve Google Play'de zaten yayındadır. Çerçeve, düzenli sürümlerle aktif olarak bakımda. CRUD uygulamaları, iç araçlar ve MVP'ler için sağlam bir seçim. Karmaşık tüketici uygulamaları için, taahhütte bulunmadan önce mevcut eklentilerin ihtiyaçlarınızı karşıladığından emin olun.</p>
<h3>
<a name="what-about-app-size-how-big-are-nativephp-apps" href="#what-about-app-size-how-big-are-nativephp-apps"></a>
Uygulama boyutu ne olacak? NativePHP uygulamaları ne kadar büyük?
</h3>
<p>NativePHP uygulamaları, paketlenmiş bir PHP çalışma zamanı içerdiğinden, minimal yerel uygulamalardan daha büyük olacaktır. Kullanılan eklentilere ve varlıklara bağlı olarak yaklaşık 15-30 MB bekleyin. V3 eklenti sistemi bunun için yardımcı olur, çünkü yalnızca gerçekte kullandığınız şeyleri içeren daha küçük bir ayak izi sağlar.</p>
<h2>
<a name="wrapping-up" href="#wrapping-up"></a>
Sonuç Olarak
</h2>
<p>NativePHP v3, Laravel geliştiricileri için denklemi değiştiriyor. Mobil geliştirme, artık tamamen yeni bir yığın öğrenmek anlamına gelmiyor. Artık sadece bir Composer paketi eklemek ve yıllardır yazdığınız aynı PHP'yi yazmak demek.</p>
<p>Burada inşa ettiğimiz Hızlı Notlar uygulaması bilerek basitleştirildi. Ancak aynı kalıplar (Eloquent modeller, Livewire bileşenleri, yerel eklentiler), çok daha karmaşık uygulamalara ölçeklenebilir. Kullanıcıların fotoğraf eklemesini sağlamak için Kamera eklentisi ekleyin. Notları uzaktan bir API ile senkronize etmek için Ağ eklentisini ekleyin. Hassas notları Face ID arkasında kilitlemek için Biyometrik eklentisini ekleyin.</p>
<p>Bu tür şeyler inşa etmeyi zaten biliyorsunuz. NativePHP sadece yeni bir yer sağlıyor.</p>
<p>Derinlere inmeye hazır olduğunuzda, <a href="https://nativephp.com/docs/mobile/3/getting-started/introduction" target="_blank" rel="noopener noreferrer">NativePHP belgeleri</a> mükemmel ve temel konuları kapsayan ücretsiz bir <a href="https://laracasts.com/series/build-native-apps-with-php" target="_blank" rel="noopener noreferrer">Laracasts kursu</a> bulunmaktadır. Ve eğer kurucu iseniz hızlı bir MVP mobil uygulaması göndermek için yardımcı olabilirim.</p>
Kaynak: Orijinal Makale