فهرست ها

Introduction

Laravel is a backend framework that provides all of the features you need to build modern web applications, such as routing, validation, caching, queues, file storage, and more. However, we believe it's important to offer developers a beautiful full-stack experience, including powerful approaches for building your application's frontend.

There are two primary ways to tackle frontend development when building an application with Laravel, and which approach you choose is determined by whether you would like to build your frontend by leveraging PHP or by using JavaScript frameworks such as React, Svelte, and Vue. We'll discuss both of these options below so that you can make an informed decision regarding the best approach to frontend development for your application.

Using PHP

PHP and Blade

In the past, most PHP applications rendered HTML to the browser using simple HTML templates interspersed with PHP echo statements which render data that was retrieved from a database during the request:


<div>

    <?php foreach ($users as $user): ?>

        Hello, <?php echo $user->name; ?> <br />

    <?php endforeach; ?>

</div>

In Laravel, this approach to rendering HTML can still be achieved using views and Blade. Blade is an extremely light-weight templating language that provides convenient, short syntax for displaying data, iterating over data, and more:


<div>

    @foreach ($users as $user)

        Hello, {{ $user->name }} <br />

    @endforeach

</div>

When building applications in this fashion, form submissions and other page interactions typically receive an entirely new HTML document from the server and the entire page is re-rendered by the browser. Even today, many applications may be perfectly suited to having their frontends constructed in this way using simple Blade templates.

Growing Expectations

However, as user expectations regarding web applications have matured, many developers have found the need to build more dynamic frontends with interactions that feel more polished. In light of this, some developers choose to begin building their application's frontend using JavaScript frameworks such as React, Svelte, and Vue.

Others, preferring to stick with the backend language they are comfortable with, have developed solutions that allow the construction of modern web application UIs while still primarily utilizing their backend language of choice. For example, in the Rails ecosystem, this has spurred the creation of libraries such as Turbo Hotwire, and Stimulus.

Within the Laravel ecosystem, the need to create modern, dynamic frontends by primarily using PHP has led to the creation of Laravel Livewire and Alpine.js.

Livewire

Laravel Livewire is a framework for building Laravel powered frontends that feel dynamic, modern, and alive just like frontends built with modern JavaScript frameworks like React, Svelte, and Vue.

When using Livewire, you will create Livewire "components" that render a discrete portion of your UI and expose methods and data that can be invoked and interacted with from your application's frontend. For example, a simple "Counter" component might look like the following:


<?php

  

use Livewire\Component;

  

new class extends Component

{

    public $count = 0;

  

    public function increment()

    {

        $this->count++;

    }

};

?>

  

<div>

    <button wire:click="increment">+</button>

    <h1>{{ $count }}</h1>

</div>

  

As you can see, Livewire enables you to write new HTML attributes such as wire:click that connect your Laravel application's frontend and backend. In addition, you can render your component's current state using simple Blade expressions.

For many, Livewire has revolutionized frontend development with Laravel, allowing them to stay within the comfort of Laravel while constructing modern, dynamic web applications. Typically, developers using Livewire will also utilize Alpine.js to "sprinkle" JavaScript onto their frontend only where it is needed, such as in order to render a dialog window.

If you're new to Laravel, we recommend getting familiar with the basic usage of views and Blade. Then, consult the official Laravel Livewire documentation to learn how to take your application to the next level with interactive Livewire components.

Starter Kits

If you would like to build your frontend using PHP and Livewire, you can leverage our Livewire starter kit to jump-start your application's development.

Using React, Svelte, or Vue

Although it's possible to build modern frontends using Laravel and Livewire, many developers still prefer to leverage the power of a JavaScript framework like React, Svelte, or Vue. This allows developers to take advantage of the rich ecosystem of JavaScript packages and tools available via NPM.

However, without additional tooling, pairing Laravel with React, Svelte, or Vue would leave us needing to solve a variety of complicated problems such as client-side routing, data hydration, and authentication. Client-side routing is often simplified by using opinionated React / Svelte / Vue frameworks such as Next and Nuxt; however, data hydration and authentication remain complicated and cumbersome problems to solve when pairing a backend framework like Laravel with these frontend frameworks.

In addition, developers are left maintaining two separate code repositories, often needing to coordinate maintenance, releases, and deployments across both repositories. While these problems are not insurmountable, we don't believe it's a productive or enjoyable way to develop applications.

Inertia

Thankfully, Laravel offers the best of both worlds. Inertia bridges the gap between your Laravel application and your modern React, Svelte, or Vue frontend, allowing you to build full-fledged, modern frontends using React, Svelte, or Vue while leveraging Laravel routes and controllers for routing, data hydration, and authentication — all within a single code repository. With this approach, you can enjoy the full power of both Laravel and React / Svelte / Vue without crippling the capabilities of either tool.

After installing Inertia into your Laravel application, you will write routes and controllers like normal. However, instead of returning a Blade template from your controller, you will return an Inertia page:


<?php

  

namespace App\Http\Controllers;

  

use App\Models\User;

use Inertia\Inertia;

use Inertia\Response;

  

class UserController extends Controller

{

    /**

     * Show the profile for a given user.

     */

    public function show(string $id): Response

    {

        return Inertia::render('users/show', [

            'user' => User::findOrFail($id)

        ]);

    }

}

An Inertia page corresponds to a React, Svelte, or Vue component, typically stored within the resources/js/pages directory of your application. The data given to the page via the Inertia::render method will be used to hydrate the "props" of the page component:


import Layout from '@/layouts/authenticated';

import { Head } from '@inertiajs/react';

  

export default function Show({ user }) {

    return (

        <Layout>

            <Head title="Welcome" />

            <h1>Welcome</h1>

            <p>Hello {user.name}, welcome to Inertia.</p>

        </Layout>

    )

}

As you can see, Inertia allows you to leverage the full power of React, Svelte, or Vue when building your frontend, while providing a light-weight bridge between your Laravel powered backend and your JavaScript powered frontend.

Server-Side Rendering

If you're concerned about diving into Inertia because your application requires server-side rendering, don't worry. Inertia offers server-side rendering support. And, when deploying your application via Laravel Cloud or Laravel Forge, it's a breeze to ensure that Inertia's server-side rendering process is always running.

Starter Kits

If you would like to build your frontend using Inertia and React / Svelte / Vue, you can leverage our React, Svelte, or Vue application starter kits to jump-start your application's development. All of these starter kits scaffold your application's backend and frontend authentication flow using Inertia, React / Svelte / Vue, Tailwind, and Vite so that you can start building your next big idea.

Bundling Assets

Regardless of whether you choose to develop your frontend using Blade and Livewire or React / Svelte / Vue and Inertia, you will likely need to bundle your application's CSS into production-ready assets. Of course, if you choose to build your application's frontend with React, Svelte, or Vue, you will also need to bundle your components into browser ready JavaScript assets.

By default, Laravel utilizes Vite to bundle your assets. Vite provides lightning-fast build times and near instantaneous Hot Module Replacement (HMR) during local development. In all new Laravel applications, including those using our starter kits, you will find a vite.config.js file that loads our light-weight Laravel Vite plugin that makes Vite a joy to use with Laravel applications.

The fastest way to get started with Laravel and Vite is by beginning your application's development using our application starter kits, which jump-starts your application by providing frontend and backend authentication scaffolding.

[!NOTE]

For more detailed documentation on utilizing Vite with Laravel, please see our dedicated documentation on bundling and compiling your assets.

مقدمه

Laravel یک backend framework است که تمام ویژگی‌های مورد نیاز شما برای ساخت اپلیکیشن‌های وب مدرن را فراهم می‌کند؛ ویژگی‌هایی مانند routing، validation، caching، queues، file storage و موارد دیگر. با این حال، ما معتقدیم ارائه یک تجربه full-stack فوق‌العاده به توسعه‌دهندگان، از جمله رویکردهای قدرتمند برای ساخت frontend اپلیکیشن، بسیار حائز اهمیت است.

برای مدیریت و توسعه frontend هنگام ساخت یک اپلیکیشن با Laravel، دو راه اصلی وجود دارد. انتخاب هر کدام از این رویکردها به این بستگی دارد که آیا می‌خواهید frontend خود را با بهره‌گیری از PHP بسازید یا مایلید از JavaScript frameworks مانند React، Svelte و Vue استفاده کنید. در ادامه هر دو گزینه را بررسی می‌کنیم تا بتوانید با دیدی باز، بهترین روش توسعه frontend را برای اپلیکیشن خود انتخاب کنید.

استفاده از PHP

PHP و Blade

در گذشته، بیشتر اپلیکیشن‌های PHP صفحات HTML را با استفاده از تمپلیت‌های ساده‌ی HTML که با دستورات echo در PHP ترکیب شده بودند، به مرورگر تحویل می‌دادند (render می‌کردند). این دستورات، داده‌هایی را که در طول فرآیند درخواست (request) از پایگاه داده گرفته شده بود، نمایش می‌دادند:

HTML

<div>
    <?php foreach ($users as $user): ?>
        Hello, <?php echo $user->name; ?> <br />
    <?php endforeach; ?>
</div>

در Laravel، این روش برای render کردن HTML همچنون از طریق views و Blade قابل پیاده‌سازی است. Blade یک زبان تمپلیت‌نویسی (templating language) بسیار سبک است که سینتکس کوتاه و راحتی را برای نمایش داده‌ها، پیمایش روی آن‌ها (iterating) و موارد دیگر فراهم می‌کند:

HTML

<div>
    @foreach ($users as $user)
        Hello, {{ $user->name }} <br />
    @endforeach
</div>

هنگام ساخت اپلیکیشن‌ها به این روش، ارسال فرم‌ها (form submissions) و سایر تعاملات صفحه‌ای معمولاً یک سند HTML کاملاً جدید را از سرور دریافت می‌کنند و کل صفحه توسط مرورگر دوباره بارگذاری (re-rendered) می‌شود. حتی امروزه هم بسیاری از اپلیکیشن‌ها کاملاً برای این موضوع مناسب هستند که frontend آن‌ها به همین شیوه و با استفاده از تمپلیت‌های ساده‌ی Blade ساخته شود.

افزایش انتظارات کاربران

با این حال، هم‌زمان با بالا رفتن انتظارات کاربران از اپلیکیشن‌های وب، بسیاری از توسعه‌دهندگان نیاز به ساخت frontendهای پویا‌تر (dynamic) با تعاملاتی روان‌تر و حرفه‌ای‌تر را احساس کردند. با توجه به این موضوع، برخی از توسعه‌دهندگان تصمیم می‌گیرند که ساخت frontend اپلیکیشن خود را با استفاده از JavaScript frameworks مانند React، Svelte و Vue آغاز کنند.

در مقابل، گروهی دیگر که ترجیح می‌دهند از همان زبان backend مورد علاقه‌ و راحت خود استفاده کنند، راهکارهایی را توسعه داده‌اند که امکان ساخت UI برای اپلیکیشن‌های وب مدرن را فراهم می‌کند، در حالی که همچنان تمرکز اصلی روی همان زبان backend انتخابی باقی می‌ماند. به عنوان مثال، در اکوسیستم Rails، این نیاز باعث خلق کتابخانه‌هایی مانند Turbo Hotwire و Stimulus شد.

در اکوسیستم Laravel نیز، نیاز به خلق frontendهای مدرن و dynamic با استفاده‌ی عمده از PHP، منجر به ساخت Laravel Livewire و Alpine.js شده است.

Livewire

Laravel Livewire فریم‌ورکی برای ساخت frontendهای قدرت‌گرفته از Laravel است که درست مانند frontendهای ساخته‌شده با JavaScript frameworks مدرن مثل React، Svelte و Vue، کاملاً پویا (dynamic)، مدرن و زنده به نظر می‌رسند.

هنگام استفاده از Livewire، شما components (کامپوننت‌های) لایووایر را ایجاد می‌کنید که بخش مجزایی از UI شما را render می‌کنند؛ این کامپوننت‌ها متدها و داده‌هایی را در اختیار می‌گذارند که می‌توان آن‌ها را از سمت frontend اپلیکیشن فراخوانی کرد و با آن‌ها تعامل داشت. به عنوان مثال، یک کامپوننت ساده‌ی شمارنده (Counter) می‌تواند چیزی شبیه به این باشد:

PHP

<?php

use Livewire\Component;

new class extends Component {
    public $count = 0;

    public function increment()
    {
        $this->count++;
    }
}; ?>

<div>
    <button wire:click="increment">+</button>
    <h1>{{ $count }}</h1>
</div>

همان‌طور که مشاهده می‌کنید، Livewire به شما این امکان را می‌دهد تا HTML attributes جدیدی مانند wire:click بنویسید که frontend و backend اپلیکیشن لاراول شما را به هم متصل می‌کند. علاوه بر این، شما می‌توانید وضعیت فعلی (current state) کامپوننت خود را با استفاده از اکسپرشن‌های ساده‌ی Blade نمایش دهید.

برای بسیاری از افراد، Livewire تحول عظیمی در توسعه frontend با لاراول ایجاد کرده است؛ چرا که به آن‌ها اجازه می‌دهد در حین ساخت اپلیکیشن‌های وب مدرن و dynamic، در محیط راحت و آشنای Laravel باقی بمانند. معمولاً توسعه‌دهندگانی که از Livewire استفاده می‌کنند، از Alpine.js نیز کمک می‌گیرند تا جاوااسکریپت را فقط در بخش‌هایی از frontend که واقعاً به آن نیاز است (مثلاً برای نمایش یک پنجره دایالوگ/مدال)، تزریق کنند.

اگر در دنیای لاراول تازه‌کار هستید، پیشنهاد می‌کنیم ابتدا با کاربردهای پایه‌ای views و Blade آشنا شوید. سپس، به مستندات رسمی Laravel Livewire مراجعه کنید تا یاد بگیرید چگونه با استفاده از کامپوننت‌های تعاملی لایووایر، اپلیکیشن خود را به سطح بالاتر و حرفه‌ای‌تری ببرید.

Starter Kits

اگر تمایل دارید frontend خود را با استفاده از PHP و Livewire بسازید، می‌توانید از Livewire starter kit رسمی ما برای سرعت بخشیدن به فرآیند توسعه اپلیکیشن خود استفاده کنید.

استفاده از React، Svelte یا Vue

هرچند ساخت frontendهای مدرن با استفاده از Laravel و Livewire کاملاً امکان‌پذیر است، اما بسیاری از توسعه‌دهندگان همچنان ترجیح می‌دهند از قدرت یک JavaScript framework مانند React، Svelte یا Vue بهره ببرند. این کار به توسعه‌دهندگان اجازه می‌دهد تا از اکوسیستم غنی پکیج‌ها و ابزارهای جاوااسکریپت که از طریق NPM در دسترس هستند، استفاده کنند.

با این حال، اگر از ابزارهای کمکی استفاده نشود، ترکیب Laravel با React، Svelte یا Vue ما را با چالش‌های پیچیده و متعددی مواجه می‌کند؛ مسائلی مانند client-side routing، data hydration و authentication. فرآیند client-side routing معمولاً با استفاده از فریم‌ورک‌های ساختاریافته‌ی React / Svelte / Vue مانند Next.js و Nuxt ساده‌تر می‌شود؛ اما data hydration و authentication هنگام جفت کردن یک backend framework مانند Laravel با این فریم‌ورک‌های frontend، همچنان چالش‌هایی پیچیده و طاقت‌فرسا باقی می‌مانند.

علاوه بر این، توسعه‌دهندگان مجبور به نگهداری دو مخزن کد (code repositories) مجزا خواهند بود که اغلب نیازمند هماهنگی برای نگهداری، انتشار نسخه‌ها (releases) و استقرارها (deployments) در هر دو مخزن است. اگرچه این مشکلات غیرقابل حل نیستند، اما ما معتقدیم که این روش، راهی پربازده (productive) یا لذت‌بخش برای توسعه اپلیکیشن‌ها نیست.

Inertia

خوشبختانه، Laravel بهترین ویژگی‌های هر دو جهان را یک‌جا ارائه می‌دهد. Inertia شکاف میان اپلیکیشن لاراول شما و frontend مدرن مبتنی بر React، Svelte یا Vue را پر می‌کند؛ این ابزار به شما اجازه می‌دهد تا frontendهای کامل و مدرنی را با استفاده از React، Svelte یا Vue بسازید، در حالی که همچنان برای مسائلی مانند routing، data hydration و authentication از routes و controllers در لاراول بهره می‌برید — و همه این‌ها تنها در یک مخزن کد (code repository) واحد انجام می‌شود. با این رویکرد، شما می‌توانید از تمام قدرت Laravel و React / Svelte / Vue به طور هم‌زمان لذت ببرید، بدون اینکه به قابلیت‌های هیچ‌کدام از این ابزارها آسیبی وارد شود.

پس از نصب Inertia در اپلیکیشن لاراول خود، شما طبق روال عادی routes و controllers خود را می‌نویسید. با این حال، به جای بازگرداندن (returning) یک تمپلیت Blade از کنترلر خود، یک صفحه Inertia را بازمی‌گردانید:

PHP

<?php

namespace App\Http\Controllers;

use App\Models\User;
use Inertia\Inertia;
use Inertia\Response;

class UserController extends Controller
{
    /**
     * Show the profile for a given user.
     */
    public function show(string $id): Response
    {
        return Inertia::render('users/show', [
            'user' => User::findOrFail($id)
        ]);
    }
}

یک صفحه Inertia دقیقاً معادل با یک کامپوننت React، Svelte یا Vue است که معمولاً در دایرکتوری resources/js/pages اپلیکیشن شما ذخیره می‌شود. داده‌هایی که از طریق متد Inertia::render به صفحه پاس داده می‌شوند، برای پر کردن یا هیدراته کردن (hydrate) لایوِ props در کامپوننتِ صفحه استفاده خواهند شد:

JavaScript

import Layout from '@/layouts/authenticated';
import { Head } from '@inertiajs/react';

export default function Show({ user }) {
    return (
        <Layout>
            <Head title="Welcome" />
            <h1>Welcome</h1>
            <p>Hello {user.name}, welcome to Inertia.</p>
        </Layout>
    );
}

همان‌طور که مشاهده می‌کنید، Inertia به شما این امکان را می‌دهد تا هنگام ساخت frontend خود، از تمام قدرت React، Svelte یا Vue استفاده کنید و در عین حال، یک پل ارتباطی سبک (light-weight bridge) میان backend قدرت‌گرفته از لاراول و frontend مبتنی بر جاوااسکریپت شما برقرار می‌سازد.

Server-Side Rendering

اگر نگران این هستید که به خاطر نیاز اپلیکیشن خود به server-side rendering (رندر سمت سرور) نتوانید از Inertia استفاده کنید، اصلاً جای نگرانی نیست. Inertia از server-side rendering کاملاً پشتیبانی می‌کند. علاوه بر این، هنگام استقرار (deploying) اپلیکیشن خود از طریق Laravel Cloud یا Laravel Forge، بالا نگه داشتن و اجرای مداوم فرآیند رندر سمت سرورِ Inertia مثل آب خوردن است.

Starter Kits

اگر تمایل دارید frontend خود را با استفاده از Inertia و یکی از فریم‌ورک‌های React / Svelte / Vue بسازید، می‌توانید از starter kits اختصاصی ما استفاده کنید تا به روند توسعه اپلیکیشن خود سرعت ببخشید. تمام این استارتر کیت‌ها، ساختار اولیه پلتفرم (scaffold) شامل فرآیند احراز هویت (authentication flow) در بخش backend و frontend را با استفاده از Inertia، React / Svelte / Vue، Tailwind و Vite برای شما آماده می‌کنند تا بتوانید بلافاصله ایده‌ی بزرگ بعدی خود را پیاده‌سازی کنید.

Bundling Assets

صرف‌نظر از اینکه برای توسعه‌ی frontend خود ترکیب Blade و Livewire را انتخاب کنید یا به سراغ React / Svelte / Vue و Inertia بروید، در هر صورت احتمالاً نیاز خواهید داشت تا فایل‌های CSS اپلیکیشن خود را به دارایی‌های آماده‌ی پروداکشن (production-ready assets) تبدیل و بسته‌بندی (bundle) کنید. البته، اگر تصمیم بگیرید frontend خود را با React، Svelte یا Vue بسازید، باید کامپوننت‌های خود را نیز در قالب فایل‌های جاوااسکریپتِ آماده‌ی مرورگر bundle کنید.

به طور پیش‌فرض، Laravel از Vite برای bundle کردن دارایی‌های شما استفاده می‌کند. Vite سرعت فوق‌العاده بالایی در ساخت فایل‌ها (build times) دارد و در طول توسعه‌ی محلی (local development)، قابلیت جایگزینی آنی ماژول‌ها (Hot Module Replacement یا همان HMR) را به صورت تقریباً لحظه‌ای ارائه می‌دهد. در تمام اپلیکیشن‌های جدید لاراول (از جمله پروژه‌هایی که از استارتر کیت‌های ما استفاده می‌کنند)، یک فایل vite.config.js وجود دارد که پلاگین سبک Laravel Vite plugin را بارگذاری می‌کند؛ افزونه‌ای که کار با Vite را در اپلیکیشن‌های لاراول به تجربه‌ای بسیار لذت‌بخش تبدیل می‌کند.

سریع‌ترین راه برای شروع کار با Laravel و Vite این است که توسعه‌ی پروژه‌ی خود را با استارتر کیت‌های لاراول (application starter kits) آغاز کنید. این کیت‌ها با آماده‌سازی ساختار اولیه (scaffold) احراز هویت در frontend و backend، سرعت شروع کار شما را به شدت بالا می‌برند.

نکته > برای دسترسی به مستندات دقیق‌تر در مورد نحوه‌ی استفاده از Vite در لاراول، لطفاً به بخش مستندات اختصاصی ما در زمینه‌ی bundling و کامپایل کردن دارایی‌ها (compiling assets) مراجعه کنید.