کانال آموزشی لاراول
3.06K subscribers
120 photos
4 videos
38 links
📌 کانال اتاق برنامه نویسی
@PapiDon_coding
Download Telegram
کانال آموزشی لاراول
Photo
📚 احراز هویت در Laravel Sanctum

در توسعه API با لاراول، نیاز داریم تا کاربران را احراز هویت (Authentication) کنیم تا فقط کاربران مجاز به برخی بخش‌های سیستم دسترسی داشته باشند. یکی از روش‌های محبوب برای این کار، استفاده از Laravel Sanctum است که با تولید توکن‌های منحصربه‌فرد این کار را انجام می‌دهد.

در این درس، با فرآیند ثبت‌نام، ورود، خروج، و نحوه کارکرد Bearer Token در Sanctum آشنا می‌شویم.

1️⃣ ثبت‌نام و دریافت توکن (Register)

🔹 وقتی کاربر ثبت‌نام می‌کند، پس از ایجاد حساب، به او یک توکن احراز هویت داده می‌شود. این توکن را باید در درخواست‌های بعدی ارسال کند تا سیستم بتواند او را شناسایی کند.

🔹 مثال کد در لاراول:

public function register(Request $request)
{
$fields = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:8|confirmed',
]);

$user = User::create([
'name' => $fields['name'],
'email' => $fields['email'],
'password' => Hash::make($fields['password']),
]);

$token = $user->createToken($user->name);

return [
'user' => $user,
'token' => $token->plainTextToken,
];
}


🔹 چرا createToken اینجا استفاده شده؟

چون بعد از ثبت‌نام، باید یک توکن برای کاربر صادر کنیم تا بلافاصله بتواند از API استفاده کند.

2️⃣ ورود و دریافت توکن جدید (Login)

🔹 وقتی کاربر وارد سیستممی‌شود، سیستم ایمیل و رمز عبور او را بررسی می‌کند. اگر اطلاعات صحیح بود، یک توکن جدید برای او صادر می‌شود.

🔹 مثال کد در لاراول:

public function login(Request $request)
{
$fields = $request->validate([
'email' => 'required|string|email|max:255|exists:users',
'password' => 'required|string|min:8',
]);

$user = User::where('email', $fields['email'])->first();

if (!$user || !Hash::check($fields['password'], $user->password)) {
return response([
'message' => 'Invalid credentials',
], 401);
}

$token = $user->createToken($user->name);

return [
'user' => $user,
'token' => $token->plainTextToken,
];
}


🔹 چرا باز هم createToken داریم؟

چون هر بار که کاربر وارد سیستم می‌شود، یک توکن جدید برای او صادر می‌کنیم تا در درخواست‌های بعدی از آن استفاده کند.


3️⃣ احراز هویت و ارسال توکن در درخواست‌ها

🔹 بعد از ورود موفق، کاربر باید توکن خود را در هدر درخواست‌ها بفرستد تا بتواند از API استفاده کند.

🔹 مثال درخواست به یک مسیر محافظت‌شده:

GET /api/user
Authorization: Bearer your_token_here


🔹 و اما Bearer Token چیست؟

- این توکن مانند یک کارت عضویت است که نشان می‌دهد کاربر وارد سیستم شده است.
- اگر این کارت نداشته باشد، اجازه دسترسی به بخش‌های محافظت‌شده API را نخواهد داشت.


4️⃣ خروج و حذف توکن (Logout)

🔹 وقتی کاربر از حساب خود خارج شود، باید توکن‌های او حذف شوند تا دیگر امکان استفاده از API نداشته باشد.

🔹 مثال کد در لاراول:

public function logout(Request $request)
{
$request->user()->tokens()->delete();

return [
'message' => 'Logged out',
];
}


🔹 چرا tokens()->delete استفاده شده؟

چون باید تمام توکن‌های کاربر را پاک کنیم تا دیگر نتواند از API استفاده کند.


5️⃣ چرا در مسیر logout از Middleware auth:sanctum استفاده شده؟

🔹 در مسیرهای حساس (مثل logout)، باید حتماً بررسی کنیم که کاربر احراز هویت شده باشد.

🔹 این کار را Middleware auth:sanctum انجام می‌دهد.

🔹 تعریف مسیرها در routes/api.php

Route::post('/register', [AuthController::class, 'register']);
Route::post('/login', [AuthController::class, 'login']);
Route::post('/logout', [AuthController::class, 'logout'])->middleware('auth:sanctum');


🔹 چرا فقط برای logout این middleware اضافه شده؟

میدانیم که خروج از سیستم (logout) فقط باید توسط یک کاربری که لاگین کرده و توکن معتبر داره انجام بشه. یعنی کسی که هنوز توکن نگرفته نباید بتونه logout کنه! 🤨

این میان‌افزار (Middleware) باعث می‌شه که لاراول بررسی کنه آیا این درخواست واقعاً از طرف یک کاربر احراز هویت‌شده هست یا نه.

اگر کاربر توکن معتبر داشته باشه → درخواست قبول می‌شه و توکنش پاک می‌شه.

اگر توکن نداشته باشه یا جعلی باشه → لاراول خطای ۴۰۱ (Unauthorized) برمی‌گردونه.



کانال تخصصی لاراول
📌 @PapiDon_state

☕️ اتاق برنامه‌نویسی
📌 @PapiDon_coding
👍14🔥21
شرکت OpenAI امروز یک سری ابزار هیجان‌انگیز منتشر کرده که ساختن «ایجنت‌ها» (برنامه‌های هوشمند) را برای برنامه‌نویسان ساده‌تر از همیشه می‌کند!

🧐 حالا «ایجنت» دقیقاً چیه؟

یک «ایجنت» برنامه هوشمندی است که خودش و بدون دخالت انسان کارهایی مثل جواب دادن به ایمیل‌ها، جستجوی سریع و دقیق در اینترنت یا فایل‌ها و مدیریت هوشمندانه‌ی کارها را انجام می‌دهد.

OpenAI امروز سه ابزار جدید برای راحت کردن ساخت این ایجنت‌ها معرفی کرده:


🔸Web Search
🔹File Search
🔸Agents SDK


👇 برای خواندن توضیح کامل این ابزارهای جدید و جذاب، حتماً این پست رو بخون...

🔗 اینجا ....


کانال تخصصی لاراول
📌 @PapiDon_state

☕️ اتاق برنامه‌نویسی
📌 @PapiDon_coding
🎉2❤‍🔥1🔥1
سلام رفقا! 👋😊

تو سال جدید قراره توی اون یکی کانالمون حسابی درباره هوش مصنوعی صحبت کنیم!
از پرامپت‌نویسی گرفته تا معرفی ابزارهای خفن این حوزه! 🤖🔥

اگه به این دنیا علاقه دارید، حتماً بهمون ملحق بشید و توی بحث‌ها شرکت کنید!
منتظرتون هستیم اون طرف! 😍👇

🔗 لینک کانال
👌21👍1👏1
سال نو مبارک رفقا
سالی باشه از حال خوب، برکت و روزی فراوان و در هر مسیری که براش در تلاش هستید بهترین ها براتون پیش بیاد و موفقیت باشه ❤️🪻
10👍2🔥1
کانال آموزشی لاراول
Photo
🔥 پکیج جذاب Toast برای لاراول – معرفی Laravel Toaster Magic

اگه دنبال یه راه ساده، سریع و شیک برای نشون دادن پیام‌های toast توی پروژه‌هات با Laravel هستی، این پکیج دقیقاً همون چیزیه که لازم داری!

یه پکیج سبک و قوی برای ایجاد toast نوتیفیکیشن توی اپلیکیشن‌های Laravel هستش

🚀 ویژگی‌های جالب این پکیج:

- استفاده‌ی ساده و مستقیم داخل Laravel
- پشتیبانی کامل از زبان‌های راست‌به‌چپ مثل فارسی 🇮🇷
- حالت تاریک برای هماهنگی با UI تاریک 🌑
- پیام‌های toast کاملاً قابل شخصی‌سازی و قابل تنظیم به دلخواه شما 🎯

🛠 چطور نصبش کنیم؟

خیلی راحت! فقط چند خط کده:

1️⃣ نصب با Composer:

composer require devrabiul/laravel-toaster-magic


2️⃣ منتشر کردن فایل‌های پکیج:

php artisan vendor:publish --provider="Devrabiul\ToastMagic\ToastMagicServiceProvider"


3️⃣ اضافه کردن استایل‌ها و اسکریپت‌ها در فایل Blade:

<!DOCTYPE html>
<html lang="en">
<head>
{!! ToastMagic::styles() !!}
</head>
<body>
// محتوای شما

{!! ToastMagic::scripts() !!}
</body>
</html>


🎯 چطور toast نمایش بدیم؟

توی متدهای Controller به همین راحتی:

use Devrabiul\ToastMagic\Facades\ToastMagic;

class TeamController extends Controller
{
public function store()
{
ToastMagic::success('Team added successfully!');
return redirect('/teams');
}
}


📌 همچنین می‌تونی از toastهای دیگه مثل:

- ⚠️ warning
- error
- ℹ️ info

استفاده کنی.

💻 Toast از طریق JavaScript

اگر خواستی toast رو مستقیم از JS اجرا کنی:

const toast = new ToastMagic();
toast.success("Success!", "Your data has been saved!");


---

📚 برای اطلاعات بیشتر یا دیدن سورس‌کدش:

🔗 Link





کانال تخصصی لاراول
📌 @PapiDon_state

☕️ اتاق برنامه‌نویسی
📌 @PapiDon_coding
15👍4🔥1
🔥1👏1
کانال آموزشی لاراول
Photo
فصل اول دوره کامل شد!

اگه همیشه برات سوال بوده که هوش مصنوعی چیه و چطور کار می‌کنه، این فصل دقیقاً برای توئه!

توی این فصل، همه‌چی رو ساده، قابل فهم و بدون پیچیدگی توضیح دادم:

💡 درک اولیه از AI
🕰 تاریخچه‌ی هوش مصنوعی
🧠 مفاهیم پایه‌ای و مهم
⚙️ طرز فکر کردن هوش مصنوعی
🔧 مدل‌ها و پارامترها

مهم نیست مبتدی باشی یا فقط کنجکاوی — این ویدیوها برای همه طراحی شدن تا از یادگیری لذت ببرند! 😊


▶️ لینک دسترسی به دوره

https://youtu.be/pKQDvl34N7E?si=YuqOAXEKFvbS0Raj



کانال تخصصی لاراول
📌 @PapiDon_state

☕️ اتاق برنامه‌نویسی
📌 @PapiDon_coding
👍6🔥1
سیر تا پیاز Codex: دستیار هوش مصنوعی که کدنویسی رو متحول می‌کنه!

🔗 مطالعه این مطلب در اینجا 👉
👍41
👏1
کانال آموزشی لاراول
Photo
🔐 ورود بدون رمز عبور با Passkeys در لاراول!
توسط Spatie

آیا دوست داری کاربران سایتت بدون وارد کردن ایمیل و رمز عبور وارد بشن؟ فقط با یه تأیید ساده از طریق موبایل یا مرورگر؟

💡 پکیج Laravel Passkeys از تیم معروف Spatie که این کار رو توی اپلیکیشن‌های لاراول خیلی راحت و حرفه‌ای انجام می‌ده.

🎯 چیه اصلاً Passkey؟

یه کلید امنه که توی ابزارهایی مثل:

- 1Password
- مدیریت رمز عبور در macOS
- و سایر اپ‌های رمزنگاری‌شده

ذخیره می‌شه. وقتی از Passkey استفاده می‌کنی، دیگه لازم نیست ایمیل یا پسورد بزنی؛ فقط با یک کلیک یا اثر انگشت یا Face ID وارد می‌شی.


⚙️ این پکیج چه کاری می‌کنه؟

این پکیج بهت اجازه می‌ده:

🔹 به‌راحتی برای کاربر Passkey بسازی
🔸 سیستم ورود بدون رمز عبور رو در برنامه‌ت فعال کنی.
🔹 با استفاده از کامپوننت‌های Livewire یا Blade این سیستم رو پیاده‌سازی کنی

⚒️ پشتیبانی از Livewire و Inertia

در حال حاضر، این پکیج به‌صورت پیش‌فرض با Livewire کار می‌کنه، ولی اگر از Inertia استفاده می‌کنی، می‌تونی خودت یه کامپوننت سفارشی با React یا Vue بسازی.

📘 برای این مورد، صفحه‌ی "Usage in Inertia" توی داکیومنتش رو حتماً ببین!

🚀 شروع کار با Passkeys

📦 سورس کد این پکیج در گیت‌هاب منتشر شده:

🔗 لینک اینجا

📚 توی مستنداتش می‌تونی قدم‌به‌قدم یاد بگیری چطور نصبش کنی و ازش استفاده ببری.

حتی یه اپلیکیشن دمو هم ساختن تا بتونی این سیستم رو به‌صورت واقعی ببینی و تست کنی.

📌 نتیجه‌گیری کوتاه

اگه دنبال راهی امن‌تر، سریع‌تر و مدرن‌تر برای ورود کاربران هستی، بدون شک Passkeys یه انتخاب فوق‌العاده‌ست برای اپلیکیشن‌های لاراولی — مخصوصاً اگه تجربه‌ی کار با پکیج‌های Spatie رو داشته باشی، می‌دونی چقدر تمیز و استاندارد کار می‌کنن.


کانال تخصصی لاراول
📌 @PapiDon_state

☕️ اتاق برنامه‌نویسی
📌 @PapiDon_coding
🔥54👍1👏1🎉1💯1
کانال آموزشی لاراول pinned «🔐 ورود بدون رمز عبور با Passkeys در لاراول! توسط Spatie آیا دوست داری کاربران سایتت بدون وارد کردن ایمیل و رمز عبور وارد بشن؟ فقط با یه تأیید ساده از طریق موبایل یا مرورگر؟ 💡 پکیج Laravel Passkeys از تیم معروف Spatie که این کار رو توی اپلیکیشن‌های لاراول…»
👍1🎉1
کانال آموزشی لاراول
Photo
📘 در لاراول Query Scope: یاد بگیر چطور استادش بشی! بخش اول

وقتی داری اپلیکیشن لاراول می‌سازی، حتماً بارها پیش میاد که باید یه شرط خاص رو توی چندین قسمت مختلف تکرار کنی.

👀 مثلاً:

اپلیکیشن چند تیمی ساختی و باید همیشه team_id کاربر رو توی کوئری‌ها فیلتر کنی
یا یه بلاگ داری و مدام باید بررسی کنی پست منتشر شده یا نه (published_at)

🤯 تکرار این شرط‌ها هم خسته‌کننده‌ست، هم مستعد خطا.

🎯 راه حل: Query Scope

یه راه ساده برای تعریف شرط‌های قابل استفاده مجدد توی مدل‌هات هست.
این شرط‌ها معمولاً به‌صورت متد روی مدل (Model) تعریف می‌شن یا می‌تونی یه کلاس اختصاصی برایش بسازی.

🧩 دو نوع Scope داریم:


1️⃣ Local Scope ➜ باید دستی توی کوئری صدا زده بشه

2️⃣ Global Scope ➜ به‌صورت خودکار روی همه کوئری‌های اون مدل اعمال می‌شه

مثلاً ویژگی Soft Delete خود لاراول از Global Scope استفاده می‌کنه!

🌿 Local Query Scope

فرض کن یه بلاگ داری با دو صفحه در پنل ادمین:

پست‌های منتشر شده

🚧 پست‌های منتشر نشده

مدل ما: App\Models\Article
ستون زمان انتشار: published_at (nullable)

اگر published_at در گذشته باشه = منتشر شده
اگر null یا در آینده باشه = هنوز منتشر نشده

🔸 کوئری به روش معمول:

$publishedPosts = Article::query()
->where('published_at', '<=', now())
->get();


🔸 کوئری پست‌های منتشر نشده:

$unpublishedPosts = Article::query()
->where(function (Builder $query) {
$query->whereNull('published_at')
->orWhere('published_at', '>', now());
})->get();


🥴 اینا ساده‌ان ولی اگه توی کل اپ تکرار بشن، احتمال خطا بالا می‌ره.

راه حل: تعریف دو scope به اسم scopePublished و scopeNotPublished
داخل مدل:

final class Article extends Model
{
public function scopePublished(Builder $query): Builder
{
return $query->where('published_at', '<=', now());
}

public function scopeNotPublished(Builder $query): Builder
{
return $query->where(function (Builder $query) {
return $query->whereNull('published_at')
->orWhere('published_at', '>', now());
});
}
}


🔸 حالا کوئری‌ها خیلی شیک و تمیز می‌شن:

$publishedPosts = Article::query()->published()->get();
$unpublishedPosts = Article::query()->notPublished()->get();




کانال تخصصی لاراول
📌 @PapiDon_state

☕️ اتاق برنامه‌نویسی
📌 @PapiDon_coding
👌8👍3🔥31🎉1
کانال آموزشی لاراول
📘 در لاراول Query Scope: یاد بگیر چطور استادش بشی! بخش اول وقتی داری اپلیکیشن لاراول می‌سازی، حتماً بارها پیش میاد که باید یه شرط خاص رو توی چندین قسمت مختلف تکرار کنی. 👀 مثلاً: اپلیکیشن چند تیمی ساختی و باید همیشه team_id کاربر رو توی کوئری‌ها فیلتر کنی…
📘 بخش دوم / در لاراول Query Scope: یاد بگیر چطور استادش بشی!

🧩 اضافه کردن Global Scope به مدل

دو روش داریم:

1️⃣ با Attribute جدید لاراول:

#[ScopedBy(TeamScope::class)]
final class Article extends Model


2️⃣ با متد booted در مدل:

protected static function booted(): void
{
static::addGlobalScope(new TeamScope());
}


حالا بدون نوشتن where، همیشه فقط مقالات مرتبط با تیم خود کاربر برمی‌گرده:

Article::all(); // فقط برای تیم خودش


😎 Anonymous Global Scope

می‌تونی به‌جای ساختن کلاس، همون‌جا داخل مدل تعریفش کنی:

static::addGlobalScope('team_scope', function (Builder $builder) {
$builder->where('team_id', Auth::user()->team_id);
});


🚫 حذف Global Scope

گاهی لازمه Scope رو نادیده بگیری:

🔸 حذف همه Scope‌ها:

Article::query()->withoutGlobalScopes()->get();


🔸 حذف بعضی Scope‌ها:

->withoutGlobalScopes([
TeamScope::class,
'another_scope',
])


🔸 حذف فقط یکی:

->withoutGlobalScope(TeamScope::class)


⛔️ توجه: اگه از ()DB::table استفاده کنی، هیچ Global Scope اعمال نمی‌شه.

🧪 تست کردن Scopeها

تست scopePublished و scopeNotPublished

1️⃣ تست کن فقط مقالات منتشر شده بیاد

2️⃣ تست کن فقط مقالات منتشر نشده بیاد

🔸 نمونه تست:

$this->assertCount(2, $articles);
$this->assertTrue($articles->contains($this->publishedArticles->first()));


🧪 تست کردن در Controller

گاهی لازمه مطمئن شی که Scope توی کنترلر استفاده شده.

مثال:

final class ArticleController extends Controller
{
public function index()
{
return view('articles.index', [
'articles' => Article::all(),
]);
}
}


🔸 تست:

$this->actingAs($user)
->get('/articles')
->assertViewHas(
'articles',
fn (Collection $articles) =>
$articles->pluck('id')->all() === $articlesForTeamOne->pluck('id')->all()
);


نتیجه نهایی

- حالا دیگه فرق بین Local و Global Query Scope رو می‌دونی
- یاد گرفتی چطور بسازیشون
- بلدی چطور تست‌شون کنی

و از همه مهم‌تر:

🔁 می‌تونی کدت رو مرتب‌تر، امن‌تر و قابل نگهداری‌تر بنویسی! 😎




کانال تخصصی لاراول
📌 @PapiDon_state

☕️ اتاق برنامه‌نویسی
📌 @PapiDon_coding
👏8🎉3