| کانال توسعه‌دهندگان لاراول |
1.6K subscribers
53 photos
110 links
⭕️ کانال توسعه‌دهندگان لاراول دولوپیکس

💠 دولوپیکس | جامعه توسعه‌دهندگان ایرانی

💎 @Developix
🚀 Developix.ir

📌 پشتیبانی و تبلیغات:
@DevelopixSupport
Download Telegram
Forwarded from Developix Support
سلام
پرسشنامه‌ پیش رو با هدف درک بهتر رفتار و نیازهای کسب‌وکارهای اینترنتی ایرانی در استفاده از ابزارهای پرداخت توسط یک تیم پژوهشی مستقل طراحی شده است. نتایج این پژوهش به ما کمک می‌کند تا ابزارهایی کارآمدتر و منطبق با نیازهای واقعی شما ارائه دهیم. تکمیل این پرسشنامه کاملاً بی‌نام است و هیچ اطلاعات شخصی از شما ذخیره نخواهد شد. پاسخ‌های شما نقش کلیدی در بهبود خدمات ابزارهای پرداختی اینترنتی در کشور دارد، بنابراین از شما خواهشمندیم با دقت و صداقت به سوالات پاسخ دهید. زمان لازم برای تکمیل: حدود 5 دقیقه لطفاً برای شروع پرسشنامه، روی لینک زیر کلیک کنید و ما را در این مسیر همراهی کنید.
.
https://survey.porsline.ir/s/lEtAnSw8
.
سپاس فراوان از همکاری صمیمانه شما
فصل پنج - Migrations and Database

بخش اول - تعریف
و اجرای Migrationها

1- متد unique
این متد یک ایندکس یکتا برای یک یا چند ستون تعریف می‌کند. ایندکس یکتا باعث می‌شود که مقدارهای تکراری برای این ستون‌ها در جدول ذخیره نشود.
$table->string('email')->unique();


2- متد index
این متد یک ایندکس ساده برای یک یا چند ستون ایجاد می‌کند. این ایندکس برای بهبود عملکرد کوئری‌هایی استفاده می‌شود که مرتباً این ستون‌ها را جستجو یا فیلتر می‌کنند.
$table->string('username')->index();


3- متد primary
این متد یک کلید اصلی (Primary Key) برای یک یا چند ستون تعریف می‌کند. ستون‌های کلید اصلی نمی‌توانند مقدار NULL بپذیرند و باید یکتا باشند.
$table->integer('order_id')->primary();


4- متد fullText
این متد یک ایندکس تمام‌متنی (Full Text Index) برای جستجوی سریع متن در ستون‌های متنی (مثل TEXT یا VARCHAR) ایجاد می‌کند.
$table->fullText('content');


5- متد spatialIndex
این متد یک ایندکس مکانی (Spatial Index) برای ستون‌های مختصات جغرافیایی (مانند ستون‌هایی با نوع GEOMETRY) ایجاد می‌کند.
$table->point('coordinates')->spatialIndex();


6- متد renameIndex
این متد کلید اصلی جدول را حذف می‌کند.
 $table->dropPrimary();


7- متد dropUnique
این متد یک ایندکس یکتا را از جدول حذف می‌کند.
$table->dropUnique('users_email_unique');


8- متد dropIndex
این متد یک ایندکس ساده را از جدول حذف می‌کند.
$table->dropIndex('users_username_index');


9- متد dropFullText
این متد یک ایندکس تمام‌متنی را از جدول حذف می‌کند.
$table->dropFullText('articles_content_fulltext');


10- متد dropSpatialIndex
این متد یک ایندکس مکانی را از جدول حذف می‌کند.
$table->dropSpatialIndex('locations_coordinates_spatialindex');


11- متد foreign
این متد مشخص می‌کند که یک ستون در جدول فعلی قرار است به‌عنوان کلید خارجی عمل کند.
معمولاً به همراه متدهای references و on استفاده می‌شود.
$table->unsignedBigInteger('user_id');
$table->foreign('user_id');


12- متد references
این متد مشخص می‌کند که کلید خارجی به کدام ستون از جدول دیگر اشاره دارد.
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id');


13- متد on
این متد مشخص می‌کند که کلید خارجی باید به کدام جدول در پایگاه داده متصل شود.
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users');


14- متد foreignId
این متد یک راه کوتاه‌تر برای تعریف ستون کلید خارجی است. به طور پیش‌فرض، نوع ستون را unsignedBigInteger تعریف می‌کند.
$table->foreignId('user_id');


15- متد constrained
این متد تعریف کلید خارجی را آسان‌تر و سریع‌تر می‌کند. زمانی که از آن استفاده کنید:
- ستون را به‌عنوان کلید خارجی تعریف می‌کند.
- به صورت پیش‌فرض جدول مقصد را از نام ستون حدس می‌زند (مثلاً اگر ستون user_id باشد، به جدول users اشاره می‌کند).
- به ستون id به‌عنوان کلید اصلی در جدول مقصد اشاره می‌کند.
$table->foreignId('user_id')->constrained('users');


16- متد dropForeign
برای حذف یک کلید خارجی (Foreign Key) در جدول استفاده می‌شود. این متد زمانی استفاده می‌شود که بخواهید محدودیت‌های کلید خارجی روی یک ستون را از بین ببرید.
$table->dropForeign('posts_user_id_foreign');


17و 18- متد های onUpdate و onDelete
زمانی که یک کلید خارجی (foreign key) تعریف می‌کنید، می‌توانید رفتار حذف یا به‌روزرسانی رکوردهای مرتبط را مشخص کنید.
$table->foreignId('user_id')->constrained('users')->onDelete('cascade')->onUpdate('cascade');

ورودی می تواند حالت های restrict، set null، no action نیز باشد.

19- متد cascadeOnDelete
وقتی رکورد اصلی حذف شود، رکوردهای مرتبط در جدول فرعی هم حذف می‌شوند.
$table->foreignId('user_id')->constrained('users')->cascadeOnDelete();


20- متد restrictOnDelete
اگر رکوردهای مرتبط در جدول فرعی وجود داشته باشند، حذف رکورد اصلی ممنوع است.

21- متد nullOnDelete
اگر رکورد اصلی حذف شود، مقدار کلید خارجی در جدول فرعی به NULL تغییر می‌کند.

22- متد noActionOnDelete
حذف رکورد اصلی تأثیری روی جدول فرعی ندارد.

23- متد restrictOnUpdate
اگر رکورد مرتبط در جدول فرعی وجود داشته باشد، تغییر مقدار کلید خارجی در جدول اصلی ممنوع است.

24- متد nullOnUpdate
اگر مقدار کلید خارجی در جدول اصلی تغییر کند، مقدار کلید خارجی در جدول فرعی به NULL تغییر می‌کند.

25- متد noActionOnUpdate
تغییر مقدار کلید خارجی در جدول اصلی تأثیری روی جدول فرعی ندارد.

🔖 #Laravel, #PHP, #فصل_۵, #لاراول

👤 AmirHossein

💎 Channel: @DevelopixLaravel
بلاخره اکستنشن جدید Laravel به‌صورت رسمی در ورژن بتا منتشر شد.

Extension ID: laravel.vscode-laravel

برای فهمیدن جزئیات و خفن بودن این اکستنشن میتونید از وبلاگ لاراول نیوز بخونید:

https://laravel-news.com/laravel-vs-code-extension-public-beta

🔖 #Laravel, #PHP, #لاراول

👤 Matin Soleymani

💎 Channel: @DevelopixLaravel
فصل پنج - Migrations and Database

بخش اول - تعریف
و اجرای Migrationها

در قسمت آخر این بخش به تمامی کامندهای مربوط به مایگریشن ها اشاره می شود.

1- کامند make:migration
این دستور برای ایجاد یک فایل Migration جدید استفاده می‌شود.
php artisan make:migration create_flights_table


این کامند می تواند دو فلگ —create برای مایگریشن مربوط به ساخت جدول و —table برای مایگریشن های مربوط به ویرایش جدول را نیز دریافت کند.
php artisan make:migration create_flights_table
--create=flights

php artisan make:migration create_flights_table
--table=flights


2- کامند schema:dump
این دستور یک نسخه SQL dump از طرح پایگاه داده (schema) فعلی شما ایجاد می‌کند. این فایل در مسیر database/schema ذخیره می‌شود.
php artisan schema:dump


این متد نیز تعدادی فلگ دریافت میکند که در ادامه توضیح داده می شود:
- فلگ prune
فایل‌های مهاجرت قدیمی (migration) را حذف می‌کند و تنها یک نسخه dump ایجاد می‌کند.
php artisan schema:dump --prune


- فلگ database
این دستور نسخه SQL از طرح پایگاه داده را برای پایگاه داده مشخص‌شده ایجاد می‌کند.
php artisan schema:dump --database=testing


همچنین می توانید هر دو فلگ را همزمان استفاده کنید.

3- کامند migrate
این دستور تمامی فایل‌های مهاجرت را که تاکنون اجرا نشده‌اند، اجرا می‌کند و پایگاه داده را به‌روز می‌کند.
php artisan migrate


این کامند نیز تعدادی فلگ دریافت میکند:
- فلگ pretend
این دستور تغییرات مهاجرت را بدون اعمال واقعی، شبیه‌سازی می‌کند. می‌توانید ببینید چه کوئری‌هایی قرار است اجرا شوند.

- فلگ isolated
این دستور مهاجرت‌ها را در یک حالت ایزوله‌شده (isolated) اجرا می‌کند. این حالت معمولاً برای جلوگیری از تداخل مهاجرت‌ها در اجراهای هم‌زمان استفاده می‌شود.
php artisan migrate --isolated


- فلگ force
این دستور برای اجرای مهاجرت‌ها در حالت Production (محیط عملیاتی) استفاده می‌شود. به‌طور پیش‌فرض، مهاجرت‌ها در Production متوقف می‌شوند، اما با --force اجرا خواهند شد.

4- کامند migrate:status
این دستور وضعیت مهاجرت‌ها را نشان می‌دهد. مشخص می‌کند که کدام فایل‌های مهاجرت اجرا شده‌اند و کدام هنوز اجرا نشده‌اند.
php artisan migrate:status


5- کامند migrate:rollback
این دستور آخرین گروه از مهاجرت‌ها (آخرین batch) را برمی‌گرداند.

این کامند نیز تعدادی فلگ دریافت می کند که در ادامه بررسی می شود:
- فلگ step
این دستور x مرحله از آخرین مهاجرت‌ها را برمی‌گرداند.
php artisan migrate:rollback --step=5


- فلگ batch
این دستور مهاجرت‌های batch شماره ۳ را برمی‌گرداند.
مهاجرت‌ها در اجرای هر بار migrate در یک batch مشخص ذخیره می‌شوند.
php artisan migrate:rollback --batch=3


- فلگ pretend
این دستور مهاجرت‌ها را برنمی‌گرداند، اما تغییرات آن را شبیه‌سازی کرده و کوئری‌های مربوطه را نمایش می‌دهد.
php artisan migrate:rollback --pretend


6- کامند migrate:reset
این دستور همه مهاجرت‌ها را به حالت اول برمی‌گرداند.
تمامی جداول و تغییرات اعمال‌شده حذف می‌شوند.
php artisan migrate:reset


7- کامند migrate:refresh
این دستور ابتدا تمامی مهاجرت‌ها را برمی‌گرداند (reset می‌کند) و سپس آن‌ها را دوباره اجرا می‌کند.
php artisan migrate:refresh


این متد نیز فلگ هایی دریافت می کند:
- فلگ seed
این دستور همانند دستور قبل عمل می‌کند، اما علاوه بر آن، seederها را نیز اجرا می‌کند تا داده‌های اولیه وارد پایگاه داده شوند. (سیدر ها در بخش بعدی توضیح داده می شود)
php artisan migrate:refresh --seed


- فلگ step
این دستور x مرحله آخر مهاجرت‌ها را برمی‌گرداند و دوباره اجرا می‌کند.
php artisan migrate:refresh --step=5


8- کامند migrate:fresh
این دستور تمام جداول پایگاه داده را به‌طور کامل حذف می‌کند و سپس مهاجرت‌ها را دوباره اجرا می‌کند.
php artisan migrate:fresh


این متد هم فلگ هایی را دریافت می کند:
- فلگ seed
این دستور همانند migrate:fresh عمل می‌کند، اما پس از اجرای مهاجرت‌ها، seederها را نیز اجرا می‌کند.
php artisan migrate:fresh --seed


- فلگ database
این دستور نسخه پایگاه داده خاص را از ابتدا می‌سازد.
php artisan migrate:fresh --database=admin


🔖 #Laravel, #PHP, #فصل_۵, #لاراول

👤 AmirHossein

💎 Channel: @DevelopixLaravel
فصل پنج - Migrations and Database

بخش دوم - Factories


فکتوری‌ها در لاراول ابزاری برای ایجاد سریع و راحت داده‌های نمونه (mock) برای تست و توسعه هستند. با استفاده از فکتوری‌ها، می‌توانید به راحتی رکوردهایی را در پایگاه داده تولید کنید، بدون اینکه نیاز باشد به صورت دستی داده‌ها را وارد کنید.

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

ساخت یک فکتوری:
برای ساخت فکتوری، می توانید از دستور زیر استفاده کنید:
php artisan make:factory UserFactory


این دستور یک فکتوری با نام UserFactory برای شما در مسیر database/factories ایجاد می کند.
در فایل فکتوری که ایجاد شده، می‌توانید داده‌های پیش‌فرض را تعریف کنید.

مثال: تعریف یک فکتوری برای مدل User:
class UserFactory extends Factory
{
protected $model = \App\Models\User::class;

public function definition()
{
return [
'name' => $this->faker->name(),
'email' => $this->faker->unique()->safeEmail(),
'email_verified_at' => now(),
'password' => bcrypt('password'),
'remember_token' => Str::random(10),
];
}
}

هر فیلد جدول، مقدار پیش‌فرضی در اینجا دارد که به صورت خودکار تولید می‌شود.

استفاده از فکتوری:
برای تولید یک رکورد در پایگاه داده:
User::factory()->create();

این کد یک رکورد تست برای شما ایجاد می کند.

برای تولید چندین رکورد:
User::factory()->count(10)->create();

این کد به تعداد مشخص شده، رکورد تست برای شما ایجاد می کند.

برای ایجاد یک رکورد ولی بدون ذخیره کردن آن:
$user = User::factory()->make();

این کد یک رکورد تست برای شما ایجاد می کند اما در دیتابیس ذخیره نمی کند.

مثال کامل:
فرض کنید یک جدول برای مقالات (Posts) دارید.
class PostFactory extends Factory
{
protected $model = \App\Models\Post::class;

public function definition()
{
return [
'title' => $this->faker->sentence(),
'content' => $this->faker->paragraph(),
'user_id' => \App\Models\User::factory(),
];
}
}


این کد یک جمله رندوم برای title، یک پاراگراف رندوم برای content، و یک کاربر جدید برای user_id ایجاد می کند.

فرض کنید می خواهیم 100 پست تستی ایجاد کنیم:
Post::factory()->count(100)->create();


این فکتوری به سادگی 100 پست تستی برای شما ایجاد خواهد کرد.

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

در پست های بعدی به طور کامل به فکتوری ها خواهیم پرداخت.

🔖 #Laravel, #PHP, #فصل_۵, #لاراول

👤 AmirHossein

💎 Channel: @DevelopixLaravel
فصل پنج - Migrations and Database

بخش دوم - Factories


لاراول هنگام کار با فکتوری‌ها، مجموعه‌ای از متدها و پراپرتی‌ها را ارائه می‌دهد که به شما کمک می‌کنند داده‌های نمونه پیشرفته‌تری بسازید.
این متد ها درون کلاس فکتوری پیاده سازی می شوند.

1- متد definition
این متد اصلی ترین متد برای تعریف داده‌های پیش‌فرض فکتوری استفاده می‌شود. داده‌های تولید شده توسط Faker در این متد تعریف می‌شوند.
این متد یک آرایه برمی گرداند که شامل نام فیلد ها به عنوان key و مقدار فیلد ها به عنوان value می باشد.
class UserFactory extends Factory
{
protected $model = \App\Models\User::class;

public function definition()
{
return [
'name' => $this->faker->name(),
'email' => $this->faker->unique()->safeEmail(),
'password' => bcrypt('password'),
];
}
}


2- متد unverified
این متد می‌تواند حالتی خاص برای فکتوری شما تعریف کند. مثلاً داده‌هایی را تولید کند که ایمیل کاربر تایید نشده باشد.
وقتی شما از متد unverified استفاده می‌کنید، در واقع یک وضعیت خاص برای فیلدها تعریف می‌کنید که باعث می‌شود برخی از فیلدها مانند email_verified_at برای رکوردهای ساخته شده، مقدار null داشته باشند.
public function unverified()
{
return $this->state(function (array $attributes) {
return [
'email_verified_at' => null,
];
});
}

// Usage:
User::factory()->unverified()->create();

این متد یک state جدید ایجاد می کند، یعنی می توانید برخی از مقادیر فیلدها را در unverified تغییر دهید بدون این که کل تعریف پیش‌فرض در متد definition را تغییر دهید.

3- متد suspended
یک حالت خاص دیگر (مانند unverified) برای داده‌ها تعریف می‌کند. این متد معمولاً برای افزودن وضعیت خاص به رکوردها استفاده می‌شود.
public function suspended()
{
return $this->state(function (array $attributes) {
return [
'is_suspended' => true,
];
});
}

// Usage:
User::factory()->suspended()->create();


4- متد configure
متدی که به شما اجازه می‌دهد عملیات سفارشی‌سازی یا رویدادهایی را قبل یا بعد از ایجاد رکوردها اجرا کنید. معمولاً برای تنظیم مقادیر اضافی یا اعمال تغییرات خاص استفاده می‌شود.
public function configure()
{
return $this->afterCreating(function (User $user) {
$user->profile()->create([
'bio' => 'This is a sample bio.',
]);
});
}

// Usage:
User::factory()->create();


این متد پس از اجرای متد craete به طور خودکار ایجاد می شود.
همچنین می توانید به جای afterCreating از afterMaking استفاده کنید درصورت استفاده از متد make.

5- متد newFactory
برای اتصال یک مدل به فکتوری استفاده می‌شود. این متد معمولاً در مدل‌ها تعریف می‌شود و هدف اصلی آن مشخص کردن فکتوری مرتبط با مدل است تا بتوان به سادگی و بدون نیاز به تنظیم دستی، رکوردهای مدل را با استفاده از فکتوری تولید کرد.
class User extends Authenticatable
{
use HasFactory;

protected static function newFactory()
{
return UserFactory::new();
}
}


درصورتی که نام مدل و فکتوری شما استاندارد باشد (مثلا User و UserFactory به ترتیب برای مدل و فکتوری)، لاراول به طور خودکار این عملیات را انجام می دهد.


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

🔖 #Laravel, #PHP, #فصل_۵, #لاراول

👤 AmirHossein

💎 Channel: @DevelopixLaravel
فصل پنج - Migrations and Database

بخش دوم - Factories


در این قسمت به متد های مربوط به فکتوری ها و قابل فراخوانی از مدل ها می پردازیم.

1- متد factory
برای ایجاد یک فکتوری جدید استفاده می‌شود. در نسخه‌های قدیمی لاراول این متد به طور خودکار در دسترس بود، اما در نسخه‌های جدید لاراول باید از Model::factory() استفاده کنید.
User::factory()->...


در اینجا از متد factory برای تولید یک فکتوری از مدل User استفاده شده است.

2- متد create
برای ذخیره مدل‌های تولیدشده در پایگاه داده استفاده می‌شود. این متد رکورد جدید را در دیتابیس ذخیره می‌کند.
User::factory()->create();


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

3- متد trashed
برای فیلتر کردن مدل‌هایی که در حالت soft delete قرار دارند، استفاده می‌شود. این متد برای زمانی که می‌خواهید فقط مدل‌های حذف‌شده را ایجاد کنید مفید است.
User::factory()->trashed()->create();


در این مثال، کاربری که حذف شده است، ایجاد می‌شود.

4- متد make
مشابه create است اما رکورد را ذخیره نمی‌کند. این متد فقط شی مدل را برمی‌گرداند و هیچ تغییراتی در دیتابیس ایجاد نمی‌کند.
$user = User::factory()->make();


در اینجا، یک مدل جدید ساخته می‌شود اما در پایگاه داده ذخیره نمی‌شود.

5- متد count
برای مشخص کردن تعداد رکوردهایی است که باید ایجاد شوند.
User::factory()->count(10)->create();


در اینجا 10 کاربر ایجاد و در پایگاه داده ذخیره می‌شود.

6- متد suspended
معمولاً به عنوان یک حالت (state) در فکتوری‌ها استفاده می‌شود. این متد یک وضعیت خاص (مثل تعلیق یا وضعیت غیر فعال) را به مدل اختصاص می‌دهد.
User::factory()->suspended()->create();


در اینجا، یک کاربر که در وضعیت تعلیق قرار دارد، ایجاد می‌شود.

7- متد state
برای اعمال حالت‌های خاص (custom states) به مدل‌های تولید شده استفاده می‌شود. این متد به شما این امکان را می‌دهد که ویژگی‌های مدل را به صورت پویا تغییر دهید.
User::factory()->state([
'email_verified_at' => null,
])->create();


در اینجا، یک کاربر تولید می‌شود که ایمیل او تایید نشده است.

8- متد has
برای ایجاد روابط (مثل روابط hasMany) استفاده می‌شود. این متد به شما این امکان را می‌دهد که تعداد مدل‌های وابسته (مانند پست‌ها، کامنت‌ها و غیره) را که باید به مدل اصلی تعلق داشته باشند مشخص کنید.
User::factory()->has(Post::factory()->count(5))->create();


ابتدا یک کاربر جدید ایجاد می‌شود، سپس 5 پست مرتبط با این کاربر به طور خودکار ایجاد می‌شود.
ای متد نیاز به پیاده سازی روابط مربوطه در مدل های مربوطه می باشد.

9- متد hasXXX
این متد همان متد has می باشد اما به صورت داینامیک.
User::factory()->hasPosts(3)->create();


در اینجا، کاربری ایجاد می‌شود و به طور خودکار 3 پست برای او ایجاد می‌شود.
بخش Posts در متد hasPosts درواقع نام رابطه posts در مدل User می باشد.

10- متد for
برای تعریف یک رابطه به صورت خاص (معمولاً belongsTo) استفاده می‌شود. این متد به شما این امکان را می‌دهد که مدل‌های وابسته را به مدل اصلی اختصاص دهید.
Post::factory()->for(User::factory())->create();


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

11- متد forXXX
این متد همان متد for می باشد اما به صورت داینامیک.
Post::factory()->forUser($user)->create();


در اینجا، یک پست برای یک کاربر مشخص ایجاد می‌شود.
بخش User در متد forUser درواقع رابطه user در مدل Post می باشد.

12- متد hasAttached
برای ایجاد روابط وابسته بین مدل‌ها (مانند belongsToMany) استفاده می‌شود. این متد برای مدیریت روابط چند به چند (many-to-many) کاربرد دارد.
User::factory()->hasAttached(Role::factory(), 3)->create();


در اینجا، یک کاربر جدید ایجاد می‌شود و به طور خودکار به 3 نقش متصل می‌شود.

13- متد recycle
برای استفاده از یک مدل موجود (که قبلاً ایجاد شده یا حذف نرم شده) در روابط مختلف میان مدل‌ها استفاده می‌شود. این متد به شما کمک می‌کند که یک مدل خاص را در فکتوری‌های مختلف برای ایجاد رکوردهای مرتبط استفاده کنید تا یک نسخه واحد از آن مدل برای همه روابط در فرآیند ساخت داده‌ها استفاده شود.
Ticket::factory()->recycle(Airline::factory()->create())->create();


در اینجا، ابتدا یک ایرلاین جدید ایجاد می‌شود، سپس متد recycle این ایرلاین را برای استفاده در بلیط‌ها و پروازهایی که ایجاد می‌شوند، انتخاب می‌کند. درواقع ایرلاین ایجاد شده در تمام بلیط‌ها و پروازهای موجود از قبل استفاده می‌شود.

🔖 #Laravel, #PHP, #فصل_۵, #لاراول

👤 AmirHossein

💎 Channel: @DevelopixLaravel
⚜️ دوره لاراول - قسمت نوزدهم
📚 مینی پروژه TODo App - ساخت داکیومنت + حل مشکلات جزئی - پایان مینی پروژه

خلاصه :
توی این ویدیو به ادامه مینی پروژه پرداختیم و برای api ای که در قسمت های قبل توسعه دادیم داکیومنت ساختیم و یه سری مشکلات ریز وجود داشت که حل کردیم... با این ویدیو عملا پرونده بخش مینی پروژه بسته میشه و از این به بعد میرسیم سراغ ادامه آموزش ها.

✳️ کد های این مینی پروژه روی گیت هاب قرار گرفته.

توی قسمت های بعدی این مجموعه رو ادامه میدیم.

🎞 لینک ویدیو:
https://youtu.be/BcWH85FtUN0

🔗 Github Repo

🔖 #Laravel, #PHP, #لاراول

👤 Matin Soleymani

💎 Channel: @DevelopixLaravel
فصل پنج - Migrations and Database

بخش سوم - Seeders


‏Seeder یکی از ابزارهای لاراول است که برای وارد کردن داده‌های اولیه یا نمونه به پایگاه داده استفاده می‌شود. این ابزار به توسعه‌دهندگان کمک می‌کند تا داده‌های لازم برای تست یا مقداردهی اولیه پایگاه داده را به صورت خودکار و سریع ایجاد کنند.

فرض کنید می‌خواهید جدول cities را با داده‌های اولیه شهرها پر کنید. این جدول ممکن است شامل نام شهرها و استان‌های آن‌ها باشد.

1- ایجاد Seeder
ابتدا Seeder جدیدی برای جدول شهرها ایجاد می‌کنیم، این کار به وسیله دستور زیر انجام می شود:
php artisan make:seeder CitySeeder


2- پر کردن Seeder
فایل database/seeders/CitySeeder.php را باز کرده و داده‌های اولیه را به صورت دستی وارد کنید:
namespace Database\Seeders;

use Illuminate\Database\Seeder;
use App\Models\City;

class CitySeeder extends Seeder
{
public function run()
{
$cities = [
['name' => 'Tehran', 'province' => 'Tehran'],
['name' => 'Mashhad', 'province' => 'Khorasan Razavi'],
['name' => 'Isfahan', 'province' => 'Isfahan'],
['name' => 'Shiraz', 'province' => 'Fars'],
['name' => 'Tabriz', 'province' => 'East Azerbaijan'],
];

foreach ($cities as $city) {
City::create($city);
}
// Or using query builder:
//City::insert($cities);
}
}


3- اجرای Seeder
برای اجرای Seeder شهرها، از دستور زیر استفاده کنید:
php artisan db:seed --class=CitySeeder


یا برای اجرای تمامی سیدر ها:
php artisan db:seed


گاهی در محیط پروداکشن سیدر ها ممکن است برای محافط از آسیب داده ها اجرا نشوند، برای این کار می توان از فلگ —force استفاده کرد، اما مراقب داده های خود باشید:
php artisan db:seed --force


پس از اجرای Seeder، جدول cities با داده های مشخص شده پر خواهد شد.

این روش برای مقداردهی اولیه داده‌های ثابت مانند شهرها، دسته‌بندی‌ها، یا تنظیمات بسیار مفید است و در زمان تست یا توسعه پروژه استفاده می‌شود.

استفاده از فکتوری ها در سیدر:
همچنین می توانید یک فکتوری را در سیدر خود فراخوانی کنید و داده های تستی خود را از فکتوری ایجاد کنید:
# UserSeeder.php
public function run(): void
{
User::factory()
->count(50)
->hasPosts(1)
->create();
}


فراخوانی سیدر های اضافی در یک سیدر:
همچنین می توانید از متد call استفاده کنید و سیدر های دیگری را در سیدر خود فراخوانی و اجرا کنید:
# FolanSeeder.php
public function run(): void
{
$this->call([
UserSeeder::class,
PostSeeder::class,
CommentSeeder::class,
]);
}


بی صدا کردن رویداد های مدل:
درصورت اجرای سیدر و ایجاد رکورد ها، رویداد های مدل ها نیز فراخوانی می شوند، شما می توانید با استفاده از تریت WithoutModelEvents، مانع فراخوانی این سیدر ها شوید:
class DatabaseSeeder extends Seeder
{
use WithoutModelEvents;

public function run(): void
{
$this->call([
UserSeeder::class,
]);
}
}


🔖 #Laravel, #PHP, #فصل_۵, #لاراول

👤 AmirHossein

💎 Channel: @DevelopixLaravel
⚜️ دوره لاراول - قسمت نوزدهم
📚 الکوئنت ، فکتوری‌ها | Eloquent Factories

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

توی قسمت های بعدی این مجموعه رو ادامه میدیم.

🎞 لینک ویدیو:
https://youtu.be/Gh-fbsUupLE

🔖 #Laravel, #PHP, #لاراول

👤 Matin Soleymani

💎 Channel: @DevelopixLaravel
فصل پنج - Migrations and Database

بخش چهارم - اتصالات دیتابیس


در لاراول، مدیریت چندین اتصال به دیتابیس و استفاده از دیتابیس‌های مختلف به صورت ساده‌ای امکان‌پذیر است.

- چندین اتصال به دیتابیس


برای مدیریت چندین اتصال به دیتابیس فایل تنظیمات config/database.php را باز کنید. در آرایه‌ی connections، می‌توانید چندین کانکشن مختلف تعریف کنید.
مثال:
'connections' => [
'mysql' => [
// ...
],
'mysql_second' => [
// ...
],
]


در اینجا دو کانکشن مختلف با نام های mysql و mysql_second را پیکربندی می کنیم.

——————

- استفاده از چندین کانکشن در کد

پس از تعریف کانکشن‌ها در فایل تنظیمات، می‌توانید به صورت زیر از آن‌ها استفاده کنید:
// connect to 'mysql'
$data = DB::connection('mysql')->select('SELECT * FROM users');

// connect to 'mysql_second'
$data = DB::connection('mysql_second')->select('SELECT * FROM products');

// In migrations
public function up()
{
Schema::connection('mysql_second')->create('products', function (Blueprint $table) {
// ...
});
}


همچنین در یک مدل خاص می‌توانید کانکشن را مشخص کنید:
class Product extends Model
{
protected $connection = 'mysql_second';
}


——————

- استفاده از MongoDB

برای استفاده از MongoDB در لاراول، می‌توانید از پکیج رسمی mongodb/laravel-mongodb استفاده کنید. این پکیج توسط MongoDB نگهداری می‌شود و ادغام کاملی با Eloquent و سایر ویژگی‌های لاراول فراهم می‌کند. در ادامه، مراحل نصب و پیکربندی این پکیج را توضیح می‌دهم:

با استفاده از Composer، پکیج را به پروژه خود اضافه کنید:
composer require mongodb/laravel-mongodb


پس از نصب پکیج، باید تنظیمات مربوط به اتصال به دیتابیس MongoDB را در فایل config/database.php اضافه کنید. در بخش connections، کانکشن mongodb را به صورت زیر تعریف کنید:
'connections' => [
// others...

'mongodb' => [
'driver' => 'mongodb',
'dsn' => env('MONGODB_URI', 'mongodb://localhost:27017'),
'database' => env('MONGODB_DATABASE', 'laravel_app'),
],
],


پس از آن با کانکشن mongodb به دیتابیس mongodb خود متصل شوید.

——————

- استفاده از Redis در لاراول

لاراول به صورت داخلی از Redis پشتیبانی می‌کند.
تنظیمات Redis را می توانید در فایل config/database.php بررسی کنید.
در این دوره استفاده از ردیس به طور کامل بررسی نمی شود، اما تمامی متد های ردیس از فساد Redis در دسترس هستند:
use Illuminate\Support\Facades\Redis;

Redis::set('key', 'value');

$value = Redis::get('key');


🔖 #Laravel, #PHP, #فصل_۵, #لاراول

👤 AmirHossein

💎 Channel: @DevelopixLaravel
خروجی حلقه کدام است؟

1️⃣ Error
2️⃣ 10 9 8 7 6 5 4 3 2 1
3️⃣ Warning
4️⃣ 9 8 7 6 5 4 3 2 1 0

پاسخ خود را همراه با توضیح ارائه دهید.

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

🔖 #PHP, #پی_اچ_پی, #چالش

👤 AmirHossein

💎 Channel: @DevelopixPHP
🔰 در این سوال نکات زیادی حائز اهمیت است که معمولا در نظر گرفته نمی‌شود.

🔍 در ادامه، ساختار حلقه را به‌طور مفصل بررسی می‌کنیم:

for ($i = 10; $i--; $i > 0) {
    echo "$i ";
}


خروجی این حلقه به‌صورت زیر خواهد بود:
9 8 7 6 5 4 3 2 1 0

⁉️ اما چرا؟
بیایید ساختار حلقه را از ابتدا بررسی کنیم.

🔰 ساختار کلی حلقه for
حلقه for از سه بخش تشکیل شده است:

1- شروع: مقداردهی اولیه متغیر حلقه.
این بخش تنها یک بار در ابتدای حلقه اجرا می‌شود.

2- شرط ادامه: تعیین می‌کند که آیا حلقه ادامه یابد یا متوقف شود.
این بخش در هر تکرار، قبل از اجرای بدنه اجرا شده و شرط اجرای بدنه را بررسی می‌کند.

3- تغییر مقدار: مقدار متغیر حلقه را تغییر می‌دهد.
این بخش پس از اجرای بدنه حلقه اجرا می‌شود.

🔰 بررسی اجرای حلقه ذکر شده

1- مقداردهی اولیه:
- ابتدا متغیر $i مقدار 10 می‌گیرد و اجرای این بخش پایان می‌یابد.

2- بررسی شرط ($i--)
در این قسمت نکات مهمی وجود دارد:

- هر عدد به جز 0 مقدار true دارد، بنابراین تا زمانی که $i به 0 نرسد، حلقه ادامه خواهد داشت.

- در عبارت $i-- از عملیات post-decrement استفاده شده است، یعنی ابتدا مقدار فعلی $i برای بررسی شرط استفاده می‌شود، سپس مقدار $i کاهش می‌یابد.
- - به همین دلیل عدد 0 نیز چاپ خواهد شد.
- - مقدار $i بعد از کاهش وارد بدنه حلقه می‌شود، بنابراین چاپ اعداد از 9 شروع می‌شود.

اگر حلقه به این صورت نوشته می‌شد:
for ($i = 10; --$i; $i > 0) {
    echo "$i ";
}


در این حالت، ابتدا مقدار $i کاهش می‌یابد و سپس شرط بررسی می‌شود زیرا از عملیات pre-decrement، بنابراین 0 چاپ نمی‌شود و خروجی به این شکل خواهد بود:
9 8 7 6 5 4 3 2 1

3- بررسی قسمت سوم (تغییر مقدار update)
- بخش سوم این حلقه روی مقدار $i تغییری ایجاد نمی‌کند، بنابراین عملاً بی‌اثر است و می‌توان حلقه را ساده‌تر نوشت:
for ($i = 10; $i--;) {
    echo "$i ";
}


🔰 مرور روند اجرای حلقه ذکر شده

- مقدار دهی اولیه i با 10
- بررسی 10 == true، کاهش 10 به 9، چاپ 9
- بررسی 9 == true، کاهش 9 به 8، چاپ 8
‏.
‏.
‏.
- بررسی 2 == true، کاهش 2 به 1، چاپ 1
- بررسی 1 == true، کاهش 1 به 0، چاپ 0
- بررسی 0 == true، پایان حلقه

❗️ درک درست post-decrement ($i--) و pre-decrement (--$i) در حلقه‌ها اهمیت زیادی دارد و تفاوت‌های ظریفی در خروجی ایجاد می‌کند.

🔖 #PHP, #پی_اچ_پی, #چالش

👤 AmirHossein

💎 Channel: @DevelopixPHP
Forwarded from Developix Support
🥳مسابقۀ ۱۰۰ میلیونی ساخت بات در اپلیکیشن بله!🦾

💰 مسابقه‌ای برای ساخت بازو (بات) و مینی‌اپ در اپلیکیشن بله

🎯 از استعدادت پول در بیار!
چطوری؟
بله با مسابقهٔ «زور بازوت رو نشون بده!» یک فرصت عالی برای مهندسین نرم‌افزار، وب دولوپر‌ها، صاحبان سایت‌ها و اپلیکیشن‌ها و تیم‌های محصول فراهم کرده که پاسخگوی این دغدغه‌هاست.

🎁 یه مسابقه با ۱۰۰ میلیون تومن جایزهٔ نقدی و ۱ میلیارد تومن اعتبار تبلیغات منتظرته! ♨️

📎 همین الان در مسابقه ثبت‌نام کن! ➡️

💬
کانال اخبار بازو دراپلیکیشن بله

ک
انال اطلاع‌رسانی بله | @BaleMessenger
فصل شش - Requests and Response

بخش اول - پردازش درخواست و پاسخ


در فریمورک لاراول، مفاهیم Request (درخواست) و Response (پاسخ) جزو مهم‌ترین اجزای پردازش درخواست‌های وب محسوب می‌شوند. این دو مفهوم در الگوی MVC بخش ارتباط بین کاربر (Client) و سرور (Backend) را مدیریت می‌کنند.

1- درخواست (Request)
‏Request در لاراول به تمام داده‌هایی گفته می‌شود که از طرف کاربر (مثلاً مرورگر، Postman یا یک کلاینت دیگر) به سرور ارسال می‌شود. این داده‌ها می‌توانند شامل موارد زیر باشند:

- داده‌های فرم (POST)
- پارامترهای URL (GET)
- هدرهای HTTP
- کوکی‌ها
- فایل‌های آپلود شده
- اطلاعات احراز هویت

لاراول برای مدیریت درخواست‌ها از کلاس Illuminate\Http\Request استفاده می‌کند که قابلیت‌های زیادی برای دسترسی و فیلتر کردن داده‌های ورودی دارد.

در کنترلرها، برای دریافت اطلاعات ورودی، می‌توان از کلاس Request استفاده کرد:
class UserController extends Controller
{
public function store(Request $request)
{
$name = $request->input('name');

$email = $request->input('email', 'default@example.com');

$data = $request->all();

$token = $request->header('Authorization');
}
}


2- پاسخ (Response)
‏Response یا پاسخ، همان داده‌ای است که لاراول پس از پردازش درخواست به کلاینت ارسال می‌کند. این پاسخ می‌تواند شامل:

‏- HTML‏ یا View
‏- JSON‏ یا API Response
- ریدارکت (Redirect)
- دانلود فایل
- ارسال پیام‌های خطا یا موفقیت باشد.

در کنترلرها، برای ارسال پاسخ، می‌توان از فساد یا هلپر Response استفاده کرد:
class UserController extends Controller
{
public function store(Request $request)
{
return response('Hello, Laravel!');

return response()->json([
'message' => 'Success',
'status' => 200
]);

return response()->view('welcome', ['name' => 'John']);
}
}


در ادامه این بخش به بررسی Request و Response و تمامی متد های در دسترس از آنها خواهیم پرداخت.

🔖 #Laravel, #PHP, #فصل_۶, #لاراول

👤 AmirHossein

💎 Channel: @DevelopixLaravel
فصل شش - Requests and Response

بخش اول - پردازش درخواست و پاسخ


لاراول برای مدیریت درخواست‌ها از کلاس Illuminate\Http\Request استفاده می‌کند که قابلیت‌های زیادی برای دسترسی و فیلتر کردن داده‌های ورودی دارد.
این کلاس معمولا در Controller ها یا Route-Closure ها استفاده می شود:
class UserController extends Controller
{
public function store(Request $request)
{
$request->...
}
}

// OR

Route::get('/', function(Request $request) {
$request->...
});


در ادامه با متد های در دسترس از این کلاس آشنا می شویم.

1- متد path
این متد مسیر درخواست شده را بدون دامنه برمی‌گرداند.
$request->path(); // posts/10


2- متد is
بررسی می‌کند که مسیر درخواست با یک الگو مطابقت دارد یا نه.
if ($request->is('posts/*')) {
}


3- متد routeIs
بررسی می‌کند که مسیر درخواست با نام روت خاصی مطابقت دارد یا نه.
if ($request->routeIs('post.show')) {
}


4- متد url
آدرس کامل بدون query string را برمی‌گرداند.
$request->url(); // http://example.com/posts/10


5- متد fullUrl
آدرس کامل شامل query string را برمی‌گرداند.
$request->fullUrl();
// http://example.com/posts/10?sort=desc


6- متد fullUrlWithQuery
یک پارامتر کوئری را به URL اضافه می‌کند.
$request->fullUrlWithQuery(['page' => 2]); 
// http://example.com/posts?sort=desc&page=2


7- متد fullUrlWithoutQuery
برخی از پارامترهای کوئری را از URL حذف می‌کند.
$request->fullUrlWithoutQuery(['sort']);
// http://example.com/posts?page=2


8- متد host
دامنه درخواست را برمی‌گرداند.
$request->host(); // example.com


9- متد httpHost
دامنه همراه با پورت را برمی‌گرداند.
$request->httpHost(); // example.com:8080


10- متد schemeAndHttpHost
پروتکل (http یا https) و دامنه را برمی‌گرداند.
$request->schemeAndHttpHost();
// https://example.com


11- متد ip
آدرس IP درخواست‌دهنده را برمی‌گرداند.
$request->ip(); // 192.168.1.1


12- متد ips
لیست IPهای درخواست‌دهنده را برمی‌گرداند.
$request->ips();
// [192.168.1.1, 10.0.0.2]


13- متد method
متد HTTP درخواست (GET, POST, PUT, DELETE) را برمی‌گرداند.
$request->method(); // POST


14- متد isMethod
بررسی می‌کند که متد HTTP درخواست مقدار خاصی دارد یا نه.
if ($request->isMethod('post')) {
}


15- متد header
مقدار یک هدر خاص را برمی‌گرداند.
$request->header('User-Agent'); // "Mozilla/5.0"


16- متد hasHeader
بررسی می‌کند که آیا یک هدر مشخص در درخواست وجود دارد یا نه.
if ($request->hasHeader('Authorization')) {
}


17- متد bearerToken
مقدار Bearer Token در هدر Authorization را برمی‌گرداند.
$request->bearerToken();


18- متد getAcceptableContentTypes
لیستی از انواع محتوای مورد قبول در هدر Accept را برمی‌گرداند.
$request->getAcceptableContentTypes();
// ['application/json', 'text/html']


19- متد accepts
بررسی می‌کند که آیا نوع محتوای مشخص‌شده پذیرفته شده است یا نه.
if ($request->accepts('application/json')) {
}


20- متد prefers
نوع محتوای ترجیحی را برمی‌گرداند.
$request->prefers(['text/html', 'application/json']);


21- متد expectsJson
بررسی می‌کند که آیا درخواست انتظار JSON دارد یا نه.
if ($request->expectsJson()) {
}


22- متد flash
داده‌ها را برای درخواست بعدی در سشن ذخیره می‌کند.
$request->flash();


23- متد flashOnly
برخی از داده‌ها را در سشن ذخیره می‌کند.
$request->flashOnly(['name', 'email']);


24- متد flashExcept
تمام داده‌ها به‌جز موارد مشخص‌شده را در سشن ذخیره می‌کند.
$request->flashExcept(['password']);


25- متد only
فقط مقادیر مشخص‌شده را از درخواست دریافت می‌کند.
$request->only(['name', 'email']);


26- متد except
تمام مقادیر درخواست به‌جز موارد مشخص‌شده را دریافت می‌کند.
$request->except(['password']);


سایر متد ها در پست بعدی توضیح داده می‌شود.

🔖 #Laravel, #PHP, #فصل_۶, #لاراول

👤 AmirHossein

💎 Channel: @DevelopixLaravel
فصل شش - Requests and Response

بخش اول - پردازش درخواست و پاسخ


در این قسمت به سایر متدهای در دسترس از کلاس Request می پردازیم.

1- متد cookie
مقدار یک کوکی را برمی‌گرداند.
$value = $request->cookie('user_token');


2- متد all
تمام داده‌های ورودی (query parameters، POST data، JSON payloads) را به‌صورت آرایه برمی‌گرداند.
$data = $request->all();


3- متد collect
داده‌های ورودی را به‌عنوان Collection لاراول برمی‌گرداند.
کالکشن‌ها در لاراول مجموعه‌ای از داده‌ها هستند که امکانات پیشرفته‌ای برای کار با آرایه‌ها ارائه می‌دهند.
در فصل های مربوطه به کار با کالکشن ها خواهیم پرداخت.
$collection = $request->collect();


4- متد input
مقدار یک ورودی خاص را دریافت می‌کند.
$name = $request->input('name');


همچنین می توان input مورد نظر را به صورت پراپرتی دریافت کرد:
$name = $request->name;


5- متد query
مقدار یک متغیر در query string را دریافت می‌کند.
$sort = $request->query('sort', 'asc');

پارامتر اول کلید کوئری و پارامتر دوم مقدار پیشفرض می باشد.

6- متد string
مقدار یک ورودی را به‌عنوان Stringable لاراول برمی‌گرداند.
در لاراول Stringable همانند کالکشن که برای کار با آرایه ها است، برای کار با رشته ها می باشد.
$name = $request->string('name');

این متد input با نام name را در قالب شئ از Stringable باز می گرداند و می توان متد های زیادی را بر روی آن فراخوانی کرد:
$name = $request->string('name')->upper();


7- متد integer
مقدار ورودی را به عدد صحیح (integer) تبدیل می‌کند.
$age = $request->integer('age');


8- متد boolean
مقدار ورودی را به مقدار بولی (true یا false) تبدیل می‌کند.
$active = $request->boolean('active');


9- متد date
مقدار ورودی را به شیء Carbon تبدیل می‌کند.
کربن نیز یک کلاس برای کار با زمان ها می باشد.
$birthday = $request->date('birthday');


10- متد enum
مقدار ورودی را با یک enum مقایسه می‌کند.
$status = $request->enum('status', OrderStatus::class);


11- متد enums
چند مقدار ورودی را با یک enum بررسی می‌کند.
$statuses = $request->enums('statuses', OrderStatus::class);


12- متد has
بررسی می‌کند که آیا مقدار مشخصی در درخواست وجود دارد یا نه.
if ($request->has('name')) {
}


13- متد hasAny
بررسی می‌کند که آیا حداقل یکی از مقادیر مشخص‌شده در درخواست وجود دارد یا نه.
if ($request->hasAny(['name', 'email'])) {
}


14- متد whenHas
اگر مقدار مشخص‌شده در درخواست وجود داشته باشد، یک تابع را اجرا می‌کند.
$request->whenHas('name', function ($name) {
});


15- متد isNotFilled
بررسی می‌کند که مقدار ورودی وجود نداشته باشد یا خالی باشد.
if ($request->isNotFilled('email')) {
}


16- متد filled
بررسی می‌کند که مقدار مشخص‌شده در درخواست پر شده باشد.
if ($request->filled('email')) {
}


17- متد anyFilled
بررسی می‌کند که حداقل یکی از مقادیر مشخص‌شده در درخواست پر شده باشد.
if ($request->anyFilled(['email', 'phone'])) {
}


18- متد whenFilled
اگر مقدار مشخص‌شده در درخواست پر شده باشد، یک تابع را اجرا می‌کند.
$request->whenFilled('email', function ($email) {
});


19- متد missing
بررسی می‌کند که مقدار مشخص‌شده در درخواست وجود نداشته باشد.
if ($request->missing('email')) {
}


20- متد whenMissing
اگر مقدار مشخص‌شده در درخواست وجود نداشته باشد، یک تابع را اجرا می‌کند.
$request->whenMissing('email', function () {
});


21- متد merge
مقدار جدیدی به داده‌های درخواست اضافه می‌کند.
$request->merge(['role' => 'admin']);


22- متد mergeIfMissing
مقدار جدیدی را فقط در صورتی که وجود نداشته باشد اضافه می‌کند.
$request->mergeIfMissing(['role' => 'user']);


23- متد file
یک فایل آپلودی را در قالب شئ از فایل دریافت می‌کند و می توان عملیات های مختلف مانند ذخیره سازی بر روی آن اجرا کرد.
$file = $request->file('avatar');


24- متد hasFile
بررسی می‌کند که آیا فایلی آپلود شده است یا نه.
if ($request->hasFile('avatar')) {
}


25- متد old
مقدار یک ورودی را از session دریافت می‌کند. (معمولا درخواست قبلی)
$oldValue = $request->old('name');


تا اینجا با تمامی متد های قابل فراخوانی از کلاس Request آشنا شده ایم، در قسمت بعدی به متد های Response خواهیم پرداخت.

🔖 #Laravel, #PHP, #فصل_۶, #لاراول

👤 AmirHossein

💎 Channel: @DevelopixLaravel
فصل شش - Requests and Response

بخش اول - پردازش درخواست و پاسخ


در این قسمت به متدهای Response خواهیم پرداخت.
ریسپانس‌ها، پاسخی هستند ک از سوی کنترلرها برای کلاینت return می‌شوند.
class UserController extends Controller
{
public function store(Request $request)
{
// ...

return response("User Stored!");
}
}

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

معمولا برای ارسال ریسپانس از هلپر فانکشن ها استفاده می شود.
در ادامه با این هلپر ها آشنا می شویم.

1- متد response
ایجاد یک پاسخ ساده.
return response('Hello, World!');

متن "Hello, World!" در مرورگر نمایش داده می‌شود.

2- متد header
افزودن یک هدر (header) به پاسخ.
return response('OK')->header('X-Custom-Header', 'MyValue');


3- متد withHeaders
افزودن چندین header به پاسخ.
return response('Headers Set')->withHeaders([
'X-Header-One' => 'Value1',
'X-Header-Two' => 'Value2',
]);


4- متد cookie
اضافه کردن cookie به پاسخ.
return response('Cookie Set')->cookie('user', 'JohnDoe', 60);


5- متد withoutCookie
حذف یک cookie از پاسخ.
return response('Cookie Removed')->withoutCookie('user');


6- متد view
بازگرداندن یک view به عنوان پاسخ. (فایل های Blade)
return response()->view('welcome');

نمای welcome.blade.php نمایش داده می‌شود.

7- متد json
بازگرداندن یک JSON به عنوان پاسخ.
return response()->json(['name' => 'John', 'age' => 30]);


8- متد withCallback
اضافه کردن JSONP callback به پاسخ JSON.
return response()->json(['name' => 'John'])->withCallback('myCallback');

// Output:
// myCallback({"name":"John"});


9- متد download
دانلود یک فایل از سرور.
return response()->download(storage_path('app/file.pdf'));


10- متد file
نمایش یک فایل بدون دانلود.
return response()->file(storage_path('app/image.jpg'));


11- متد stream
استریم داده‌ها (ارسال محتوا به صورت chunk-شده).
return response()->stream(function () {
echo 'Streaming content...';
});


12- متد streamJson
ارسال JSON به‌صورت استریم.
return response()->streamJson(['status' => 'processing']);


13- متد eventStream
ارسال داده‌ها به‌صورت Server-Sent Events (SSE).
return response()->eventStream(function ($stream) {
$stream->push(['message' => 'Hello, World!']);
});


14- متد streamDownload
دانلود یک فایل به‌صورت stream.
return response()->streamDownload(function () {
echo 'File content...';
}, 'myfile.txt');


15- متد redirect
تغییر مسیر (redirect) به یک URL.
return redirect('/home');


16- متد route
تغییر مسیر (redirect) به یک route.
return redirect()->route('dashboard');


17- متد action
تغییر مسیر (redirect) به یک controller action.
return redirect()->action([HomeController::class, 'index']);


18- متد away
تغییر مسیر (redirect) به یک URL خارجی.
return redirect()->away('https://google.com');


19- متد with
ارسال داده‌های session همراه با redirect.
return redirect()->route('home')->with('message', 'Welcome back!');

یک message در session ذخیره می‌شود و پس از redirect قابل دسترسی است.

20- متد back
بازگشت به صفحه‌ی قبلی.
return redirect()->back();


21- متد withInput
ارسال داده‌های form input در session هنگام redirect.
return redirect()->back()->withInput();


🔖 #Laravel, #PHP, #فصل_۶, #لاراول

👤 AmirHossein

💎 Channel: @DevelopixLaravel
فصل شش - Requests and Response

بخش دوم - اعتبارسنجی درخواست ها


لاراول یک سیستم اعتبارسنجی قدرتمند و انعطاف‌پذیر ارائه می‌دهد که به شما امکان می‌دهد داده‌ها را به راحتی بررسی کرده و از ورود اطلاعات نامعتبر جلوگیری کنید.

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

1- استفاده از متد validate در کنترلر
$request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users',
'password' => 'required|min:8'
]);


این روش برای اعتبارسنجی ساده استفاده می‌شود. اگر داده‌ها نامعتبر باشند، لاراول به‌صورت خودکار یک پاسخ خطا ارسال می‌کند.

2- استفاده از کلاس‌های درخواست سفارشی (Form Request Validation)
برای پروژه‌های بزرگ، بهتر است قوانین اعتبارسنجی را در یک کلاس مجزا تعریف کنید:
php artisan make:request RegisterRequest


سپس در کلاس ایجاد شده، قوانین را در متد rules مشخص کنید.
public function rules(): array
{
return [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
];
}


ایجاد قوانین سفارشی (Custom Rules)

علاوه بر قوانین پیش‌فرض لاراول، می‌توان قوانین سفارشی نیز ایجاد کرد. این ویژگی زمانی مفید است که نیاز به اعتبارسنجی خاصی داشته باشید که در قوانین پیش‌فرض موجود نیست.
php artisan make:rule ValidUsername


در کلاس ValidUsername می‌توان منطق اعتبارسنجی را تعریف و در پروژه استفاده کرد.
public function validate(string $attribute, mixed $value, Closure $fail): void
{
if (strtoupper($value) !== $value) {
$fail('The :attribute must be uppercase.');
}
}


سفارشی‌سازی پیام‌های خطا

لاراول به شما اجازه می‌دهد تا پیام‌های خطای اعتبارسنجی را شخصی‌سازی کنید:
$messages = [
'email.required' => 'Entering an email is required.',
'password.min' => 'The password must be at least 8 characters.',
];
$request->validate($rules, $messages);


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

سیستم اعتبارسنجی در لاراول بسیار قدرتمند، انعطاف‌پذیر و ساده است. با استفاده از روش‌های مختلف مانند Form Request Validation، Custom Rules و شخصی‌سازی پیام‌های خطا، می‌توان داده‌های ورودی را به شکلی بهینه مدیریت کرد و از بروز خطاهای امنیتی و عملکردی جلوگیری کرد.

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

🔖 #Laravel, #PHP, #فصل_۶, #لاراول

👤 AmirHossein

💎 Channel: @DevelopixLaravel
فصل شش - Requests and Response

بخش دوم - اعتبارسنجی درخواست ها


اعتبارسنجی ها عمدتا به 3 روش انجام می شوند. در این پست به 2 روش آن اشاره می شود و روش سوم در پست های بعدی کامل بررسی خواهد شد.

یکی از روش های مرسوم اعتبارسنجی بر روی درخواست ها (ورودی ها POST، GET و...) فراخوانی متد validate از متغیر $request می باشد.
public function store(Request $request)
{
$validated = $request->validate([
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
}


کد بالا درخواست ما را اعتبارسنجی می کند، به عنوان مثال، مقدار input با نام title باید required، unique و طول حداکثر 255 کاراکتر داشته باشد.
اگر همه این ویژگی ها را داشته باشد اعتبارسنجی درخواست موفقیت آمیز بوده، در غیر اینصورت یک آرایه از error ها ایجاد می شود.

روش دیگر اعتبارسنجی استفاده از فساد Validator است:
$validator = Validator::make($request->all(), [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);


کد بالا همانند روش اول است، با این تفاوت که می توان اعتبارسنجی را روی داده های دلخواه (پارامتر اول متد make که برابر تمامی ورودی های درخواست قرار کرفته) انجام داد.

هر دو روش مرسوم و پرکاربرد هستند که بسته به نیاز استفاده می شوند.

پس از انجام اعتبار سنجی یک شئ از Validator باز می گردد که متدهایی در اختیار ما می گذارد، در ادامه به بررسی آنها خواهیم پرداخت.

1- متد fails
این متد بررسی می‌کند که آیا عملیات اعتبارسنجی شکست خورده یا نه.
if ($validator->fails()) {
return response('fails');
}


2- متد validated
اگر اعتبارسنجی موفقیت‌آمیز باشد، این متد فقط داده‌های معتبر (validated) را بازمی‌گرداند. این روش، داده‌های تاییدشده را فیلتر می‌کند.
$validated = $validator->validated();


3- متد stopOnFirstFailure
اگر بخواهید عملیات اعتبارسنجی به‌محض اولین خطا متوقف شود، از این متد استفاده می‌کنید.
$validator = Validator::make($request->all(), [
'name' => 'required',
])->stopOnFirstFailure();


4- متد validate
مقدار اعتبارسنجی‌شده را باز می‌گرداند یا اگر خطایی وجود داشته باشد، به‌صورت خودکار ValidationException پرتاب می‌کند. معمولاً در کنترلر استفاده می‌شود.
$validated = $request->validate([
'name' => 'required',
]);

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

5- متد validateWithBag
مشابه validate() است ولی خطاها را داخل یک Error Bag خاص ذخیره می‌کند. برای مثال وقتی چند فرم در یک صفحه داریم و هرکدام باید خطاهای جداگانه داشته باشند.
$request->validateWithBag('updateProfile', [
'name' => 'required',
]);

درصورت بروز خطا، ارورها در یک Bag با نام updateProfile ذخیره می شوند.

6- متد after
پس از اجرای تمام قوانین اعتبارسنجی، می‌توانید با این متد، اعتبارسنجی‌های سفارشی اضافه کنید.
$validator->after(function ($validator) use ($request) {
if ($request->password !== $request->confirm_password) {
$validator->errors()->add('confirm_password', 'Password is incorrect.');
}
});


7- متد errors
لیست خطاهای اعتبارسنجی را باز می‌گرداند، معمولاً در ترکیب با fails() استفاده می‌شود.
$errors = $validator->errors();


8- متد sometimes
اجرا شدن قوانین اعتبارسنجی را وابسته به شرط خاصی می‌کند.

$validator->sometimes('email', 'required', function ($input) {
return $input->subscribe == true;
});

در این مثال، اگر مقدار subscribe برابر با true باشد، فیلد email اجباری خواهد شد.

متد های دیگری نیز وجود دارد که شامل آموزش نخواهد شد.

درصوتی که یک اعتبارسنجی ناموفق باشد، خطا ها در متغیر $errors در سمت Blade در دسترس خواهد گرفت.
به عنوان مثال:
@if ($errors->any())
@foreach ($errors->all() as $error)
{{ $error }}
@endforeach
@endif

کد بالا درصورت وجود خطا اعتبارسنجی، خطا آنها را به کاربر نمایش می دهد.

همچنین می توان از دایرکتیو @error استفاده کنید:
@error('title')
<div class="alert alert-danger">{{ $message }}</div>
@enderror

این کد در صورتی که اینپوت title با خطا مواجه شود، متن خطای آن را به کاربر نمایش می دهد.

اگر نیاز به خطا ها از یک Bag خاص داشتید می توانید پارامتر دوم را نیز کامل کنید:
@error('title', 'myBag')


تا این بخش با روش اعتبارسنجی درخواست ها و نمایش خطاهای آن آشنا شدید، در قسمت های بعدی با Ruleهای اعتبارسنجی (required|unique|...) آشنا خواهیم شد.

🔖 #Laravel, #PHP, #فصل_۶, #لاراول

👤 AmirHossein

💎 Channel: @DevelopixLaravel