<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های حمیده دلیری</title>
        <link>https://virgool.io/feed/@hmde9419</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-16 12:25:29</pubDate>
        <image>
            <url>https://static.virgool.io/images/default-avatar.jpg</url>
            <title>حمیده دلیری</title>
            <link>https://virgool.io/@hmde9419</link>
        </image>

                    <item>
                <title>Laravel Envoy برای استقرار خودکار پروژه‌های لاراول</title>
                <link>https://virgool.io/@hmde9419/laravel-envoy-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A7%D8%B3%D8%AA%D9%82%D8%B1%D8%A7%D8%B1-%D8%AE%D9%88%D8%AF%DA%A9%D8%A7%D8%B1-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%87%D8%A7%DB%8C-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-ahaoenve2kwh</link>
                <description>Laravel Envoy یک ابزار برای اجرای دستورات سرور از راه دور به‌صورت ساده و تمیز است. این ابزار بیشتر برای استقرار (Deployment) خودکار، اجرای دستورات مدیریتی روی سرور، و اتوماسیون وظایف استفاده می‌شود.ویژگی‌های کلیدی Laravel Envoy:✅ سینتکس ساده و خوانا (بر پایه Blade)✅ اجرای دستورات روی چندین سرور به‌صورت همزمان✅ امکان تعریف Task برای گروه‌بندی دستورات✅ امکان استفاده از notifications (مثل ارسال پیام به Slack و Discord)نصب Envoyابتدا Envoy را با Composer نصب کن:composer global require laravel/envoyنکته: مطمئن شو که ~/.composer/vendor/bin یا ~/.config/composer/vendor/bin در PATH سیستم شما قرار دارد.📄 ایجاد و استفاده از Envoy.blade.phpیک فایل در ریشه پروژه با نام Envoy.blade.php بساز و دستورات خود را در آن بنویس:@servers([&#039;web&#039; =&gt; &#039;your-user@your-server-ip&#039;])

@task(&#039;deploy&#039;, [&#039;on&#039; =&gt; &#039;web&#039;])
    cd /var/www/your-project
    git pull origin main
    composer install --no-dev --prefer-dist
    php artisan migrate --force
    php artisan cache:clear
    php artisan config:clear
    php artisan view:clear
    npm run build
@endtaskدر این مثال:🔹 به سرور web متصل می‌شویم.🔹 آخرین تغییرات git pull را دریافت می‌کنیم. پکیج‌های composer را نصب می‌کنیم.🔹 دیتابیس را به‌روزرسانی می‌کنیم.🔹 کش‌ها را پاک می‌کنیم.🔹 فرانت‌اند را بیلد می‌کنیم.🚀 اجرا کردن Envoyبرای اجرای تسک deploy، این دستور را در ترمینال بزن:envoy run deployاگر چندین سرور داری، می‌توانی این کار را هم انجام بدهی:envoy run deploy --parallel(این کار روی همه سرورها به‌صورت همزمان اجرا می‌شود.)📢 اضافه کردن نوتیفیکیشنمی‌توانی بعد از اجرای موفق تسک، یک پیام در Slack یا Discord بفرستی:@after
    @slack(&#039;webhook-url&#039;, &#039;#deployments&#039;, &amp;quotDeployment completed successfully!&amp;quot)
@endafter💡 نتیجه‌گیریLaravel Envoy یک ابزار عالی برای اتوماسیون استقرار (Deployment Automation) در پروژه‌های Laravel است. با آن می‌توانی به‌راحتی git pull، composer install، migrate و حتی npm run build را اجرا کنی. برای پروژه‌ای که روی GitLab CI/CD کار می‌کنی، Envoy می‌تواند نقش مکمل برای مدیریت استقرار روی سرور را بازی کند. 🎯</description>
                <category>حمیده دلیری</category>
                <author>حمیده دلیری</author>
                <pubDate>Sun, 30 Mar 2025 13:18:20 +0330</pubDate>
            </item>
                    <item>
                <title>2- Design Patterns (الگوهای طراحی): Factory Method</title>
                <link>https://virgool.io/@hmde9419/2-design-patterns-%D8%A7%D9%84%DA%AF%D9%88%D9%87%D8%A7%DB%8C-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-factory-method-rizzksw7bdai</link>
                <description>الگوی Factory Method (متد کارخانه‌ای) چیست؟این الگو یک روش استاندارد برای ایجاد اشیا ارائه می‌دهد، بدون اینکه کلاس دقیق شیء را مستقیماً مشخص کنیم. به‌عبارت دیگر، به جای اینکه از new ClassName() استفاده کنیم، یک متد مخصوص (Factory Method) داریم که مسئول ایجاد و بازگرداندن نمونه‌ی مناسب است.چرا از Factory Method استفاده کنیم؟✅ کاهش وابستگی (Decoupling) → کنترلرها و بخش‌های مختلف سیستم وابسته به کلاس‌های خاص نمی‌شوند. ✅ انعطاف‌پذیری بیشتر → به‌راحتی می‌توان کلاس‌های جدید را بدون تغییر در کد اصلی اضافه کرد. ✅ کد تمیزتر و سازمان‌یافته‌تر → مسئولیت ساخت اشیا در یک مکان مشخص مدیریت می‌شود.مثال در Laravelفرض کنید چندین نوع پرداخت داریم و می‌خواهیم یک متد برای ایجاد شیء پرداخت مناسب داشته باشیم:بدون Factory Method (روش نادرست)class PaymentController {
    public function pay($type) {
        if ($type === &#039;paypal&#039;) {
            $payment = new PayPalPayment();
        } elseif ($type === &#039;stripe&#039;) {
            $payment = new StripePayment();
        }
        $payment-&gt;process();
    }
}🔴 این روش باعث می‌شود که کنترلر وابسته به کلاس‌های مختلف باشد، که نگهداری آن را سخت می‌کند.با استفاده از Factory Method (روش بهینه)class PaymentFactory {
    public static function create($type) {
        return match ($type) {
            &#039;stripe&#039; =&gt; new StripePyment(),
            default =&gt; throw new Exception(&#039;نوع پرداخت نامعتبر است.&#039;),
        };
    }
}

// استفاده در کنترلر
class PaymentController {
    public function pay($type) {
        $payment = PaymentFactory::create($type);
        $payment-&gt;process();
    }
}✅ مزایا:کنترلر دیگر وابسته به کلاس‌های خاص نیست.اضافه کردن روش‌های جدید پرداخت آسان‌تر است.کد خواناتر و مرتب‌تر می‌شود.جمع‌بندیالگوی Factory Method زمانی مفید است که بخواهید نمونه‌هایی از کلاس‌های مختلف را بدون مشخص کردن مستقیم آن‌ها ایجاد کنید. این الگو به‌خصوص در سیستم‌هایی که نیاز به تغییرپذیری و توسعه‌پذیری دارند، بسیار کاربردی است.</description>
                <category>حمیده دلیری</category>
                <author>حمیده دلیری</author>
                <pubDate>Sun, 02 Mar 2025 11:48:44 +0330</pubDate>
            </item>
                    <item>
                <title>الگوهای طراحی - Design Patterns</title>
                <link>https://virgool.io/@hmde9419/%D8%A7%D9%84%DA%AF%D9%88%D9%87%D8%A7%DB%8C-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-design-patterns-quqwactmmtvq</link>
                <description>Design Patterns مجموعه‌ای از راهکارهای اثبات‌شده برای حل مشکلات رایج در طراحی نرم‌افزار هستند. این الگوها به توسعه‌دهندگان کمک می‌کنند تا کدهای قابل نگهداری، مقیاس‌پذیر و خوانا بنویسند.دسته‌بندی اصلی الگوهای طراحیالگوهای طراحی معمولاً به سه دسته تقسیم می‌شوند:1. Creational (الگوهای سازنده)این الگوها به ایجاد اشیا کمک می‌کنند و نحوه‌ی نمونه‌سازی را بهینه می‌کنند.Singleton → محدود کردن ایجاد نمونه‌ای از یک کلاس به یک شیء واحد.Factory Method → ایجاد اشیا بدون مشخص کردن کلاس دقیق آن‌ها.Abstract Factory → ایجاد گروهی از اشیا مرتبط بدون تعیین کلاس‌های آن‌ها.Builder → جدا کردن ساختار پیچیده‌ی یک شی از نحوه‌ی ایجاد آن.Prototype → ایجاد اشیا جدید با استفاده از کپی نمونه‌های موجود.2. Structural (الگوهای ساختاری)این الگوها چگونگی ترکیب کلاس‌ها و اشیا را مشخص می‌کنند.Adapter → تبدیل یک اینترفیس به اینترفیس دیگر برای سازگاری با سیستم.Bridge → جداسازی بخش انتزاعی (Abstract) از پیاده‌سازی (Implementation).Composite → ترکیب اشیا در ساختاری درختی برای استفاده‌ی یکسان از تک اشیا و گروهی از آن‌ها.Decorator → اضافه کردن قابلیت به کلاس‌ها بدون تغییر در ساختار اصلی.Facade → فراهم کردن یک رابط ساده برای مجموعه‌ای از کلاس‌های پیچیده.Flyweight → استفاده‌ی بهینه از حافظه با به اشتراک‌گذاری اشیای مشابه.Proxy → ایجاد یک واسطه برای کنترل دسترسی به یک شی.3. Behavioral (الگوهای رفتاری)این الگوها نحوه‌ی تعامل بین اشیا را تعریف می‌کنند.Observe r → الگویی که امکان اطلاع رسانی خودکار تغییرات در یک شیء به سایر بخش‌های سیستم را فراهم می‌کند. این الگو در سیستم‌هایی که نیاز به هماهنگی بین اجزا دارند، مفید است.Strategy → جداسازی الگوریتم‌های مختلف و انتخاب آن‌ها در زمان اجرا.Command → کپسوله کردن یک درخواست به‌عنوان یک شیء مستقل.Mediator → کنترل تعامل بین اشیا بدون نیاز به ارتباط مستقیم آن‌ها.Memento → نگهداری وضعیت یک شی برای بازگرداندن آن در آینده.State → تغییر رفتار یک شی براساس وضعیت آن.Template Method → تعریف یک اسکلت کلی برای الگوریتم و اجازه‌ی تغییر بخش‌هایی از آن.Chain of Responsibility → ارسال درخواست در زنجیره‌ای از پردازشگرها تا یکی از آن‌ها پاسخ دهد.Iterator → ارائه راهی استاندارد برای پیمایش در مجموعه‌ها.Visitor → اضافه کردن قابلیت‌های جدید بدون تغییر در کلاس‌های موجود.چگونه از Design Patterns در Laravel و Filament استفاده کنیم؟در Laravel و Filament برخی از این الگوها به‌شدت کاربردی هستند:✅ Singleton → در Service Providers برای جلوگیری از ایجاد چندین نمونه از یک سرویس.✅ Factory Method → در Eloquent Factories برای ایجاد مدل‌ها در تست‌ها.✅ Observer → در Eloquent برای گوش دادن به رویدادهای مدل‌ها.✅ Repository Pattern → جداسازی منطق پایگاه داده از کنترلرها.✅ Strategy → پیاده‌سازی استراتژی‌های مختلف برای پرداخت، احراز هویت و ...</description>
                <category>حمیده دلیری</category>
                <author>حمیده دلیری</author>
                <pubDate>Sun, 02 Mar 2025 11:30:29 +0330</pubDate>
            </item>
                    <item>
                <title>1- Design Patterns (الگوهای طراحی): Singleton Pattern</title>
                <link>https://virgool.io/@hmde9419/1-design-patterns-singleton-pattern-qau0pwpzjqnq</link>
                <description>۱. Singleton Pattern – تک‌نمونه📌 هدف: این الگو تضمین می‌کند که از یک کلاس فقط یک نمونه (Instance) در کل برنامه وجود داشته باشد و همه بخش‌های برنامه از همان نمونه استفاده کنند.📌 چه زمانی از Singleton استفاده کنیم؟✅ زمانی که باید فقط یک شیء از یک کلاس در کل برنامه وجود داشته باشد.✅ برای مدیریت منابعی مثل اتصال به دیتابیس، لاگ‌گیری، تنظیمات برنامه و …✅ وقتی می‌خواهیم دسترسی جهانی (Global Access) به یک شیء داشته باشیم.🛠 پیاده‌سازی Singleton در PHPclass Singleton {
    private static ?Singleton $instance = null; // متغیر استاتیک برای ذخیره نمونه کلاس
    
    private function __construct() {} // جلوگیری از ایجاد نمونه جدید
    private function __clone() {} // جلوگیری از کلون کردن شیء
    private function __wakeup() {} // جلوگیری از unserialize شدن
    
    public static function getInstance(): Singleton {
        if (self::$instance === null) {
            self::$instance = new Singleton();
        }
        return self::$instance;
    }
}

// استفاده از Singleton
$object1 = Singleton::getInstance();
$object2 = Singleton::getInstance();

var_dump($object1 === $object2); // خروجی: true🔹 در این کد، هر بار که getInstance() را صدا بزنیم، همان نمونه قبلی برمی‌گردد و نمی‌توان نمونه جدیدی ایجاد کرد.📌 مزایا و معایب Singleton✅ مزایا:جلوگیری از ایجاد چندین نمونه غیرضروری از یک کلاس.مدیریت بهتر منابع (مثلاً اتصال به دیتابیس).دسترسی سراسری (Global Access) به یک شیء واحد.❌ معایب:وابستگی زیاد به یک شیء واحد ممکن است تست‌نویسی (Unit Testing) را سخت کند.اگر نادرست استفاده شود، می‌تواند برنامه را به یک ساختار وابسته به وضعیت (Stateful) تبدیل کند.</description>
                <category>حمیده دلیری</category>
                <author>حمیده دلیری</author>
                <pubDate>Tue, 25 Feb 2025 10:59:58 +0330</pubDate>
            </item>
                    <item>
                <title>چرا Auth::id() در متد سازنده کنترلر null برمیگرداند؟</title>
                <link>https://virgool.io/@hmde9419/%DA%86%D8%B1%D8%A7-authid-%D8%AF%D8%B1-%D9%85%D8%AA%D8%AF-%D8%B3%D8%A7%D8%B2%D9%86%D8%AF%D9%87-%DA%A9%D9%86%D8%AA%D8%B1%D9%84%D8%B1-null-%D8%A8%D8%B1%D9%85%DB%8C%DA%AF%D8%B1%D8%AF%D8%A7%D9%86%D8%AF-onguli2ojsye</link>
                <description>دلیل اینکه فراخوانی dd(Auth::id()) در سازنده (constructor) کنترلر مقدار null برمی‌گرداند، اما در سایر متدهای کنترلر شناسه کاربر لاگین‌شده را برمی‌گرداند، به ترتیب اجرای بخش‌های مختلف لاراول مربوط می‌شود.ترتیب اجرای درخواست‌ها در لاراول:سازنده (Constructor): وقتی سازنده کنترلر فراخوانی می‌شود، هنوز میدلورها (مثل احراز هویت) به‌طور کامل پردازش نشده‌اند.سازنده کنترلر قبل از اینکه لاراول میدلورها (middlewares) را اجرا کند، فراخوانی می‌شود.چون میدلور احراز هویت (Authenticate middleware) هنوز اجرا نشده است، در سازنده کنترلر، کاربر هنوز احراز هویت نشده و متد Auth::id() مقدار null برمی‌گرداند.میدلورها (Middlewares): بعد از سازنده، میدلورها اجرا می‌شوند. در این مرحله میدلورهای مرتبط با احراز هویت بررسی می‌کنند که آیا کاربر لاگین کرده است یا نه. بعد از اجرای میدلور احراز هویت، اطلاعات کاربر در دسترس است.متدهای کنترلر: پس از اجرای میدلورها، وقتی شما متدهای کنترلر را فراخوانی می‌کنید، کاربر لاگین‌شده شناسایی شده است و به همین دلیل Auth::id() در متدهای کنترلر کاربر لاگین‌شده را برمی‌گرداند.راه‌حل:اگر نیاز دارید که شناسه کاربر را در سازنده کنترلر دریافت کنید، باید مطمئن شوید که میدلور احراز هویت قبل از فراخوانی سازنده کنترلر اجرا شده است. برای این کار می‌توانید از میدلورها در سازنده کنترلر استفاده کنید تا احراز هویت را در متدهای سازنده لحاظ کنید.استفاده از میدلور در سازنده:class SomeController extends Controller {     
       public function __construct()     {         
            // اجرای میدلور auth برای اطمینان از اینکه کاربر لاگین شده است 
           $this-&gt;middleware(&#039;auth&#039;);          // حالا شناسه کاربر در دسترس خواهد بود 
          dd(Auth::id()); // اینجا دیگر مقدار null نخواهد بود    
      }
 }راه حل بهتر: استفاده از Lazy Loading برای دسترسی به شناسه کاربرمی‌توانید به جای استفاده مستقیم از Auth::id() در سازنده یا در لحظه ساختن سرویس، دسترسی به شناسه کاربر را به لحظه‌ای که واقعاً نیاز دارید موکول کنید. این کار را می‌توانید با استفاده از Closure یا Lazy Loading انجام دهید.مرحله 1: تنظیم CartService برای دریافت شناسه کاربر به صورت Lazyمی‌توانید در CartService به جای استفاده مستقیم از Auth::id()، یک Closure یا تابع callback برای شناسه کاربر تنظیم کنید که فقط در زمان نیاز اجرا شود.namespace App\Services;
class CartService
{
 protected $userId;
public function __construct()
 {
        // شناسه کاربر را به صورت lazy (تنبلی) تنظیم می‌کنیم
$this-&gt;userId = fn() =&gt; Auth::id();
}
 public function getCart()
 {
        // اجرای Closure برای دریافت شناسه کاربر در زمان نیاز
$userId = ($this-&gt;userId)();
 if ($userId) {
            // برگرداندن سبد خرید کاربر لاگین شده
            return $this-&gt;getUserCart($userId);
} else {
            // سبد خرید مهمان
            return $this-&gt;getGuestCart();
        }
    }
protected function getUserCart($userId)
 {
        // منطق دریافت سبد خرید کاربر لاگین شده
 }
protected function getGuestCart()
 {
        // منطق دریافت سبد خرید مهمان
 }
}مرحله 2: استفاده از CartService در کنترلرحالا می‌توانید بدون هیچ مشکلی CartService را در سازنده کنترلر تزریق کنید، چرا که دسترسی به شناسه کاربر فقط زمانی انجام می‌شود که نیاز است (در متد getCart()):namespace App\Http\Controllers;
use App\Services\CartService;
class CheckoutController extends Controller
{
protected $cartService;
 public function __construct(CartService $cartService)
{
 $this-&gt;cartService = $cartService;
 }
public function checkout()
{
  // cartService اکنون به درستی شناسه کاربر لاگین شده را می‌شناسد
  $cart = $this-&gt;cartService-&gt;getCart();
 return view(&#039;checkout&#039;, compact(&#039;cart&#039;));
 }
}مزایا:تزریق در سازنده: همچنان از مزایای تزریق وابستگی در سازنده استفاده می‌کنید و کد تمیزتر است.دسترسی lazy به شناسه کاربر: Auth::id() فقط زمانی فراخوانی می‌شود که نیاز باشد (مثلاً هنگام فراخوانی getCart())، و از مشکل null بودن شناسه کاربر جلوگیری می‌شود.کاهش پیچیدگی: نیازی به تزریق مستقیم سرویس‌ها در متدهای کنترلر نیست و ساختار کلاس‌ها ساده‌تر است.نکته مهم:معمولاً نیازی نیست که در سازنده کنترلر شناسه کاربر را بررسی کنید. بهترین روش این است که عملیات مربوط به شناسه کاربر را در متدهای کنترلر انجام دهید، زیرا در آن مرحله مطمئن هستید که کاربر لاگین‌شده شناسایی شده است.</description>
                <category>حمیده دلیری</category>
                <author>حمیده دلیری</author>
                <pubDate>Fri, 13 Sep 2024 00:02:12 +0330</pubDate>
            </item>
                    <item>
                <title>ثبت و پیکربندی سرویس‌ها با ServiceProvider در Laravel</title>
                <link>https://virgool.io/@hmde9419/%D8%AB%D8%A8%D8%AA-%D9%88-%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C-%D8%B3%D8%B1%D9%88%DB%8C%D8%B3-%D9%87%D8%A7-%D8%A8%D8%A7-serviceprovider-%D8%AF%D8%B1-laravel-i1wngu4pfgxt</link>
                <description>در لاراول، ServiceProvider ها برای ثبت و پیکربندی سرویس‌ها و وابستگی‌ ها در container لاراول استفاده می‌شوند. این کلاس‌ها وظیفه دارند تا سرویس‌ها را به‌طور صحیح در زمان بوت شدن برنامه ثبت کنند و تنظیمات اولیه را انجام دهند.ویژگی‌های کلیدی:ثبت سرویس‌ها: ServiceProviderها می‌توانند سرویس‌ها را در container لاراول ثبت کنند و نحوه ساخت آن‌ها را مشخص کنند.تنظیمات اولیه: امکان اجرای کدهای خاص هنگام بوت شدن برنامه وجود دارد.نحوه استفاده:ساخت ServiceProvider: کلاس‌های ServiceProvider را در پوشه app/Providers قرار دهید و متدهای register و boot را پیاده‌سازی کنید.ثبت ServiceProvider: در فایل config/app.php سرویس‌سازها را ثبت کنید.مثال کد:namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Services\CartService;
class CartServiceProvider extends ServiceProvider
{
    public function register()
   {
         $this-&gt;app-&gt;singleton(CartService::class, function ($app) {
             return new CartService();
         });
    }
    public function boot()     
   {
         // اجرای کدهای لازم هنگام بوت شدن برنامه    
    }
}ثبت در config/app.php:&#039;providers&#039; =&gt; [
  // سایر providers
 App\Providers\CartServiceProvider::class,
],نکات:پیکربندی: از ServiceProviderها برای ثبت و پیکربندی سرویس‌ها استفاده کنید و اطمینان حاصل کنید که تنظیمات به‌درستی انجام شده است.جداسازی: ServiceProviderها را برای ثبت و تنظیم سرویس‌ها نگهدارید و منطق پیچیده را در سرویس‌ها قرار دهید.</description>
                <category>حمیده دلیری</category>
                <author>حمیده دلیری</author>
                <pubDate>Tue, 27 Aug 2024 18:39:56 +0330</pubDate>
            </item>
                    <item>
                <title>استفاده از Service ها در Laravel برای سازماندهی بهتر منطق تجاری</title>
                <link>https://virgool.io/@hmde9419/%DA%86%DA%AF%D9%88%D9%86%D9%87-%D8%A7%D8%B2-service%D9%87%D8%A7-%D8%AF%D8%B1-laravel-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B3%D8%A7%D8%B2%D9%85%D8%A7%D9%86%D8%AF%D9%87%DB%8C-%D8%A8%D9%87%D8%AA%D8%B1-%D9%85%D9%86%D8%B7%D9%82-%D8%AA%D8%AC%D8%A7%D8%B1%DB%8C-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%DA%A9%D9%86%DB%8C%D9%85-wwcdlwtqmdhj</link>
                <description>کلاس‌های Service در Laravel برای مدیریت منطق تجاری پیچیده و انجام عملیات‌های خاص استفاده می‌شوند. این کلاس‌ها به‌طور معمول در لایه سرویس برنامه قرار دارند و مسئولیت‌هایی مانند پردازش پرداخت‌ها، مدیریت سبد خرید، و تعامل با مدل‌ها را بر عهده دارند.ویژگی‌های کلیدی:منطق تجاری: Serviceها منطق تجاری پیچیده را پیاده‌سازی می‌کنند و می‌توانند با مدل‌ها و پایگاه داده تعامل داشته باشند.تزریق وابستگی: Serviceها معمولاً از طریق تزریق وابستگی (Dependency Injection) در سایر بخش‌های برنامه استفاده می‌شوند.نحوه استفاده:ساخت Service: کلاس‌های Service را در پوشه app/Services قرار دهید و منطق مورد نظر را پیاده‌سازی کنید.تزریق Service: از تزریق وابستگی برای استفاده از Serviceها در کنترلرها و دیگر بخش‌های برنامه استفاده کنید.مثال کد:namespace App\Services;
use App\Models\Cart;
class CartService
{
    public function getOpenCart()
   {
        // منطق برای دریافت سبد خرید باز    }   public function addOrUpdateItem($productId, $quantity)
  {
        // منطق برای افزودن یا به‌روزرسانی آیتم در سبد خرید
   }
}نحوه استفاده:namespace App\Http\Controllers;
use App\Services\CartService;
class CartController extends Controller
{
     protected $cartService;
     public function __construct(CartService $cartService)
    {
         $this-&gt;cartService = $cartService;
     }    public function index()
   {
         $cartItems = $this-&gt;cartService-&gt;getOpenCart();
         return view(&#039;cart.index&#039;)-&gt;with(&#039;cartItems&#039;,$cartItems);
    }
}نکات:تفکیک منطق: منطق پیچیده را در Serviceها نگهدارید و از کنترلرها برای وظایف ساده‌تر استفاده کنید.تست: تست‌های واحد برای Serviceها می‌تواند به شناسایی و رفع مشکلات کمک کند.</description>
                <category>حمیده دلیری</category>
                <author>حمیده دلیری</author>
                <pubDate>Tue, 27 Aug 2024 14:48:50 +0330</pubDate>
            </item>
                    <item>
                <title>آشنایی با Helperها در Laravel: ساخت توابع کمکی و استفاده مؤثر</title>
                <link>https://virgool.io/@hmde9419/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-helper%D9%87%D8%A7-%D8%AF%D8%B1-laravel-%D8%B3%D8%A7%D8%AE%D8%AA-%D8%AA%D9%88%D8%A7%D8%A8%D8%B9-%DA%A9%D9%85%DA%A9%DB%8C-%D9%88-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D9%85%D8%A4%D8%AB%D8%B1-dlnn83pl4vb0</link>
                <description>در لاراول، Helperها توابع یا کلاس‌هایی هستند که به‌طور عمومی در سراسر برنامه استفاده می‌شوند و معمولاً برای انجام وظایف کمکی مانند پردازش رشته‌ها، تاریخ‌ها، و محاسبات مورد استفاده قرار می‌گیرند. استفاده از Helperها به شما کمک می‌کند تا کد خود را سازمان‌دهی کرده و توابع عمومی را در یک مکان متمرکز نگهدارید.ویژگی‌های کلیدی:توابع عمومی: Helperها به‌عنوان توابع عمومی که می‌توانند از هر نقطه‌ای از برنامه فراخوانی شوند، عمل می‌کنند.عدم وابستگی به وضعیت: Helperها معمولاً نیازی به تعامل با پایگاه داده یا وضعیت شیء ندارند.نحوه استفاده:ساخت Helper: توابع را در کلاس‌هایی با نام مناسب تعریف کنید و آن‌ها را در پوشه app/Helpers قرار دهید.فراخوانی Helper: از توابع Helper در کنترلرها، مدل‌ها، و دیگر بخش‌های برنامه استفاده کنید.namespace App\Helpers;
class StringHelpe
{
 public static function formatDate($date)
{
        return date(&#039;d-m-Y&#039;, strtotime($date));
    }
}استفاده:use App\Helpers\StringHelper;
$date = StringHelper::formatDate(&#039;2024-08-27&#039;);نکات:سازمان‌دهی: توابع مشابه را در کلاس‌های Helper گروه‌بندی کنید.قابلیت استفاده مجدد: توابع عمومی و مفید را به‌عنوان Helper در پروژه‌های مختلف استفاده کنید.</description>
                <category>حمیده دلیری</category>
                <author>حمیده دلیری</author>
                <pubDate>Tue, 27 Aug 2024 14:33:13 +0330</pubDate>
            </item>
                    <item>
                <title>استفاده از Middleware در لاراول برای مدیریت احراز هویت</title>
                <link>https://virgool.io/@hmde9419/%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-middleware-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA-%D8%A7%D8%AD%D8%B1%D8%A7%D8%B2-%D9%87%D9%88%DB%8C%D8%AA-jlntib4wtagi</link>
                <description>در این پست قصد داریم به بررسی روش‌های بهینه برای استفاده از Middleware در لاراول بپردازیم. این روش‌ها به شما کمک می‌کنند تا احراز هویت کاربران را به شکل ساده‌تری مدیریت کنید و از تکرار کدهای اضافی جلوگیری کنید.۱. استفاده از Middleware در فایل Routeبه جای اینکه در هر کنترلر به صورت جداگانه Middleware را اعمال کنید، می‌توانید آن را مستقیماً در فایل‌های &#x60;routes/web.php&#x60; یا &#x60;routes/api.php&#x60; به مسیرها یا گروهی از مسیرها اضافه کنید.use App\Http\Controllers\ProfileController;اعمال میان‌افزار auth به مسیرهای خاصRoute::middleware([&#039;auth&#039;])-&gt;group(function () {
Route::get(&#039;/profile/additional-info&#039;, [ProfileController::class, &#039;additionalInfo&#039;])-&gt;name(&#039;profile.additional-info&#039;);
 Route::post(&#039;/profile/update&#039;, [ProfileController::class, &#039;updateProfile&#039;])-&gt;name(&#039;profile.update&#039;);
});۲. استفاده از Middleware به صورت Globalمی‌توانید یک Middleware را به صورت کلی و برای همه درخواست‌ها یا بخشی از برنامه در فایل &#x60;app/Http/Kernel.php&#x60; اضافه کنید.namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
protected $middlewareGroups = [
&#039;web&#039; =&gt; [
 // سایر میان‌افزارها
            \App\Http\Middleware\EnsureUserIsAuthenticated::class,
        ],
    ];
    protected $routeMiddleware = [
        &#039;auth&#039; =&gt; \App\Http\Middleware\Authenticate::class,
        &#039;customAuth&#039; =&gt; \App\Http\Middleware\EnsureUserIsAuthenticated::class,
    ];
}۳. استفاده از Middleware در کامپوننت‌های Livewireبرای کامپوننت‌های Livewire، می‌توانید از متد &#x60;boot&#x60; یا &#x60;mount&#x60; برای اعمال Middleware استفاده کنید.namespace App\Http\Livewire;
use Livewire\Component;
use Illuminate\Support\Facades\Auth;
class CheckoutComponent extends Component
{
public static function boot()
{
        // اعمال میان‌افزار auth برای اطمینان از لاگین بودن کاربر
        static::middleware(&#039;auth&#039;);
}
    public function mount()
{
// در اینجا نیازی به چک کردن نیست
 $this-&gt;cart = Auth::user()-&gt;openCart();
}
 public function render()
 {
 return view(&#039;livewire.checkout-component&#039;);
 }
}۴. ایجاد یک Controller Base کلاساگر چندین کنترلر دارید که نیاز به یک Middleware مشابه دارند، می‌توانید یک &#x60;BaseController&#x60; ایجاد کنید که Middleware را در آن اعمال کرده و سپس بقیه کنترلرها را از آن ارث‌بری کنید.namespace App\Http\Controllers;
use Illuminate\Routing\Controller as BaseController;
class AuthenticatedController extends BaseController 
{
public function __construct()
{
$this-&gt;middleware(&#039;auth&#039;);
 }
}حالا از این کنترلر ارث‌بری کنید.class ProfileController extends AuthenticatedController
{
 public function additionalInfo()
    {
        // لاگیک برای مدیریت اطلاعات اضافی پروفایل
    }
    public function updateProfile()
{
        // لاگیک برای به‌روزرسانی پروفایل
    }
}با استفاده از این روش‌ها، می‌توانید به صورت متمرکزتر و بهینه‌تر از Middleware‌ها در لاراول استفاده کنید، بدون اینکه نیاز به تکرار کد در هر کنترلر یا کامپوننت داشته باشید. این کار باعث می‌شود که کد شما تمیزتر و نگهداری آن آسان‌تر باشد.</description>
                <category>حمیده دلیری</category>
                <author>حمیده دلیری</author>
                <pubDate>Tue, 27 Aug 2024 12:16:02 +0330</pubDate>
            </item>
                    <item>
                <title>در مورد Computed Properties در لاراول بیشتر بدانیم!</title>
                <link>https://virgool.io/@hmde9419/%D8%AF%D8%B1-%D9%85%D9%88%D8%B1%D8%AF-computed-properties-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-%D8%A8%DB%8C%D8%B4%D8%AA%D8%B1-%D8%A8%D8%AF%D8%A7%D9%86%DB%8C%D9%85-znky6makvxtm</link>
                <description>در لاراول، کامپیوتد پروپرتیز (Computed Properties) معمولاً به عنوان ویژگی‌های محاسبه‌شده یا ویژگی‌های مجازی (Accessors) شناخته می‌شوند. این ویژگی‌ها به شما این امکان را می‌دهند که بدون نیاز به ذخیره کردن داده در دیتابیس، مقادیر خاصی را محاسبه کرده و به مدل‌های Eloquent خود اضافه کنید.استفاده از Accessor ها (ویژگی‌های محاسبه‌شده)در لاراول، می‌توانید از Accessor ها برای تعریف ویژگی‌های محاسبه‌شده استفاده کنید. این ویژگی‌ها در هنگام فراخوانی به طور خودکار محاسبه می‌شوند.برای تعریف یک Accessor، باید متدی در مدل Eloquent خود تعریف کنید که با get شروع شود و سپس نام ویژگی مورد نظر به صورت PascalCase (هر کلمه با حرف بزرگ شروع می‌شود) و در نهایت Attribute به عنوان پسوند متد اضافه شود.مثال:فرض کنید یک مدل به نام User دارید و می‌خواهید یک ویژگی مجازی به نام full_name داشته باشید که ترکیبی از نام و نام خانوادگی کاربر را برگرداند:class User extends Model
{   
 // Accessor برای ویژگی full_name
    public function getFullNameAttribute()
    {
        return $this-&gt;first_name . &#039; &#039; . $this-&gt;last_name;
    }
}در مثال بالا، هر زمان که به ویژگی full_name دسترسی پیدا کنید، لاراول به طور خودکار متد getFullNameAttribute را اجرا می‌کند و نتیجه‌ی آن را به شما برمی‌گرداند.استفاده در Blade Templateشما می‌توانید به راحتی از این ویژگی در بلید استفاده کنید:&lt;p&gt;نام کامل: {{ $user-&gt;full_name }}&lt;/p&gt;نکات مهم:ویژگی‌های محاسبه‌شده ذخیره نمی‌شوند: مقادیر Accessor ها در دیتابیس ذخیره نمی‌شوند، بلکه در زمان دسترسی محاسبه و برگردانده می‌شوند.نام‌گذاری متدها: نام متدها باید به صورت دقیق با فرمت get{AttributeName}Attribute باشد. به عنوان مثال، اگر می‌خواهید یک ویژگی به نام full_name داشته باشید، متد شما باید getFullNameAttribute نامیده شود.کاهش پیچیدگی در محاسبات: سعی کنید محاسبات سنگین را در Accessor ها قرار ندهید، چرا که ممکن است به عملکرد سیستم آسیب برساند.</description>
                <category>حمیده دلیری</category>
                <author>حمیده دلیری</author>
                <pubDate>Tue, 20 Aug 2024 10:36:18 +0330</pubDate>
            </item>
                    <item>
                <title>لاراول: ساخت مدل از روی جدول موجود</title>
                <link>https://virgool.io/@hmde9419/%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-%D8%B3%D8%A7%D8%AE%D8%AA-%D9%85%D8%AF%D9%84-%D8%A7%D8%B2-%D8%B1%D9%88%DB%8C-%D8%AC%D8%AF%D9%88%D9%84-%D9%85%D9%88%D8%AC%D9%88%D8%AF-klsrobwtbrt9</link>
                <description>دیتابیس و جداول مورد نیاز پروژه ات رو ایجاد کردی. حالا میخوای پروژه رو استارت بزنی و بری جلو. خب با ساخت مدل میخوای شروع کنی؟ با این روشی که میگم میتونی برای کل جداول با اجرای یک دستور، مدل ها رو بسازی.پکیج  release رو نصب کن:composer require reliese/laravel --devحالا این دستورات رو اجرا کن:php artisan vendor:publish --tag=reliese-modelsphp artisan config:clearحالا بریم سراغ ساخت مدل ها. دستور زیر رو اجرا کن تا تمام مدل ها یکجا ساخته بشه:php artisan code:modelsمدل ها در شاخه /app/Models ایجاد شدند. اگر ارتباطات بین جداول رو هم تعریف کرده باشی، relation های مورد نیاز هم در فایل کلاس مدل ها قابل مشاهده هست.حالا فرض کن وسط کار یه جدول دیگه به دیتابیس اضافه میکنی. برای ایجاد مدل برای این جدول جدید دستور زیر رو اجرا کن:php artisan code:models --table=usersحواست هست که به جای users اسم جدول خودت رو بنویسی!</description>
                <category>حمیده دلیری</category>
                <author>حمیده دلیری</author>
                <pubDate>Sun, 04 Aug 2024 11:37:15 +0330</pubDate>
            </item>
            </channel>
</rss>