Laravel + Vue Projesinde Neden gRPC?
<p>Modern bir Laravel + Vue uygulaması geliştiriyorsanız, genellikle varsayılan sezginiz REST/JSON kullanmaktır.</p>
<p>gRPC farklıdır: API'nizi bir <strong>sözleşme</strong> olarak bir <code>.proto</code> dosyasında tanımlarsınız ve ardından güçlü bir şekilde tür belirlenmiş istemci/sunucu kodu (stub) üretirsiniz. <strong>HTTP/2</strong> üzerinden çalışır ve kompakt serileştirme için <strong>Protocol Buffers</strong> kullanır.</p>
<p>Ancak tarayıcı uygulamaları için bir dezavantaj vardır: Tarayıcıdaki bir Vue uygulaması doğrudan "gRPC konuşamaz", ekstra bir altyapıya ihtiyaç duyar (gRPC-Web + Envoy gibi bir proxy). Pratik bir desen şöyle olmalıdır:</p>
<p>✅ <strong>Vue (tarayıcı) -> Laravel (HTTP/JSON) -> gRPC mikroservisi (iç)</strong></p>
<p>Bu Laravel katmanı, <strong>BFF (Backend For Frontend)</strong> olmalıdır.</p>
<p>Bu repo, tam olarak bunu göstermektedir.</p>
<hr/>
<h2>
<a name="architecture-what-we-built" href="#architecture-what-we-built">
</a>
Mimari (neler inşa edildi)
</h2>
<p><strong>Hedef:</strong> Bir Vue sayfasında bir kullanıcıyı görüntülemek, ancak bunu Laravel üzerinden almak ve Laravel'in bir gRPC sunucusunu çağırmasını sağlamak.</p>
<p>Akış:</p>
<ol>
<li>
<strong>Vue sayfası</strong> (<code>UserShow.vue</code>), <code>GET /api/users/{id}</code> çağrısı yapar
</li>
<li>
<strong>Laravel API yolu</strong> <code>App\Services\UserGrpc</code> çağrısı yapar
</li>
<li>
<code>UserGrpc</code>, <strong>üretici gRPC istemcisini</strong> kullanarak <code>UserService.GetUser</code> çağrısında bulunur
</li>
<li>Bir <strong>Node gRPC sunucusu</strong> kullanıcı verilerini döner (demo amaçlı, Laravel'in kullandığı aynı SQLite veritabanını okumak için)</li>
</ol>
<p>Klasör yapısı vurguları:</p>
<ul>
<li>
<code>proto/user/v1/user.proto</code> → sözleşme</li>
<li>
<code>generated/App/Grpc/...</code> → üretilen PHP stub'ları (istemci sınıfları)</li>
<li>
<code>grpc-server/</code> → demo gRPC sunucusu (Node)</li>
<li>
<code>app/Services/UserGrpc.php</code> → Laravel gRPC istemci sarmalayıcı</li>
<li>
<code>resources/js/Pages/UserShow.vue</code> → Vue/Inertia sayfası</li>
</ul>
<hr/>
<h2>
<a name="step-1-scaffold-laravel-vue-inertia" href="#step-1-scaffold-laravel-vue-inertia">
</a>
Adım 1 — Laravel + Vue (Inertia) Oluşturma
</h2>
<p>Yeni bir proje için, Laravel’in Vue başlangıç kiti (Inertia) harika bir temel sunar.</p>
<hr/>
<h2>
<a name="step-2-define-the-grpc-contract-raw-proto-endraw-" href="#step-2-define-the-grpc-contract-raw-proto-endraw-">
</a>
Adım 2 — gRPC sözleşmesini tanımla (<code>.proto</code>)
</h2>
<p>Şunu oluşturun:</p>
<p><code>proto/user/v1/user.proto</code></p>
<p>Örnek sözleşme:<br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight protobuf"><code><span class="na">syntax</span> <span class="o">=</span> <span class="s">"proto3"</span><span class="p">;</span>package user.v1;
service UserService {
rpc GetUser (GetUserRequest) returns (GetUserResponse);
}
message GetUserRequest {
string id = 1;
}
message GetUserResponse {
string id = 1;
string name = 2;
}
<p>Bu <code>.proto</code> dosyası, tek gerçek bilgi kaynağıdır.</p>
<hr/>
<h2>
<a name="step-3-generate-php-grpc-client-code" href="#step-3-generate-php-grpc-client-code">
</a>
Adım 3 — PHP gRPC istemci kodunu oluştur
</h2>
<p>Her şey hazır olduğunda, <code>.proto</code> dosyasından PHP için istemci sınıfları üretirsiniz.</p>
<h3>
<a name="using-buf-for-generation" href="#using-buf-for-generation">
</a>
Üretim için Buf Kullanımı
</h3>
<p>Buf, Protobuf iş akışlarını ve oluşturma yapılandırmalarını standartlaştıran bir araçtır (<code>buf.yaml</code>, <code>buf.gen.yaml</code>).<br/></p>
<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>npx buf generate

