از جایی که هستید شروع کنید. از آنچه دارید استفاده کنید. آنچه میتوانید انجام دهید.
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامه نویسی </>
📌 @PapiDon_coding
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤2🔥1
Forwarded from اتاق برنامه نویسی </> (PapiDon)
David Thomas and Andrew Hunt
این کتاب توصیههای عملی و حرفهای برای توسعهدهندگان ارائه میدهد. موضوعاتی مانند مسئولیتپذیری شخصی و توسعه حرفهای تا تکنیکهای معماری را پوشش میدهد. با وجود اینکه در سال ۱۹۹۹ نوشته شده است، هنوز در بسیاری از جنبهها معتبر است. ویژگی منحصر به فرد این کتاب این است که به صورت عملی با مجموعهای از نکات برای بهبود فرآیند توسعه به شما آموزش میدهد.
David Farley
این کتاب بر ساخت نرمافزار عالی تمرکز دارد و نویسنده یک چارچوب محکم برای اتصال بهترین شیوهها مانند Continuous Delivery (CD)، معماری شش ضلعی و Test-Driven Development به ایدههای اصلی در مهندسی نرمافزار ارائه میدهد. او همچنین در مورد تاریخچه توسعه نرمافزار و ایدههایی که صنعت را تغییر دادهاند، مینویسد.
Steve McConnell
یکی از کتابهایی که بیش از ۱۵ سال پیش نوشته شده و هنوز معتبر است. این کتاب به طراحی، کدنویسی، اشکالزدایی و تست میپردازد. در بیش از ۹۰۰ صفحه، نویسندگان نحوه نوشتن برنامهها برای مردم اول و سپس برای کامپیوترها، چگونگی تقسیم کد به دامنهها و چگونگی تسلط بر ویژگیهای انسانی بهترین برنامهنویسان (تواضع، کنجکاوی و مهمتر از همه، کنترل اگو) را توضیح میدهند.
Titus Winters, Tom Manshreck, and Hyrum Wright
این کتاب درباره برنامهنویسی نیست، بلکه در مورد شیوههای مهندسی در گوگل برای حفظ و سلامت کدپایه آنها است. در این کتاب، تفاوت بین مهندسی نرمافزار و برنامهنویسی، اهمیت قانون بیانسه، و چگونگی تست صحیح چیزها و انتشار کوچک و مکرر را خواهید آموخت.
Eric Freeman
این کتاب الگوهای طراحی اصلی نرمافزار را برای ایجاد طراحیهای انعطافپذیرتر، شیکتر و قابل استفاده مجدد بدون نیاز به کشف مجدد راهحلهای طراحی توصیف میکند. این کتاب به سبک کتابهای For Dummies نوشته شده است، به طوری که برای مبتدیان قابل فهم باشد.
Aditya Bhargava
این کتاب به زبانی ساده درباره کاربرد الگوریتمهای استاندارد در مسائل روزمره توسعهدهندگان توضیح میدهد. از مرتبسازی و جستجو شروع میکند و سپس به فشردهسازی دادهها و هوش مصنوعی با نمونه کدهایی در پایتون میپردازد. احتمالاً بهترین کتاب برای شروع یادگیری الگوریتمها است.
Martin Kleppman
این کتاب مفاهیم پیشرفته داده مانند پایگاههای داده و مدلهای داده و مفاهیم توزیعشده مانند تراکنشها، تکرار، سازگاری و غیره را توضیح میدهد. این کتاب یکی از تأثیرگذارترین کتابها در این دسته است.
Steve Freeman
نویسندگان رویههای خود، اهداف طراحی و برخی ابزارهایی که برای انجام کار استفاده میکنند را شرح میدهند. در یک مثال گسترده، خواهید فهمید که چگونه TDD در چند سطح عمل میکند، با استفاده از تستها برای هدایت ویژگیهای کد و ساختار شیءگرا و استفاده از اشیاء شبیهسازیشده برای یافتن و سپس تعریف پیوندها بین اشیاء.
John Ousterhout
این کتاب توضیح میدهد که چگونه سیستمهای نرمافزاری پیچیده را به قطعات قابل پیادهسازی مستقل تقسیم کنیم. سپس به مسائل فلسفی در مورد نحوه برخورد با فرآیند طراحی نرمافزار میپردازد و فهرستی از راهنماییهای طراحی برای دنبال کردن ارائه میدهد. این کتاب همچنین فهرستی از علائم هشدار برای طراحی بد ارائه میدهد. این کتاب یک همراه عالی برای Clean Code است زیرا دیدگاه متفاوتی ارائه میدهد.
📁 #Skills
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤3👏2🔥1
کانال آموزشی لاراول
Photo
تغییرات مسیریابی در لاراول 11 و مدیریت پیشوند
سلام دوستان 👋
امروز میخواهیم در مورد یکی از تغییرات مهم در لاراول 11 صحبت کنیم؛ یعنی نحوه مدیریت مسیریابی و پیشوند
🛠 حذف
در نسخههای قبلی لاراول، فایل
🧐 پیشوند
به صورت پیشفرض، وقتی شما از فایل
🔍 مثال:
فرض کنید در فایل
در این صورت، برای دسترسی به این مسیر باید از
✏️ تغییر یا حذف پیشوند
اگر میخواهید پیشوند
🔧 تنظیمات در bootstrap/app.php
با تنظیم apiPrefix به مقدار خالی ('')، دیگر مسیرهای API شما بدون پیشوند api/ خواهند بود. به این معنی که برای دسترسی به مسیر test فقط کافیست از http://127.0.0.1:8000/test استفاده کنید.
چرا
اگر این مسیر بدون پیشوند
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
api/سلام دوستان 👋
امروز میخواهیم در مورد یکی از تغییرات مهم در لاراول 11 صحبت کنیم؛ یعنی نحوه مدیریت مسیریابی و پیشوند
api/. این موضوع مخصوصاً برای کسانی که با نسخههای قبلی لاراول کار کردهاند، بسیار مهم است چون تغییرات عمدهای در ساختار مسیریابی لاراول 11 ایجاد شده است.🛠 حذف
RouteServiceProvider.phpدر نسخههای قبلی لاراول، فایل
RouteServiceProvider.php برای مدیریت مسیریابی و تنظیم پیشوندهایی مانند api/ استفاده میشد. اما در لاراول 11، این فایل حذف شده و مسئولیت تنظیمات مسیریابی به فایل bootstrap/app.php منتقل شده است.🧐 پیشوند
api/ از کجا میآید؟به صورت پیشفرض، وقتی شما از فایل
routes/api.php برای تعریف مسیرهای API استفاده میکنید، لاراول به طور خودکار پیشوند api/ را به این مسیرها اضافه میکند. این پیشوند از طریق تنظیمات در فایل bootstrap/app.php اعمال میشود.🔍 مثال:
فرض کنید در فایل
routes/api.php یک مسیر به نام test تعریف کردهاید:Route::get('test', function() {
return "Hi";
});در این صورت، برای دسترسی به این مسیر باید از
http://127.0.0.1:8000/api/test استفاده کنید.✏️ تغییر یا حذف پیشوند
api/اگر میخواهید پیشوند
api/ را تغییر دهید یا حذف کنید، باید به سراغ فایل bootstrap/app.php بروید و تنظیمات را به دلخواه خود تغییر دهید.🔧 تنظیمات در bootstrap/app.php
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
api: __DIR__.'/../routes/api.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
apiPrefix: '', // با تنظیم این مقدار به خالی، پیشوند /api حذف میشود
)
->create();
با تنظیم apiPrefix به مقدار خالی ('')، دیگر مسیرهای API شما بدون پیشوند api/ خواهند بود. به این معنی که برای دسترسی به مسیر test فقط کافیست از http://127.0.0.1:8000/test استفاده کنید.
چرا
http://127.0.0.1:8000/test خطای 404 میدهد؟اگر این مسیر بدون پیشوند
api/ خطای 404 میدهد، به این دلیل است که پیشوند api/ به صورت پیشفرض به مسیرهای API شما اضافه شده است. برای رفع این مشکل، باید یا پیشوند را حذف کنید یا مسیر را به همراه پیشوند درست وارد کنید.✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
👍15❤2🔥1
کانال آموزشی لاراول
Photo
🎓 Laravel Sail
امروز میخواهیم درباره یکی از ابزارهای مفید و کاربردی لاراول به نام Laravel Sail صحبت کنیم. این ابزار مخصوصاً برای توسعهدهندگانی طراحی شده که میخواهند محیط توسعه لاراول خود را با استفاده از Docker به سرعت و بدون پیچیدگی راهاندازی کنند. بیایید ببینیم Sail دقیقاً چه کار میکند و چرا ممکن است برای پروژههای شما مفید باشد.
🧐 اصلا Laravel Sail چیست؟
یک رابط خط فرمان سبک برای تعامل با محیط توسعه پیشفرض لاراول در Docker است. Sail به شما اجازه میدهد تا بدون نیاز به داشتن دانش عمیق از Docker، به راحتی یک محیط توسعه کامل برای پروژههای لاراول خود راهاندازی کنید. این محیط شامل سرویسهایی مثل PHP، MySQL، Redis و بسیاری دیگر است که برای توسعهی برنامههای لاراولی مورد نیاز هستند.
🔧 چطور کار میکند؟
در واقع Sail از طریق یک فایل
🎯 کاربرد Laravel Sail
- راهاندازی سریع محیط توسعه: Sail به شما این امکان را میدهد که با چند دستور ساده، یک محیط توسعه کامل راهاندازی کنید.
- استفاده در سیستمهای مختلف: Sail روی macOS، Linux و Windows (با WSL2) پشتیبانی میشود، بنابراین بدون نگرانی از سیستمعامل خود میتوانید از آن استفاده کنید.
- اجرای دستورات در محیط ایزوله: شما میتوانید دستورات مختلف PHP، Composer، Artisan و حتی Node.js را در داخل کانتینر Docker اجرا کنید، که به معنای ایزوله بودن محیط توسعه از سیستم اصلی شماست.
- مدیریت پایگاه دادهها: Sail به شما اجازه میدهد به سادگی با پایگاه دادههایی مثل MySQL و Redis در Docker تعامل داشته باشید، بدون اینکه نیاز به نصب مستقیم آنها روی سیستمتان داشته باشید.
🔍 چه زمانی از Sail استفاده کنیم؟
اگر میخواهید به سرعت و بدون درگیری با تنظیمات پیچیده Docker، یک محیط توسعه کامل برای پروژه لاراولی خود ایجاد کنید، Laravel Sail انتخاب بسیار خوبی است. این ابزار به خصوص برای تیمهایی که میخواهند یک محیط توسعه یکپارچه و مشترک داشته باشند، مفید است.
امیدوارم این درسگفتار به شما کمک کرده باشد تا بهتر درک کنید Laravel Sail چیست و چه کاربردهایی دارد! 🙂🫶
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
امروز میخواهیم درباره یکی از ابزارهای مفید و کاربردی لاراول به نام Laravel Sail صحبت کنیم. این ابزار مخصوصاً برای توسعهدهندگانی طراحی شده که میخواهند محیط توسعه لاراول خود را با استفاده از Docker به سرعت و بدون پیچیدگی راهاندازی کنند. بیایید ببینیم Sail دقیقاً چه کار میکند و چرا ممکن است برای پروژههای شما مفید باشد.
🧐 اصلا Laravel Sail چیست؟
یک رابط خط فرمان سبک برای تعامل با محیط توسعه پیشفرض لاراول در Docker است. Sail به شما اجازه میدهد تا بدون نیاز به داشتن دانش عمیق از Docker، به راحتی یک محیط توسعه کامل برای پروژههای لاراول خود راهاندازی کنید. این محیط شامل سرویسهایی مثل PHP، MySQL، Redis و بسیاری دیگر است که برای توسعهی برنامههای لاراولی مورد نیاز هستند.
🔧 چطور کار میکند؟
در واقع Sail از طریق یک فایل
docker-compose.yml در ریشه پروژه شما کار میکند. این فایل، سرویسهای مختلف مورد نیاز برای اجرای پروژه را تعریف میکند. سپس با استفاده از دستوراتی که از طریق CLI Sail فراهم میشوند، میتوانید این سرویسها را به راحتی مدیریت کنید.🎯 کاربرد Laravel Sail
- راهاندازی سریع محیط توسعه: Sail به شما این امکان را میدهد که با چند دستور ساده، یک محیط توسعه کامل راهاندازی کنید.
- استفاده در سیستمهای مختلف: Sail روی macOS، Linux و Windows (با WSL2) پشتیبانی میشود، بنابراین بدون نگرانی از سیستمعامل خود میتوانید از آن استفاده کنید.
- اجرای دستورات در محیط ایزوله: شما میتوانید دستورات مختلف PHP، Composer، Artisan و حتی Node.js را در داخل کانتینر Docker اجرا کنید، که به معنای ایزوله بودن محیط توسعه از سیستم اصلی شماست.
- مدیریت پایگاه دادهها: Sail به شما اجازه میدهد به سادگی با پایگاه دادههایی مثل MySQL و Redis در Docker تعامل داشته باشید، بدون اینکه نیاز به نصب مستقیم آنها روی سیستمتان داشته باشید.
🔍 چه زمانی از Sail استفاده کنیم؟
اگر میخواهید به سرعت و بدون درگیری با تنظیمات پیچیده Docker، یک محیط توسعه کامل برای پروژه لاراولی خود ایجاد کنید، Laravel Sail انتخاب بسیار خوبی است. این ابزار به خصوص برای تیمهایی که میخواهند یک محیط توسعه یکپارچه و مشترک داشته باشند، مفید است.
امیدوارم این درسگفتار به شما کمک کرده باشد تا بهتر درک کنید Laravel Sail چیست و چه کاربردهایی دارد! 🙂🫶
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
👍10❤2
کانال آموزشی لاراول
Photo
🎓 وظیفه و کاربرد
امروز میخواهیم درباره یکی از متدهای مفید در Livewire به نام
🔍 بررسی
متد
🔧 مثال:
فرض کنید شما یک فرم دارید که شامل فیلدهای
این متد به راحتی همه این خصوصیات را به یکباره مقداردهی میکند.
🎯 آیا فقط در متد
خیر،
- در متدهای دیگر کامپوننت: برای بهروزرسانی خصوصیات هنگام اجرای یک اکشن خاص.
- در متد
- در متدهای لایووایر دیگر: در هر جایی که نیاز به مقداردهی خصوصیات داشته باشید.
🎯 نتیجهگیری
متد
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
()this->fill$ در Livewireامروز میخواهیم درباره یکی از متدهای مفید در Livewire به نام
()this->fill$ صحبت کنیم. این متد یکی از ابزارهای کاربردی برای پر کردن (یا مقداردهی) چندین خصوصیت (property) در کامپوننتهای Livewire به طور همزمان است.🔍 بررسی
()this->fill$ متد
$()this->fill$ به شما این امکان را میدهد که یک آرایه از دادهها را به چندین خصوصیت کامپوننت Livewire به طور همزمان اختصاص دهید. این متد به ویژه زمانی مفید است که شما بخواهید چندین خصوصیت را به یکباره مقداردهی کنید، بدون اینکه نیاز به تعیین مقدار هر خصوصیت به صورت جداگانه داشته باشید.🔧 مثال:
فرض کنید شما یک فرم دارید که شامل فیلدهای
name، email و address است و میخواهید این فیلدها را از یک منبع داده (مثلاً یک درخواست HTTP) بهروز کنید. به جای اینکه هر خصوصیت را به صورت جداگانه مقداردهی کنید، میتوانید از ()this->fill$ استفاده کنید:$this->fill([
'name' => $data['name'],
'email' => $data['email'],
'address' => $data['address'],
]);
این متد به راحتی همه این خصوصیات را به یکباره مقداردهی میکند.
🎯 آیا فقط در متد
()mount استفاده میشود؟خیر،
()this->fill$ محدود به استفاده در متد ()mount نیست. شما میتوانید از این متد در هر کجای کامپوننت Livewire استفاده کنید، مانند:- در متدهای دیگر کامپوننت: برای بهروزرسانی خصوصیات هنگام اجرای یک اکشن خاص.
- در متد
update: برای بروزرسانی دادهها هنگام تعاملات کاربر.- در متدهای لایووایر دیگر: در هر جایی که نیاز به مقداردهی خصوصیات داشته باشید.
🎯 نتیجهگیری
متد
()this->fill$ یک ابزار قدرتمند و انعطافپذیر برای مقداردهی چندین خصوصیت در Livewire به طور همزمان است و میتواند در هر کجای کامپوننت مورد استفاده قرار گیرد. این متد به خصوص در مواردی که نیاز به مقداردهی سریع و همزمان چندین خصوصیت دارید، بسیار مفید است.✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
👍7🔥2
کانال آموزشی لاراول
Photo
✨ استفاده از متد
🤔 اکشنها در لایووایر چیست؟
در لایووایر (Livewire)، اکشنها به شما اجازه میدهند تا از طریق رویدادها (events) و دستورات (actions)، ارتباط موثری بین کامپوننتهای مختلف برقرار کنید. یکی از امکانات جدید و مفید در این زمینه استفاده از ویژگی
متد
⚙️ متد
زمانی که یک کامپوننت فرزند میخواهد مستقیماً به یک متد یا ویژگی در والد دسترسی پیدا کند، به جای استفاده از رویدادها (dispatching events)، میتوانید از
مثال:
فرض کنید کامپوننت والد متدی به نام
در این مثال، کامپوننت فرزند از طریق
🕰 کی از
- ارتباط مستقیم بین فرزند و والد: وقتی که نیاز دارید بهراحتی از فرزند به متدها و خواص والد دسترسی پیدا کنید.
- پیچیدگی کم: در سیستمهای ساده که استفاده از رویدادها باعث پیچیدگی بیمورد میشود.
- تعداد کم کامپوننتها: زمانی که تعداد کمی کامپوننت دارید و ارتباط بین آنها مستقیم است.
⛔️ زمانی که نباید از
- سیستمهای پیچیده: وقتی تعداد زیادی کامپوننت دارید و استفاده بیش از حد از
- ارتباطات غیرمستقیم: وقتی نیاز است دادهها بین کامپوننتهای متعدد و پیچیده جابهجا شوند، بهتر است از رویدادها (dispatching events) استفاده کنید.
🎯 رویدادها (Dispatching Events) چیست؟
در لایووایر، رویدادها به شما این امکان را میدهند که بدون وابستگی مستقیم، اطلاعات بین کامپوننتها را جابهجا کنید. در این روش، یک کامپوننت میتواند رویدادی ارسال کند و کامپوننتهای دیگر به آن گوش دهند.
مزایای استفاده از رویدادها:
1️⃣ استقلال کامپوننتها: هر کامپوننت میتواند به طور مستقل عمل کند.
2️⃣ قابلیت توسعه بالا: برای پروژههای بزرگتر مناسبتر است.
3️⃣ ارتباطات چندطرفه: رویدادها میتوانند به صورت چندگانه مدیریت شوند، یعنی یک رویداد میتواند توسط چندین کامپوننت شنیده شود.
مثال از رویدادها:
و در والد:
⚖️ تفاوت
parent$
- ارتباط مستقیم بین فرزند و والد.
- سریع و ساده برای سیستمهای کوچک.
- وابستگی زیاد بین کامپوننتها.
- مناسب برای سیستمهای ساده و ارتباطات کمپیچیدگی.
Dispatching Events
- ارتباط غیرمستقیم بین کامپوننتها.
- کاهش وابستگی بین آنها.
- مناسب برای سیستمهای پیچیده و بزرگ.
- مدیریت بهتر در پروژههای چندلایه و پیچیده.
⚜️در نهایت، انتخاب بین استفاده از
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
parent$ در لایووایر ۳🤔 اکشنها در لایووایر چیست؟
در لایووایر (Livewire)، اکشنها به شما اجازه میدهند تا از طریق رویدادها (events) و دستورات (actions)، ارتباط موثری بین کامپوننتهای مختلف برقرار کنید. یکی از امکانات جدید و مفید در این زمینه استفاده از ویژگی
parent$ است که در نسخه ۳ لایووایر معرفی شده است.متد
parent$ به شما این امکان را میدهد که از داخل یک کامپوننت فرزند، به متدها و خواص (properties) کامپوننت والد دسترسی پیدا کنید. این قابلیت زمانی مفید است که بخواهید از داخل فرزند، عملیاتی در والد اجرا کنید یا دادهای را به آن بفرستید بدون اینکه رویدادی ارسال کنید.⚙️ متد
parent$ چطور کار میکند؟زمانی که یک کامپوننت فرزند میخواهد مستقیماً به یک متد یا ویژگی در والد دسترسی پیدا کند، به جای استفاده از رویدادها (dispatching events)، میتوانید از
parent$ استفاده کنید. در واقع parent$ مستقیماً از درون الگوهای Blade استفاده میشود.مثال:
فرض کنید کامپوننت والد متدی به نام
()removePost دارد. شما میتوانید از داخل کامپوننت فرزند این متد را فراخوانی کنید:<button wire:click="$parent.removePost({{ $post->id }})">Remove</button>در این مثال، کامپوننت فرزند از طریق
parent$ متد ()removePost را در کامپوننت والد فراخوانی میکند و id پست را به آن ارسال میکند. این کار ساده و مستقیم است و به شما اجازه میدهد ارتباط مؤثری بین فرزند و والد برقرار کنید بدون نیاز به سیستم پیچیده رویدادها.🕰 کی از
parent$ استفاده کنیم؟- ارتباط مستقیم بین فرزند و والد: وقتی که نیاز دارید بهراحتی از فرزند به متدها و خواص والد دسترسی پیدا کنید.
- پیچیدگی کم: در سیستمهای ساده که استفاده از رویدادها باعث پیچیدگی بیمورد میشود.
- تعداد کم کامپوننتها: زمانی که تعداد کمی کامپوننت دارید و ارتباط بین آنها مستقیم است.
⛔️ زمانی که نباید از
parent$ استفاده کنید:- سیستمهای پیچیده: وقتی تعداد زیادی کامپوننت دارید و استفاده بیش از حد از
parent$ باعث وابستگی شدید بین کامپوننتها میشود.- ارتباطات غیرمستقیم: وقتی نیاز است دادهها بین کامپوننتهای متعدد و پیچیده جابهجا شوند، بهتر است از رویدادها (dispatching events) استفاده کنید.
🎯 رویدادها (Dispatching Events) چیست؟
در لایووایر، رویدادها به شما این امکان را میدهند که بدون وابستگی مستقیم، اطلاعات بین کامپوننتها را جابهجا کنید. در این روش، یک کامپوننت میتواند رویدادی ارسال کند و کامپوننتهای دیگر به آن گوش دهند.
مزایای استفاده از رویدادها:
1️⃣ استقلال کامپوننتها: هر کامپوننت میتواند به طور مستقل عمل کند.
2️⃣ قابلیت توسعه بالا: برای پروژههای بزرگتر مناسبتر است.
3️⃣ ارتباطات چندطرفه: رویدادها میتوانند به صورت چندگانه مدیریت شوند، یعنی یک رویداد میتواند توسط چندین کامپوننت شنیده شود.
مثال از رویدادها:
$this->dispatch('eventName', ['data' => $someData]);و در والد:
use Livewire\Attributes\On;
#[On('eventName')]
public function handleEvent($data)
{
// کاری که باید انجام شود
}
⚖️ تفاوت
parent$ و رویدادها (Dispatching Events)parent$
- ارتباط مستقیم بین فرزند و والد.
- سریع و ساده برای سیستمهای کوچک.
- وابستگی زیاد بین کامپوننتها.
- مناسب برای سیستمهای ساده و ارتباطات کمپیچیدگی.
Dispatching Events
- ارتباط غیرمستقیم بین کامپوننتها.
- کاهش وابستگی بین آنها.
- مناسب برای سیستمهای پیچیده و بزرگ.
- مدیریت بهتر در پروژههای چندلایه و پیچیده.
⚜️در نهایت، انتخاب بین استفاده از
parent$ و رویدادها (Dispatching Events) بستگی به نیاز پروژه دارد. برای ارتباطات ساده و مستقیم، parent$ مناسبتر است؛ اما برای پروژههای پیچیده و بزرگ، رویدادها استقلال بیشتری بین کامپوننتها فراهم میکنند و مدیریت بهتر را ممکن میسازند.✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
👍5💯2❤1🔥1
"فکر میکنی زمانی شروع میکنی که همه چیز کامل باشد، اما باور کن که چنین اتفاقی هیچوقت نخواهد افتاد. و حتی اگر هم بیافتد، آن زمان دیگر خیلی دیر شده است."
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
💯7👌2❤1👍1🔥1
کانال آموزشی لاراول
Photo
🔔نکات کلیدی درباره Livewire و امنیت دادهها
1️⃣ دیتای Public و امنیت آن
در Livewire، تمام ویژگیهای public موجود در کنترلر کامپوننت به یک آبجکت جاوااسکریپت تبدیل شده و به سمت کلاینت ارسال میشوند. یعنی هر کسی میتونه این دادهها رو از طریق DevTools یا ابزارهای مشابه مشاهده کنه.
راهکار:
- از گذاشتن اطلاعات حساس به صورت public خودداری کنید.
- اگر نیاز دارید که دادهای رو به کلاینت ارسال کنید، مطمئن باشید که حاوی اطلاعات حساس نیست.
- برای دادههای حساس از private یا protected استفاده کنید و از متدهای ایمن برای دسترسی به آنها بهره ببرید.
2️⃣ متدهای Public و قابلیت فراخوانی از سمت کلاینت
متدهای public در Livewire بهطور پیشفرض قابل فراخوانی از سمت کلاینت هستند. این متدها میتوانند مستقیماً در Template با دستورات مثل
راهکار:
- متدهای حساس رو public نکنید یا مطمئن شوید که فقط عملیات امن و ضروری در این متدها انجام میشود.
- از middleware و authorization مناسب برای متدهای public استفاده کنید تا دسترسیهای غیرمجاز محدود شوند.
3️⃣ خصوصیات محاسبهشده (Computed Properties)
متدهایی که با
مزیت:
- جلوگیری از دسترسی غیرمجاز به منطق داخلی کامپوننت.
- کاربران نمیتوانند این متدها را مستقیماً از طریق DevTools یا هر روش دیگری فراخوانی کنند، که این موضوع امنیت را افزایش میدهد.
4️⃣ خصوصیات قفلشده (Locked Properties)
با استفاده از
مزیت:
- جلوگیری از تغییرات غیرمجاز و افزایش امنیت دادهها.
- محافظت از دادههای حساس مانند شناسهها که نباید توسط کاربران تغییر پیدا کنند.
🛠قانون کلی:
- هر متغیری که شامل دادههای کلیدی یا حساس است، باید با
5️⃣ هیدراسیون (Hydration) برای اطمینان از همگامسازی دادهها
فرآیندی است Hydration که تضمین میکند دادهها در زمان اجرای مجدد کامپوننت همواره بهروز هستند و از دیتابیس تازهسازی میشوند. این فرآیند شامل چند مرحله است:
1. Hydration
- هنگام بارگذاری اولیه کامپوننت، وضعیت آن در سمت سرور ایجاد و سپس به صورت HTML به مرورگر ارسال میشود.
2. Dehydration
- قبل از ارسال به مرورگر، وضعیت کامپوننت به یک فرم سریالشده تبدیل میشود تا حجم دادهها کاهش یابد.
3. Rehydration
- هنگام وقوع یک تعامل (مثل کلیک یا تایپ) در سمت کاربر، وضعیت سریالشده به سرور ارسال میشود.
- در سرور، وضعیت مجدداً به یک شیء کامپوننت تبدیل شده و تغییرات اعمال میشود.
- سپس پاسخ به مرورگر برمیگردد و وضعیت کامپوننت بهروز میشود.
مزیت:
- تجربه کاربری روان و دادههای دقیق و بهروز.
- امکان مدیریت تعاملات پویا و بهروزرسانیهای بلادرنگ بدون نیاز به بارگذاری مجدد صفحه.
راهکار:
- از متد
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
1️⃣ دیتای Public و امنیت آن
در Livewire، تمام ویژگیهای public موجود در کنترلر کامپوننت به یک آبجکت جاوااسکریپت تبدیل شده و به سمت کلاینت ارسال میشوند. یعنی هر کسی میتونه این دادهها رو از طریق DevTools یا ابزارهای مشابه مشاهده کنه.
راهکار:
- از گذاشتن اطلاعات حساس به صورت public خودداری کنید.
- اگر نیاز دارید که دادهای رو به کلاینت ارسال کنید، مطمئن باشید که حاوی اطلاعات حساس نیست.
- برای دادههای حساس از private یا protected استفاده کنید و از متدهای ایمن برای دسترسی به آنها بهره ببرید.
2️⃣ متدهای Public و قابلیت فراخوانی از سمت کلاینت
متدهای public در Livewire بهطور پیشفرض قابل فراخوانی از سمت کلاینت هستند. این متدها میتوانند مستقیماً در Template با دستورات مثل
wire:click، wire:submit و غیره استفاده شوند. این یعنی کاربران میتوانند این متدها رو از طریق DevTools یا جاوااسکریپت صدا بزنند.راهکار:
- متدهای حساس رو public نکنید یا مطمئن شوید که فقط عملیات امن و ضروری در این متدها انجام میشود.
- از middleware و authorization مناسب برای متدهای public استفاده کنید تا دسترسیهای غیرمجاز محدود شوند.
3️⃣ خصوصیات محاسبهشده (Computed Properties)
متدهایی که با
[Computed]# تعریف میشوند، حتی اگر public باشند، از سمت کلاینت به عنوان اکشن قابل فراخوانی نیستند. این متدها به عنوان خصوصیات محاسبهشده عمل میکنند و امنیت بهتری را فراهم میکنند. مزیت:
- جلوگیری از دسترسی غیرمجاز به منطق داخلی کامپوننت.
- کاربران نمیتوانند این متدها را مستقیماً از طریق DevTools یا هر روش دیگری فراخوانی کنند، که این موضوع امنیت را افزایش میدهد.
4️⃣ خصوصیات قفلشده (Locked Properties)
با استفاده از
[Locked]# میتوانید متغیرهای حساس را قفل کنید تا کاربران نتونن اونها را از سمت کلاینت تغییر بدن. این ویژگی برای محافظت از دادههای کلیدی مثل شناسهها (IDs) بسیار مفید است. مزیت:
- جلوگیری از تغییرات غیرمجاز و افزایش امنیت دادهها.
- محافظت از دادههای حساس مانند شناسهها که نباید توسط کاربران تغییر پیدا کنند.
🛠قانون کلی:
- هر متغیری که شامل دادههای کلیدی یا حساس است، باید با
[Locked]# مشخص شود تا از تغییر غیرمجاز جلوگیری شود.5️⃣ هیدراسیون (Hydration) برای اطمینان از همگامسازی دادهها
فرآیندی است Hydration که تضمین میکند دادهها در زمان اجرای مجدد کامپوننت همواره بهروز هستند و از دیتابیس تازهسازی میشوند. این فرآیند شامل چند مرحله است:
1. Hydration
- هنگام بارگذاری اولیه کامپوننت، وضعیت آن در سمت سرور ایجاد و سپس به صورت HTML به مرورگر ارسال میشود.
2. Dehydration
- قبل از ارسال به مرورگر، وضعیت کامپوننت به یک فرم سریالشده تبدیل میشود تا حجم دادهها کاهش یابد.
3. Rehydration
- هنگام وقوع یک تعامل (مثل کلیک یا تایپ) در سمت کاربر، وضعیت سریالشده به سرور ارسال میشود.
- در سرور، وضعیت مجدداً به یک شیء کامپوننت تبدیل شده و تغییرات اعمال میشود.
- سپس پاسخ به مرورگر برمیگردد و وضعیت کامپوننت بهروز میشود.
مزیت:
- تجربه کاربری روان و دادههای دقیق و بهروز.
- امکان مدیریت تعاملات پویا و بهروزرسانیهای بلادرنگ بدون نیاز به بارگذاری مجدد صفحه.
راهکار:
- از متد
()hydrate برای همگامسازی مجدد دادهها استفاده کنید تا از بروز تناقضات دادهای جلوگیری شود.✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
👍9❤3🔥1
کانال آموزشی لاراول pinned «🔔نکات کلیدی درباره Livewire و امنیت دادهها 1️⃣ دیتای Public و امنیت آن در Livewire، تمام ویژگیهای public موجود در کنترلر کامپوننت به یک آبجکت جاوااسکریپت تبدیل شده و به سمت کلاینت ارسال میشوند. یعنی هر کسی میتونه این دادهها رو از طریق DevTools یا…»
گاهی حس میکنم ریفکتور کردن کدها شده بخشی از DNA من! یهو میزنم زیر codebase و شروع میکنم به بهینهسازی یا سبکتر کردن کدها. تو هم این حس رو داری که کد رو هی دستکاری کنی، یا وقتی کار میکنه، میگی دیگه چه کاریه؟
Anonymous Poll
60%
اصلا تا دلت بخواد، دیوانه وار
40%
نه بابا ! کار میکنه دیگه انگول چی آخه
👍1🔥1
کانال آموزشی لاراول pinned «گاهی حس میکنم ریفکتور کردن کدها شده بخشی از DNA من! یهو میزنم زیر codebase و شروع میکنم به بهینهسازی یا سبکتر کردن کدها. تو هم این حس رو داری که کد رو هی دستکاری کنی، یا وقتی کار میکنه، میگی دیگه چه کاریه؟»
"In der Ruhe liegt die Kraft."
آلمانی ها میگن : قدرت در آرامش نهفته است.
با یه برداشت آزاد ازین ضرب المثل داشتم به این فکر میکردم که تفاوت بین یه سینیور و جونیور دقیقا همینجاست، فارغ از تجربه کاری.
ازین آرامشی میاد که تسلط به خودش داره.
یعنی شاید لزوما هم در اون مورد خاص هم جوابی نداشته باشه ها در لحظه !
ولی اون دل ناآرام جونیور عاملی میشه برای دست و پا زدن های بی دلیل خودش که در نهایت فروتر میره !
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
آلمانی ها میگن : قدرت در آرامش نهفته است.
با یه برداشت آزاد ازین ضرب المثل داشتم به این فکر میکردم که تفاوت بین یه سینیور و جونیور دقیقا همینجاست، فارغ از تجربه کاری.
ازین آرامشی میاد که تسلط به خودش داره.
یعنی شاید لزوما هم در اون مورد خاص هم جوابی نداشته باشه ها در لحظه !
ولی اون دل ناآرام جونیور عاملی میشه برای دست و پا زدن های بی دلیل خودش که در نهایت فروتر میره !
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
👏11👍7❤1🔥1
کانال آموزشی لاراول
Photo
✨انقلابی در استقرار برنامههای لاراول Laravel Cloud در لاراول ۱۲
یک سرویس ابری جدید است که همراه با نسخه ۱۲ لاراول معرفی شده است. هدف آن سادهسازی استقرار (Deployment) و مدیریت برنامههای لاراول در فضای ابری است، بدون نیاز به تنظیمات پیچیده یا دانش DevOps
در این درسگفتار، با مفهوم Laravel Cloud، نحوهی عملکرد آن، مزایای کلیدی و میزان نیاز به دانش DevOps آشنا خواهیم شد.
🔸بخش اول: Laravel Cloud چیست و چه کاربردی دارد؟
یک پلتفرم کاملاً مدیریتشده برای میزبانی و اجرای پروژههای لاراول است. این سرویس توسط تیم لاراول ساخته شده و تمام نیازهای زیرساختی برنامههای Laravel را خودکارسازی میکند. شما فقط کد خود را روی یک مخزن گیت (Git) قرار میدهید، و Laravel Cloud آن را بهطور خودکار اجرا و مدیریت میکند.
کاربردهای Laravel Cloud:
1️⃣ استقرار سریع و بدون دردسر → بدون نیاز به تنظیم سرور یا پیکربندیهای خاص.
2️⃣ مدیریت ساده → پایگاهداده، کش (Redis)، ذخیرهسازی فایل و سایر خدمات از قبل تنظیم شدهاند.
3️⃣ مقیاسبندی خودکار → در صورت افزایش ترافیک، منابع سرور بهطور خودکار افزایش مییابند.
4️⃣ امنیت و پایداری بالا → شامل گواهی SSL، فایروال و محافظت در برابر حملات DDoS.
5️⃣ دیپلوی بدون قطعی → تغییرات جدید بدون توقف سرویس اعمال میشوند.
🔹چرا مهم است؟ Laravel Cloud نیاز به مدیریت دستی سرور و تنظیمات پیچیده را از بین میبرد و به شما اجازه میدهد روی توسعهی نرمافزار تمرکز کنید.
🔸بخش دوم: Laravel Cloud چگونه کار میکند؟
بر اساس مدل پلتفرم به عنوان سرویس (PaaS) کار میکند. روند کلی استفاده از آن به این صورت است:
1️⃣ مخزن گیت پروژهی خود را متصل کنید → Laravel Cloud بهطور خودکار کد را دریافت میکند.
2️⃣ ساخت و اجرای خودکار برنامه → بدون نیاز به کانفیگ سرور، برنامهی شما روی ابر اجرا میشود.
3️⃣ مدیریت خودکار منابع → پایگاهداده، کش، ذخیرهسازی و سایر منابع بهصورت خودکار تنظیم میشوند.
4️⃣ مقیاسبندی هوشمند → با افزایش ترافیک، سیستم بهطور خودکار سرورهای بیشتری اضافه میکند.
5️⃣ مانیتورینگ و پشتیبانگیری خودکار → شما میتوانید مصرف منابع و لاگهای برنامه را مشاهده و تحلیل کنید.
🔹 ویژگی مهم: دیگر نیازی به دستوپنجه نرم کردن با تنظیمات Nginx، PHP-FPM، یا سرورهای اختصاصی ندارید!
🔸بخش سوم: مزایای Laravel Cloud برای توسعهدهندگان
ویژگیهای متعددی را در اختیار توسعهدهندگان قرار میدهد که آن را از سایر روشهای استقرار متمایز میکند:
1️⃣ استقرار آسان و سریع
- دیگر نیازی به کانفیگ پیچیدهی سرور، SSH، یا Docker ندارید.
- کافی است کد خود را Push کنید و Laravel Cloud بهطور خودکار آن را اجرا میکند.
2️⃣ مدیریت پایگاهداده و کش
- پایگاهداده MySQL و PostgreSQL بهطور مستقیم در سرویس وجود دارد.
- ردیس Redis برای کش و S3 برای ذخیرهسازی فایل از پیش پیکربندی شدهاند.
3️⃣ امنیت و مقیاسپذیری
- ترافیک سایت شما از طریق Cloudflare محافظت میشود.
- حملات DDoS و درخواستهای مخرب مسدود میشوند.
- برنامه شما میتواند خودکار مقیاسبندی شود و در برابر افزایش ناگهانی ترافیک مقاوم باشد.
4️⃣ مانیتورینگ و اشکالزدایی ساده
- یک داشبورد برای مشاهده مصرف CPU، حافظه، لاگها و میزان درخواستهای ورودی ارائه شده است.
- امکان مشاهده و جستجو در لاگهای برنامه برای رفع سریع خطاها.
5️⃣ همکاری تیمی
- شما میتوانید اعضای تیم خود را اضافه کنید و دسترسیهای مختلفی به آنها بدهید.
🔹 نتیجه: Laravel Cloud یک راهکار سریع، ایمن، و بدون دردسر برای استقرار برنامههای لاراول است.
🔸بخش چهارم: آیا برای استفاده از Laravel Cloud نیاز به دانش DevOps است؟
خیر! Laravel Cloud بهگونهای طراحی شده است که تمام کارهای DevOps را خودکار انجام دهد. این سرویس تمام مراحل مدیریت سرور، بهینهسازی، مقیاسبندی، امنیت و پشتیبانگیری را برای شما انجام میدهد.
با این حال، آشنایی با مفاهیم زیر میتواند به شما کمک کند:
- استفاده از Git برای مدیریت کدها.
- آشنایی با متغیرهای محیطی (Environment Variables).
- درک مفاهیم استقرار و مدیریت پایگاهداده.
🔹 نتیجه: شما نیازی به دانش DevOps ندارید و میتوانید مستقیماً از Laravel Cloud برای اجرای پروژههای خود استفاده کنید.
🔹مزایای اصلی Laravel Cloud:
✅ استقرار سریع و خودکار
✅ پشتیبانی از پایگاهداده، کش و ذخیرهسازی
✅ مقیاسپذیری هوشمند و امنیت بالا
✅ دیپلوی بدون قطعی و پشتیبانگیری خودکار
✅ بدون نیاز به دانش DevOps
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
یک سرویس ابری جدید است که همراه با نسخه ۱۲ لاراول معرفی شده است. هدف آن سادهسازی استقرار (Deployment) و مدیریت برنامههای لاراول در فضای ابری است، بدون نیاز به تنظیمات پیچیده یا دانش DevOps
در این درسگفتار، با مفهوم Laravel Cloud، نحوهی عملکرد آن، مزایای کلیدی و میزان نیاز به دانش DevOps آشنا خواهیم شد.
🔸بخش اول: Laravel Cloud چیست و چه کاربردی دارد؟
یک پلتفرم کاملاً مدیریتشده برای میزبانی و اجرای پروژههای لاراول است. این سرویس توسط تیم لاراول ساخته شده و تمام نیازهای زیرساختی برنامههای Laravel را خودکارسازی میکند. شما فقط کد خود را روی یک مخزن گیت (Git) قرار میدهید، و Laravel Cloud آن را بهطور خودکار اجرا و مدیریت میکند.
کاربردهای Laravel Cloud:
1️⃣ استقرار سریع و بدون دردسر → بدون نیاز به تنظیم سرور یا پیکربندیهای خاص.
2️⃣ مدیریت ساده → پایگاهداده، کش (Redis)، ذخیرهسازی فایل و سایر خدمات از قبل تنظیم شدهاند.
3️⃣ مقیاسبندی خودکار → در صورت افزایش ترافیک، منابع سرور بهطور خودکار افزایش مییابند.
4️⃣ امنیت و پایداری بالا → شامل گواهی SSL، فایروال و محافظت در برابر حملات DDoS.
5️⃣ دیپلوی بدون قطعی → تغییرات جدید بدون توقف سرویس اعمال میشوند.
🔹چرا مهم است؟ Laravel Cloud نیاز به مدیریت دستی سرور و تنظیمات پیچیده را از بین میبرد و به شما اجازه میدهد روی توسعهی نرمافزار تمرکز کنید.
🔸بخش دوم: Laravel Cloud چگونه کار میکند؟
بر اساس مدل پلتفرم به عنوان سرویس (PaaS) کار میکند. روند کلی استفاده از آن به این صورت است:
1️⃣ مخزن گیت پروژهی خود را متصل کنید → Laravel Cloud بهطور خودکار کد را دریافت میکند.
2️⃣ ساخت و اجرای خودکار برنامه → بدون نیاز به کانفیگ سرور، برنامهی شما روی ابر اجرا میشود.
3️⃣ مدیریت خودکار منابع → پایگاهداده، کش، ذخیرهسازی و سایر منابع بهصورت خودکار تنظیم میشوند.
4️⃣ مقیاسبندی هوشمند → با افزایش ترافیک، سیستم بهطور خودکار سرورهای بیشتری اضافه میکند.
5️⃣ مانیتورینگ و پشتیبانگیری خودکار → شما میتوانید مصرف منابع و لاگهای برنامه را مشاهده و تحلیل کنید.
🔹 ویژگی مهم: دیگر نیازی به دستوپنجه نرم کردن با تنظیمات Nginx، PHP-FPM، یا سرورهای اختصاصی ندارید!
🔸بخش سوم: مزایای Laravel Cloud برای توسعهدهندگان
ویژگیهای متعددی را در اختیار توسعهدهندگان قرار میدهد که آن را از سایر روشهای استقرار متمایز میکند:
1️⃣ استقرار آسان و سریع
- دیگر نیازی به کانفیگ پیچیدهی سرور، SSH، یا Docker ندارید.
- کافی است کد خود را Push کنید و Laravel Cloud بهطور خودکار آن را اجرا میکند.
2️⃣ مدیریت پایگاهداده و کش
- پایگاهداده MySQL و PostgreSQL بهطور مستقیم در سرویس وجود دارد.
- ردیس Redis برای کش و S3 برای ذخیرهسازی فایل از پیش پیکربندی شدهاند.
3️⃣ امنیت و مقیاسپذیری
- ترافیک سایت شما از طریق Cloudflare محافظت میشود.
- حملات DDoS و درخواستهای مخرب مسدود میشوند.
- برنامه شما میتواند خودکار مقیاسبندی شود و در برابر افزایش ناگهانی ترافیک مقاوم باشد.
4️⃣ مانیتورینگ و اشکالزدایی ساده
- یک داشبورد برای مشاهده مصرف CPU، حافظه، لاگها و میزان درخواستهای ورودی ارائه شده است.
- امکان مشاهده و جستجو در لاگهای برنامه برای رفع سریع خطاها.
5️⃣ همکاری تیمی
- شما میتوانید اعضای تیم خود را اضافه کنید و دسترسیهای مختلفی به آنها بدهید.
🔹 نتیجه: Laravel Cloud یک راهکار سریع، ایمن، و بدون دردسر برای استقرار برنامههای لاراول است.
🔸بخش چهارم: آیا برای استفاده از Laravel Cloud نیاز به دانش DevOps است؟
خیر! Laravel Cloud بهگونهای طراحی شده است که تمام کارهای DevOps را خودکار انجام دهد. این سرویس تمام مراحل مدیریت سرور، بهینهسازی، مقیاسبندی، امنیت و پشتیبانگیری را برای شما انجام میدهد.
با این حال، آشنایی با مفاهیم زیر میتواند به شما کمک کند:
- استفاده از Git برای مدیریت کدها.
- آشنایی با متغیرهای محیطی (Environment Variables).
- درک مفاهیم استقرار و مدیریت پایگاهداده.
🔹 نتیجه: شما نیازی به دانش DevOps ندارید و میتوانید مستقیماً از Laravel Cloud برای اجرای پروژههای خود استفاده کنید.
🔹مزایای اصلی Laravel Cloud:
✅ استقرار سریع و خودکار
✅ پشتیبانی از پایگاهداده، کش و ذخیرهسازی
✅ مقیاسپذیری هوشمند و امنیت بالا
✅ دیپلوی بدون قطعی و پشتیبانگیری خودکار
✅ بدون نیاز به دانش DevOps
✅ کانال تخصصی لاراول
📌 @PapiDon_state
☕️ اتاق برنامهنویسی
📌 @PapiDon_coding
👏9👍6❤2🔥2❤🔥1🤩1
کانال آموزشی لاراول pinned «✨انقلابی در استقرار برنامههای لاراول Laravel Cloud در لاراول ۱۲ یک سرویس ابری جدید است که همراه با نسخه ۱۲ لاراول معرفی شده است. هدف آن سادهسازی استقرار (Deployment) و مدیریت برنامههای لاراول در فضای ابری است، بدون نیاز به تنظیمات پیچیده یا دانش DevOps…»