Crazy Dev ❤️🔥💻 pinned «توصیه هایی به برنامه نویسان تازه کار بیش از 20 سال در حوزه برنامه نویسی بودم. امروز میخام چند توصیه به جونیورها کنم که اگر جدی بگیرند مسیر هموار تری در رسیدن به اهدافشون خواهند داشت: ۱. قرار نیست تو شش ماه به یک برنامهنویس حرفهای تبدیل بشید. یادگیری برنامهنویسی…»
Laravel DB::listen(...)
https://www.linkedin.com/posts/povilas-korop-laravel-developer_laravel-tip-dblisten-hooks-into-every-share-7480195268878057472-do-U
DB::listen() hooks into every SQL query Laravel executes and provides the SQL, bindings, and execution time. Register one listener in a service provider to log slow queries or investigate N+1 problems across the application.https://www.linkedin.com/posts/povilas-korop-laravel-developer_laravel-tip-dblisten-hooks-into-every-share-7480195268878057472-do-U
❤1
Forwarded from | کانال توسعهدهندگان لاراول |
Repository Pattern در پروژههای لاراول 🧱
یکی از چیزهایی که پروژههای لاراول بزرگ را قابلنگهداریتر میکند، جدا کردن منطق دسترسی به دیتابیس از باقی لایههاست. اینجاست که Repository Pattern خیلی کمک میکند.
ایده ساده است: بهجای اینکه کنترلر مستقیم با
۱) تعریف Interface برای Repository
۲) پیادهسازی با Eloquent
۳) Bind کردن در Service Container لاراول
این کار را معمولاً در
حالا هرجا
۴) استفاده در Controller تمیزتر
حالا کنترلر فقط روی flow و پاسخ تمرکز دارد، نه روی جزئیات کوئریها. این کار:
• تستنویسی را سادهتر میکند (میتوان Mock از Repository ساخت) ✅
• وابستگی به Eloquent را از سطح کنترلر کم میکند ✅
• تغییرات دیتابیس یا اضافهکردن لایه cache را راحتتر میکند ✅
برای مطالعه عمیقتر، مستندات Service Container لاراول را ببینید:
https://laravel.com/docs/container
کمکم که پروژه بزرگتر میشود، استفاده درست از Repository Pattern میتواند ساختار کد را منظمتر، testableتر و قابلگسترشتر کند. از قدمهای کوچک شروع شود؛ مثلاً از ماژول User یا Order و بعد سایر بخشها را به این الگو مهاجرت بدهید. 🚀
🔖 #Laravel #PHP #لاراول #Laravel #Repository_Pattern #Clean_Code #Service_Container #PHP #Architecture
👤 Developix
💎 Channel: @DevelopixLaravel
یکی از چیزهایی که پروژههای لاراول بزرگ را قابلنگهداریتر میکند، جدا کردن منطق دسترسی به دیتابیس از باقی لایههاست. اینجاست که Repository Pattern خیلی کمک میکند.
ایده ساده است: بهجای اینکه کنترلر مستقیم با
Model و کوئریها درگیر شود، با یک اینترفیس صحبت میکند. پشت این اینترفیس هر وقت خواستیم میتوانیم Eloquent را عوض کنیم، کش اضافه کنیم یا منبع داده را تغییر بدهیم، بدون اینکه کنترلر بشکند. 🔧۱) تعریف Interface برای Repository
<?php
namespace App\Repositories;
interface UserRepositoryInterface
{
public function paginate(int $perPage = 15);
public function findById(int $id);
public function create(array $data);
}
۲) پیادهسازی با Eloquent
<?php
namespace App\Repositories;
use App\Models\User;
class EloquentUserRepository implements UserRepositoryInterface
{
public function paginate(int $perPage = 15)
{
return User::query()->latest()->paginate($perPage);
}
public function findById(int $id)
{
return User::query()->findOrFail($id);
}
public function create(array $data)
{
return User::query()->create($data);
}
}
۳) Bind کردن در Service Container لاراول
این کار را معمولاً در
AppServiceProvider انجام میدهیم:<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Repositories\UserRepositoryInterface;
use App\Repositories\EloquentUserRepository;
class AppServiceProvider extends ServiceProvider
{
public function register(): void
{
$this->app->bind(UserRepositoryInterface::class, EloquentUserRepository::class);
}
}
حالا هرجا
UserRepositoryInterface را type-hint کنیم، بهطور خودکار EloquentUserRepository تزریق میشود. این همان قدرت Dependency Injection در لاراول است. ⚡️۴) استفاده در Controller تمیزتر
<?php
namespace App\Http\Controllers;
use App\Repositories\UserRepositoryInterface;
use App\Http\Requests\StoreUserRequest;
class UserController extends Controller
{
public function __construct(
private readonly UserRepositoryInterface $users
) {}
public function index()
{
$users = $this->users->paginate(20);
return view('users.index', compact('users'));
}
public function store(StoreUserRequest $request)
{
$this->users->create($request->validated());
return redirect()->route('users.index');
}
}
حالا کنترلر فقط روی flow و پاسخ تمرکز دارد، نه روی جزئیات کوئریها. این کار:
• تستنویسی را سادهتر میکند (میتوان Mock از Repository ساخت) ✅
• وابستگی به Eloquent را از سطح کنترلر کم میکند ✅
• تغییرات دیتابیس یا اضافهکردن لایه cache را راحتتر میکند ✅
برای مطالعه عمیقتر، مستندات Service Container لاراول را ببینید:
https://laravel.com/docs/container
کمکم که پروژه بزرگتر میشود، استفاده درست از Repository Pattern میتواند ساختار کد را منظمتر، testableتر و قابلگسترشتر کند. از قدمهای کوچک شروع شود؛ مثلاً از ماژول User یا Order و بعد سایر بخشها را به این الگو مهاجرت بدهید. 🚀
🔖 #Laravel #PHP #لاراول #Laravel #Repository_Pattern #Clean_Code #Service_Container #PHP #Architecture
👤 Developix
💎 Channel: @DevelopixLaravel
اگه تا الان ابزار Git رو یادنگرفتین یا آموزش خوبی براش ندیدین،
سایت GitByBit با هدف آموزش Hands-On مشکلتون رو حل میکنه.
حتی اگه گیت هم بلدین یه نگاه به سایتش بکنین. اینقدر این سایت رو جذاب ساخته آقای الکساندر شوتس که میتونی از نگاه کردن به لندینگ پیج سایت بسیار لذت ببری :)
بماند که چند سال طول کشیده بسازتش (پروژه بزرگی هست، بخشهای بسیار زیاد و هماهنگی خیلی زیادی با ابزارهای متنوع داره) ولی یادآور بسیار خوبیه که برای خلق یک محتوای خوب، هر چقدر هم که ابزار حرفهای در اختیار داشته باشی، "زمان" همچنان مهمترین فاکتوره. البته اینم بگم که ایشون دفعه اولشون نیست چنین سایت های آموزشی برای مطالب پیچیده میسازن.
#Git
#Github
#Learn
#AlexanderShvets
GitByBit https://gitbybit.com
@crzy_dev
Resource:
https://www.linkedin.com/posts/reza-shahmoradi-3332a21aa_aexaezaeqaepaezaevabraewahy-share-7481758349378711552-UdbI
سایت GitByBit با هدف آموزش Hands-On مشکلتون رو حل میکنه.
حتی اگه گیت هم بلدین یه نگاه به سایتش بکنین. اینقدر این سایت رو جذاب ساخته آقای الکساندر شوتس که میتونی از نگاه کردن به لندینگ پیج سایت بسیار لذت ببری :)
بماند که چند سال طول کشیده بسازتش (پروژه بزرگی هست، بخشهای بسیار زیاد و هماهنگی خیلی زیادی با ابزارهای متنوع داره) ولی یادآور بسیار خوبیه که برای خلق یک محتوای خوب، هر چقدر هم که ابزار حرفهای در اختیار داشته باشی، "زمان" همچنان مهمترین فاکتوره. البته اینم بگم که ایشون دفعه اولشون نیست چنین سایت های آموزشی برای مطالب پیچیده میسازن.
#Git
#Github
#Learn
#AlexanderShvets
GitByBit https://gitbybit.com
@crzy_dev
Resource:
https://www.linkedin.com/posts/reza-shahmoradi-3332a21aa_aexaezaeqaepaezaevabraewahy-share-7481758349378711552-UdbI
❤2
Forwarded from Tech Stuff
هدر Content Security Policy
این هدر مشخص میکنه مرورگر اجازه داره فایلهای جاوااسکریپت، CSS، تصویر و بقیه منابع رو از چه جاهایی بارگذاری کنه. این کار باعث میشه حتی اگه یه مهاجم موفق بشه کد مخرب رو مثلا از طریق XSS داخل صفحه inject کنه، مرورگر در خیلی از مواقع اجازه اجرای اون کد رو نده.
برای فعال کردنش کافیه هدر CSP رو توی responseهای HTTP قرار بدید و مشخص کنید هر نوع منبع از کجا مجازه لود بشه. مثال (1)، قانون اول (default-src 'self') میگه به طور پیشفرض همه منابع فقط از همون دامنهای که خود سایت روی اون اجرا شده (same origin) بارگذاری بشن، مگر اینکه برای نوع خاصی از منابع قانون جداگانهای تعریف شده باشه. قانون دوم (script-src) میگه اسکریپتها فقط از همون دامنه سایت ('self') یا از https://cdn.example.com مجاز به بارگذاری هستن.
فرض کنید سایت شما از https://cdn.example.com برای فایلهای جاوااسکریپت استفاده میکنه. اگر مهاجم بتونه کد (2) رو داخل صفحه تزریق کنه، مرورگر قبل از دانلود فایل، CSP رو بررسی میکنه. چون evil.com داخل script-src قرار نداره، درخواست رو بلاک میکنه و اسکریپت اجرا نمیشه(3).
@techstuff100
این هدر مشخص میکنه مرورگر اجازه داره فایلهای جاوااسکریپت، CSS، تصویر و بقیه منابع رو از چه جاهایی بارگذاری کنه. این کار باعث میشه حتی اگه یه مهاجم موفق بشه کد مخرب رو مثلا از طریق XSS داخل صفحه inject کنه، مرورگر در خیلی از مواقع اجازه اجرای اون کد رو نده.
برای فعال کردنش کافیه هدر CSP رو توی responseهای HTTP قرار بدید و مشخص کنید هر نوع منبع از کجا مجازه لود بشه. مثال (1)، قانون اول (default-src 'self') میگه به طور پیشفرض همه منابع فقط از همون دامنهای که خود سایت روی اون اجرا شده (same origin) بارگذاری بشن، مگر اینکه برای نوع خاصی از منابع قانون جداگانهای تعریف شده باشه. قانون دوم (script-src) میگه اسکریپتها فقط از همون دامنه سایت ('self') یا از https://cdn.example.com مجاز به بارگذاری هستن.
فرض کنید سایت شما از https://cdn.example.com برای فایلهای جاوااسکریپت استفاده میکنه. اگر مهاجم بتونه کد (2) رو داخل صفحه تزریق کنه، مرورگر قبل از دانلود فایل، CSP رو بررسی میکنه. چون evil.com داخل script-src قرار نداره، درخواست رو بلاک میکنه و اسکریپت اجرا نمیشه(3).
@techstuff100
❤1