| AmirHossein | – Telegram
| AmirHossein |
591 subscribers
44 photos
8 videos
2 files
73 links
نوشته‌های یک برنامه‌نویس ناشی

🫂 @StartUnity
Download Telegram
فصل شش - 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 #لاراول #فصل_۶
@AmirhDeveloper
.
🔥3👍1
فصل شش - 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 #لاراول #فصل_۶
@AmirhDeveloper
.
🔥3🍓1
فصل شش - 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 #لاراول #فصل_۶
@AmirhDeveloper
.
🔥2👍1🍓1
فصل شش - 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 #لاراول #فصل_۶
@AmirhDeveloper
.
🔥3🍓2
یکی دیگه از ویژگی‌های کاملا منطقی LaraGram ورژن 3، سیستم Template هست.

مشابه موتور Blade برای Laravel هست، با این تفاوت که Laravel برای وب به صورت HTML خروجی می‌گیره، ولی ما برای ارسال پیام توی Telegram خروجی میگیریم.

چنین چیزی احتمالا کاربردی نداره، کار رو هم ساده نمی‌کنه؛
ولی از اونجایی که ۸۰ درصد لاراول رو بازنویسی کردم، گفتم Blade هم بنویسم که ساختار اون رو هم یاد بگیرم.

- LaraGram
- Laraquest
- Core

@AmirhDeveloper
.
4🔥2👍1🍓1
‏LaraGram 3 طوری طراحی شده که دولوپر به هر سبک و روشی که دوست داره و مورد نیازش هست کد هاشو بنویسه.

به عنوان مثال فقط 6 روش برای هندل آپدیت ها وجود داره که توی تصاویر هست.

هیچ قابلیتی نیست که توی LaraGram پیدا نشه، فقط و فقط مشکل Async رو داریم که محدود به زبات PHP هست، البته با روش هایی مثل Fork کردن پروسس ها، استفاده از Swoole و AMPHP و ... می تونیم جلوی بلاک شدن ربات رو بگیریم، که LaraGram به طور پیشفرض پروسس هارو Fork میکنه.

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

مورد دیگه بهینگی هست، LaraGram بیشتر از 15 یا حتی 20 مگابایت حجم داره، که روز به روز بیشتر میشه، ولی به واسطه کش ها و سرویس کانتینر، با یک فایل 100 کیلوبایتی برابری میکنه.
هیچ سرویسی اضافی و بی دلیل لود نمیشه و سربار اضافی ایجاد نمیکنه.

قابلیت های فراتر از نیاز توسعه ربات تلگرامی توی LaraGram وجود داره، عملا هر کاری با اون امکان پذیر هست.

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

- LaraGram
- Laraquest
- Core

@AmirhDeveloper
.
🔥6👍1🍓1
فصل شش - 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 [
'noscript' => '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 #لاراول #فصل_۶
@AmirhDeveloper
.
🔥3🍓1
سال نوی همه مبارک
سال خوب و پربرکتی در کنار خانواده و دوستانتون داشته باشید❤️🔥
14🔥3🍓2
دیگه LaraGram داره از کنترل خارج میشه
2🗿6
تعطیلات هم تموم شد، ایشالا از فردا ادامه دوره لاراول رو شروع می‌کنیم.

یکم حمایت هم بکنید از کانال، از ۸۰۰ تا شدیم ۶۰۰ تا. 🤝❤️
👍6
فصل شش - Requests and Response

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


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

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


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

روش دیگر اعتبارسنجی استفاده از فساد Validator است:
$validator = Validator::make($request->all(), [
'noscript' => '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('noscript')
<div class="alert alert-danger">{{ $message }}</div>
@enderror

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

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


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

#laravel #لاراول #فصل_۶
@AmirhDeveloper
.
3🍓1
یه مجموعه پست از PHP Streams هم نوشتم و در کنار پست های لاراول ارسال می‌کنم.
🍓2
استریم‌ ها در PHP - قسمت اول

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

به جای آنکه برای هر نوع منبع تابع‌ها یا روش‌های جداگانه‌ای داشته باشید، PHP با استفاده از استریم‌ها یک مجموعه توابع عمومی (مثل fopen, fread, fwrite و ...) فراهم کرده که با همه این منابع به شکل یکنواخت رفتار می‌کنند.

هر استریم رَپر (Stream Wrapper) در PHP در واقع یک پروتکل یا طرح (scheme) خاص را پیاده‌سازی می‌کند که به صورت scheme:// استفاده می‌شود. برای مثال، file:// برای دسترسی به سیستم فایل محلی، http:// برای منابع وب، یا php:// برای منابع داخلی PHP استفاده می‌شود.

‏PHP به طور پیش‌فرض تعداد زیادی استریم رپر داخلی دارد که بسیاری از کارهای معمول را پوشش می‌دهند. شما می‌توانید توسط این استریم‌ها به سادگی کارهایی مثل خواندن فایل‌ها، دریافت داده از وب, نوشتن خروجی، خواندن ورودی خام درخواست‌ها و حتی کار با داده‌های فشرده‌شده را انجام دهید، بدون اینکه نگران جزئیات سطح پایین هر کدام باشید.

استریم‌های داخلی PHP - ‏php://

1- php://input

این استریم برای دسترسی به دادهٔ ورودی خام HTTP در PHP استفاده می‌شود. به طور خاص، این استریم محتوای خام بدنهٔ درخواست HTTP را (معمولاً در درخواست‌های POST یا PUT) ارائه می‌کند، بدون هیچ‌گونه پردازش یا parse خودکار.

زمانی که نیاز دارید ورودی خام درخواست را بخوانید (مثلاً دریافت داده‌های JSON از یک API کلاینت یا پردازش درخواست‌های RESTful)، این استریم بسیار مفید است. برخلاف متغیرهای سراسری مانند $_POST که فقط داده‌های form-urlencoded را می‌گیرند،
این استریم اجازه می‌دهد انواع داده‌ها (JSON, XML, متن خام و ...) را مستقیماً از بدنهٔ درخواست دریافت کنید.

$json = file_get_contents("php://input");
$data = json_decode($json, true);
echo "Hello " . $data["user"];

در این مثال، محتوای خام ورودی HTTP با file_get_contents از php://input خوانده شده و سپس از JSON به آرایه PHP تبدیل می‌گردد.
در نهایت نام کاربر خروجی گرفته می‌شود. اگر درخواست فوق رشتهٔ JSON
{"user": "Ali"}

را ارسال کرده باشد، خروجی برنامه Hello Ali خواهد بود.

توجه داشته باشید php://input فقط خواندنی است و فقط یک بار می‌توان محتوا را از آن خواند، یعنی پس از خواندن، محتوای آن خالی می‌شود. همچنین در مورد درخواست‌های معمولی فرم (مانند multipart/form-data برای آپلود فایل)، استفاده از این استریم توصیه نمی‌شود، زیرا PHP آن داده‌ها را قبلاً پردازش کرده است.

2- php://output

این استریم خروجی استاندارد اسکریپت PHP را نمایندگی می‌کند. هر داده‌ای که در آن نوشته شود، مستقیماً به خروجی معمول برنامه (همان چیزی که مرورگر دریافت می‌کند یا در CLI ترمینال نشان داده می‌شود) فرستاده می‌شود.
زمانی که بخواهید با توابع استریم داده‌ای را به خروجی بفرستید (به جای استفاده از echo یا print)، می‌توانید php://output را مانند یک فایل باز کرده و در آن بنویسید.

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

$fp = fopen("php://output", "w");
fwrite($fp, "Hello World!");
fclose($fp);

در این قطعه کد، ما استریم خروجی را باز کرده‌ایم و یک خط متن را با fwrite در آن نوشتیم. نتیجهٔ اجرای این کد نمایش متن ذکر شده در خروجی (مثلاً مرورگر یا کنسول) است. در واقع کاری که fwrite در اینجا انجام می‌دهد معادل همان echo کردن رشته‌ها است.

در قسمت های بعدی با سایر استریم‌ها در PHP آشنا خواهیم شد.

#PHP #PHP_streams
@AmirhDeveloper
.
2🔥3🍓3
استریم‌ ها در PHP - قسمت دوم

3- php://stdin

این استریم نمایانگر ورودی استاندارد (STDIN) فرایند PHP است. در محیط خط فرمان (CLI)، php://stdin همان داده‌ای است که از کاربر یا از ورودی pipeline دریافت می‌شود.

در اسکریپت‌های PHP CLI که نیاز به خواندن ورودی کاربر از کنسول یا داده‌های piped از فرمان دیگر دارند، می‌توان این استریم را به کار برد. به عنوان مثال، برنامه‌ای که منتظر می‌ماند کاربر در ترمینال متنی وارد کند یا نتیجه اجرای یک دستور دیگر را از طریق pipe دریافت کند.

$fp = fopen("php://stdin", "r");
echo "Enter Your name: ";
$inputLine = fgets($fp);
echo $inputLine;
fclose($fp);

این اسکریپت ابتدا پیغام درخواست ورودی را در کنسول نمایش می‌دهد. سپس با fopen استریم را باز کرده و با fgets یک خط از آن می‌خواند (منتظر می‌ماند تا کاربر یک خط متن وارد کرده و Enter بزند). در نهایت همان خط را مجدداً در خروجی نمایش می‌دهد.

این استریم فقط خواندنی است و مخصوص محیط‌های تعاملی یا ورودی‌های خط فرمان می‌باشد (در حالت اجرای وب معمولاً کاربردی ندارد).
———
4- php://stdout

این استریم معادل خروجی استاندارد (STDOUT) در PHP است. در حالت CLI، هر چیزی که به php://stdout نوشته شود در کنسول به نمایش در می‌آید (مشابه عملکرد echo).

بیشتر در اسکریپت‌های خط فرمان کاربرد دارد، زمانی که بخواهید به صورت صریح به STDOUT بنویسید. هرچند در عمل استفاده مستقیم از php://stdout تفاوتی با php://output (در حالت CLI) ندارد، اما ممکن است برای شفاف‌سازی منظور یا برای کدنویسی سیستم‌هایی که مستقیماً با توصیف‌گرهای STDOUT کار می‌کنند، استفاده شود.

$fp = fopen("php://stdout", "w");
fwrite($fp, "Test message on STDOUT");
fclose($fp);

اجرای این کد در محیط خط فرمان، متن "Test message on STDOUT" را در خروجی ترمینال نمایش می‌دهد. این همان خروجی استاندارد برنامه است.

توجه کنید که در محیط وب (مثلاً اجرای PHP از طریق Apache یا Nginx)، STDOUT همان خروجی HTML ارسالی به مرورگر است، لذا php://stdout در آن context معادل php://output عمل می‌کند.
———
5- php://stderr

این استریم متناظر با خروجی خطا (STDERR) در PHP است. STDOUT و STDERR هر دو خروجی هستند اما به طور مجزا مدیریت می‌شوند؛ معمولاً STDOUT برای خروجی معمول برنامه و STDERR برای پیام‌های خطا یا لاگ خطاها استفاده می‌شود.

در اسکریپت‌های CLI یا محیط‌هایی که می‌خواهید پیام‌های خطا را جدا از خروجی معمول ارسال کنید. برای مثال، می‌توانید لاگ خطا یا هشدارها را به این استریم بنویسید تا در کنسول یا لاگ سرور به عنوان خطا ثبت شوند، بدون اینکه جریان عادی خروجی (STDOUT) را مختل کنند.

$fp = fopen("php://stderr", "w");
fwrite($fp, "Err: Not found!");
fclose($fp);

این قطعه کد در محیط خط فرمان، متن خطا را به STDERR می‌فرستد. در نتیجه اگر برنامه را اجرا کنید، پیغام "Err: Not found!" به عنوان خروجی خطا ثبت می‌شود (در ترمینال معمولاً با رنگ قرمز یا در جریان مجزا نمایش داده می‌شود).

در حالت وب، محتوایی که به آن نوشته شود توسط وب‌سرور ممکن است در لاگ خطای سرور ثبت گردد.
———
6- php://memory

این استریم یک فضای حافظه موقتی در RAM ایجاد می‌کند که می‌توان مانند یک فایل با آن رفتار کرد. تمام داده‌هایی که در php://memory نوشته می‌شوند، در حافظه RAM ذخیره می‌شوند. هنگامی که نیاز دارید یک رشته یا داده حجیم را موقتاً مانند یک فایل مدیریت کنید اما نمی‌خواهید روی دیسک نوشته شود.

برای مثال تولید محتوای پویا (مثل ایجاد یک فایل CSV در حافظه و سپس ارائه آن برای دانلود) یا جمع‌آوری خروجی‌های متعدد و سپس پردازش یا ارسال آن. مزیت استفاده از حافظه این است که عملیات سریع‌تر است (عدم نیاز به دیسک) البته به میزان حافظهٔ قابل دسترس PHP محدود است.

$fp = fopen("php://memory", "r+");
fwrite($fp, "Foo");
fwrite($fp, "Bar");

rewind($fp);
echo stream_get_contents($fp); // FooBar
fclose($fp);

در این مثال، ابتدا یک استریم حافظه باز می‌کنیم (r+ به معنی خواندن/نوشتن). سپس دو رشته "Foo" و "Bar" در آن نوشته می‌شود. با rewind مکان فایل را به ابتدای حافظه برمی‌گردانیم و با stream_get_contents کل محتوا را می‌خوانیم؛ حاصل رشتهٔ "FooBar" است که نشان می‌دهد داده‌ها با موفقیت در حافظه جمع‌آوری شده‌اند.

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

در قسمت های بعدی با سایر استریم‌ها در PHP آشنا خواهیم شد.

#PHP #PHP_streams
@AmirhDeveloper
.
👍8
استریم‌ ها در PHP - قسمت سوم

7- php://temp

این استریم نیز رفتاری شبیه به php://memory دارد با این تفاوت که اگر حجم داده‌های نوشته‌شده از مقدار معینی بیشتر شود، به طور خودکار محتوا را در یک فایل موقت روی دیسک ذخیره می‌کند تا حافظه زیادی مصرف نشود (حد پیش‌فرض معمولاً ۲ مگابایت است).

مانند php://memory برای نگهداری موقت داده‌ها استفاده می‌شود، با این اطمینان که اگر داده خیلی بزرگ شد، به جای پر کردن RAM، به دیسک منتقل می‌شود.

این استریم برای مواردی مفید است که اندازهٔ داده از قبل مشخص نیست و ممکن است کوچک یا بسیار بزرگ باشد. شما می‌توانید بدون نگرانی از مدیریت دستی حافظه/دیسک، به سادگی داده‌ها را در php://temp بنویسید.

$fp = fopen("php://temp", "r+");
fwrite($fp, "temp data");
rewind($fp);
echo fgets($fp); // temp data
fclose($fp);

این کد رشته "temp data" را در استریم موقتی می‌نویسد و سپس با بازگشت به ابتدا، آن را می‌خواند و چاپ می‌کند. از آنجا که حجم این داده کم است، همه چیز در حافظه انجام می‌شود. اما اگر به جای یک رشتهٔ کوتاه، مثلاً چند مگابایت داده می‌نوشتیم، php://temp پس از عبور از آستانهٔ تعیین‌شده، به طور خودکار داده‌ها را در یک فایل موقت ذخیره می‌کرد.

این جزئیات برای برنامه‌نویس شفاف است و نیاز به تغییر کد نیست.

———
8- php://filter

این استریم امکان فیلتر کردن (پردازش) داده‌های ورودی یا خروجی را در حین خواندن/نوشتن فراهم می‌کند. در واقع php://filter خودش منبع نهایی داده نیست، بلکه لایه‌ای واسط است که می‌توانید آن را قبل از یک منبع دیگر قرار دهید تا داده‌ها را طی عملیات خواندن یا نوشتن تغییر دهد.

به عنوان مثال می‌توانید هنگام خواندن از یک فایل، تمام حروف را به بزرگ (uppercase) تبدیل کنید، یا هنگام نوشتن در یک فایل، داده‌ها را مثلاً به صورت Base64 کدگذاری کنید. این کار با تعریف فیلترهای موجود PHP مانند
string.toupper,
string.strip_tags,
convert.base64-encode
و غیره ممکن است.

$content = file_get_contents("php://filter/read=string.toupper/resource=input.txt");
echo $content;

در این مثال، ما از استریم فیلتر استفاده کرده‌ایم تا محتوای فایل input.txt را با فیلتر string.toupper (که همه حروف انگلیسی را به بزرگ تبدیل می‌کند) بخوانیم.

عبارت resource=input.txt در واقع به PHP می‌گوید منبع نهایی input.txt است اما قبل از تحویل داده، فیلتر string.toupper را بر داده‌های خوانده‌شده اعمال کن.

نتیجهٔ این کد نمایش محتوای فایل به صورت حروف بزرگ است، بدون اینکه نیاز باشد پس از خواندن، خودمان تابعی برای بزرگ‌کردن حروف صدا بزنیم. به همین شکل فیلترهای متنوعی برای حذف تگ‌های HTML، انکود/دیکود کردن Base64، فشرده‌سازی و... وجود دارد که می‌توان در php://filter به کار گرفت.

توجه داشته باشید که نحوه نگارش می‌تواند برای نوشتن نیز باشد
مثلاً
php://filter/write=<filter>/resource=<...>
هنگام fwrite و حتی می‌توان فیلترها را زنجیره‌ای اعمال کرد.

———
9- php://fd

این استریم امکان دسترسی مستقیم به یک توصیف‌گر فایل باز سیستم‌عامل (file denoscriptor) را فراهم می‌کند. در محیط‌های یونیکس، هر فرایند مجموعه‌ای شماره‌گذاری‌شده از توصیف‌گرهای فایل دارد:
0 برای STDIN
1 برای STDOUT
2 برای STDERR
و اعداد بالاتر برای فایل‌ها یا سوکت‌های باز.

با استفاده از
php://fd/<number>
می‌توان به توصیف‌گر مربوطه در PHP دسترسی گرفت.

این قابلیت نسبتاً خاص است و عمدتاً در اسکریپت‌های CLI یا موارد خیلی پیشرفته استفاده می‌شود. برای مثال اگر PHP توسط یک فرایند دیگر با توصیف‌گرهای اضافی فراخوانی شود (مثلاً denoscriptor 3 به یک فایل خاص اشاره کند)، می‌توان از php://fd/3 برای دسترسی به آن استفاده کرد. یا جهت تأیید، php://fd/1 اساساً خروجی استاندارد و معادل php://stdout است.

$fp = fopen("php://fd/1", "w");
fwrite($fp, "Test via FD 1\n");
fclose($fp);

در اینجا با بازکردن php://fd/1، مستقیماً به خروجی استاندارد نوشته‌ایم؛ این کار همان اثر php://stdout را دارد.

در عمل شما ممکن است کمتر مستقیماً از php://fd استفاده کنید مگر در شرایط خاص، زیرا PHP معادل‌های راحت‌تری برای STDIN/STDOUT/STDERR دارد. اما دانستن وجود آن برای موارد پیچیده (یا مثلاً تعامل با کتابخانه‌هایی که denoscriptorها را مدیریت می‌کنند) خالی از لطف نیست.

در قسمت های بعدی با سایر استریم‌ها در PHP آشنا خواهیم شد.


#PHP #PHP_streams
@AmirhDeveloper
.
🔥2🍓2
استریم‌ ها در PHP - قسمت چهارم

استریم‌های سیستم فایل (File Streams)

1- file://

این استریم امکان دسترسی به سیستم فایل محلی سرور را فراهم می‌کند. file:// در PHP پیش‌فرض‌ترین استریم است؛ یعنی حتی اگر هیچ پروتکلی قبل از مسیر فایل ننویسید و مستقیم مسیری را بدهید، در واقع از همین پروتکل فایل استفاده می‌شود.

با file:// می‌توانید فایل‌های روی دیسک محلی را بخوانید، بنویسید، ایجاد کنید یا تغییر نام دهید – درست مانند کاری که با توابع معمول فایل انجام می‌دهید.

خواندن و نوشتن فایل‌های معمولی. مثلاً خواندن محتوای یک فایل متنی جهت نمایش در صفحه، نوشتن لاگ در یک فایل .log، ایجاد یک فایل پیکربندی و ... . از آنجا که این پروتکل به منابع محلی دسترسی دارد، امنیت آن وابسته به دسترسی‌های فایل‌سیستم است (PHP فقط می‌تواند فایل‌هایی را بخواند/بنویسد که مجوزش را دارد).

$data = file_get_contents("file://example.txt");
echo $data;

در این مثال، تابع file_get_contents را با مسیر file://... صدا زده‌ایم تا محتوای فایل example.txtخوانده شود.

استفاده از file:// در اینجا اختیاری است؛ زیرا اگر به جای آن مستقیماً مسیر فایل را می‌نوشتیم (مثلاً "example.txt")، PHP به صورت خودکار از استریم فایل استفاده می‌کرد.

توجه داشته باشید برای اشاره به مسیرهای مطلق در سیستم‌عامل ویندوز، سه اسلش بعد از file: لازم است .
مثال:
file:///C:/path/to/file.txt


———
2- glob://

این استریم رپر امکان استفاده از الگوهای glob را به شکل یک منبع داده فراهم می‌کند. به طور معمول، تابع glob() در PHP رشته‌های مسیر را بر اساس الگو (pattern) تطبیق داده و لیستی از نام فایل‌ها را برمی‌گرداند. glob:// این قابلیت را در قالب یک استریم پیاده‌سازی می‌کند که می‌توان آن را مانند یک دایرکتوری مجازی پیمایش کرد.

زمانی که بخواهید با استفاده از یک الگوی خاص، مجموعه‌ای از فایل‌ها یا مسیرها را پردازش کنید. مثلاً پیدا کردن همه فایل‌های .log در یک پوشه و خواندن تک‌تک آن‌ها. با این استریم می‌توانید این کار را بدون صدا زدن تابع جداگانه glob و سپس حلقه روی نتایج، انجام دهید – مستقیماً به عنوان یک پوشه با محتوای فیلترشده باز می‌کنید.

if ($dir = opendir("glob://*.txt")) {
while (($file = readdir($dir)) !== false) {
echo "Found: $file\n";
}
closedir($dir);
}

در این قطعه کد، از opendir با مسیر glob://*.txt استفاده کرده‌ایم. نتیجهٔ این opendir مثل این است که یک دایرکتوری باز کرده باشیم که فقط شامل فایل‌هایی است که با الگوی *.txt تطابق دارند. سپس با readdir در یک حلقه، تک‌تک نام این فایل‌ها را می‌خوانیم و چاپ می‌کنیم. در نهایت closedir را فراخوانی می‌کنیم.

استفاده از glob:// می‌تواند کدنویسی را در شرایطی که می‌خواهید روی مجموعه‌ای از فایل‌های منطبق با الگو کار کنید ساده‌تر کند.

در قسمت های بعدی با سایر استریم‌ها در PHP آشنا خواهیم شد.

#PHP #PHP_streams
@AmirhDeveloper
.
5🍓1
استریم‌ ها در PHP - قسمت پنجم

- استریم‌های شبکه‌ای (HTTP و FTP)

1|2- http:// and https://

این استریم رپر برای دسترسی به منابع از طریق پروتکل HTTP (و HTTPS) به کار می‌رود. با استفاده از آن می‌توانید در PHP محتوای یک صفحه وب، API یا هر URL اینترنتی را مستقیماً بخوانید یا حتی داده‌ای را به آن ارسال کنید.

نکته: در حالت ارسال داده، معمولاً بهتر است از توابع مخصوص HTTP یا کتابخانه‌های وب استفاده شود، اما خواندن مستقیم رایج است.

متداول‌ترین کاربرد آن دریافت محتوای وب از داخل PHP است. برای مثال، خواندن خروجی یک API خارجی، واکشی محتوای یک صفحه وب جهت parse کردن، یا حتی دانلود یک فایل از اینترنت از طریق PHP.

$homepage = file_get_contents("http://www.example.com");
echo $homepage;

این کد با استفاده از file_get_contents محتوای خام HTML صفحه example.com را دریافت کرده و آن را echo می‌کند. در نتیجه HTML آن وب‌سایت (که شامل یک عنوان "Example Domain" و متن نمونه است) در خروجی ظاهر می‌شود.

همان‌طور که اشاره شد، https:// نیز پشتیبانی می‌شود و استفاده از آن مشابه http:// است.

———
3|4- ftp:// and ftps://

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

نسخهٔ امن FTP یعنی FTPS (FTP over SSL) نیز با پیشوند ftps:// در دسترس است، مشروط بر اینکه کتابخانه‌های لازم (مانند OpenSSL) فعال باشند.

کاربرد آن در دریافت یا ارسال فایل از/به یک سرور FTP از طریق PHP. برای مثال، اسکریپتی که هر شب یک فایل پشتیبان را از سرور دیگری دانلود می‌کند، یا سرویسی که یک فایل آپلودشده را روی FTP دیگری ذخیره می‌کند و... .

$data = file_get_contents("ftp://speedtest.tele2.net/1KB.zip");
file_put_contents("local_test.zip", $data);

در این مثال، به یک FTP عمومی متصل می‌شویم که یک فایل تست 1KB ارائه می‌دهد. با file_get_contents محتوای فایل باینری 1KB.zip را از طریق FTP دریافت کرده و سپس آن را با file_put_contents در یک فایل محلی (local_test.zip) ذخیره می‌کنیم.

در صورتی که FTP نیاز به احراز هویت داشت، باید در URL لحاظ شود، مثلاً:
ftp://username:password@ftp.example.com/pub/file.txt


برای نوشتن فایل در FTP نیز می‌توانید از fopen با مود w یا fwrite استفاده کنید، مشابه کار با فایل محلی، فقط باید دسترسی نوشتن روی سرور FTP داشته باشید.

- استریم‌های فشرده‌سازی و آرشیو

1|2- compress.zlib:// and compress.bzip2://

این رپر‌ها امکان فشرده‌سازی یا بازکردن داده‌ها را به صورت شفاف فراهم می‌کنند. compress.zlib:// در واقع برای کار با جریان‌های فشرده به فرمت gzip/zlib استفاده می‌شود و compress.bzip2:// برای فرمت BZip2.

شما با این استریم‌ها می‌توانید مستقیماً یک فایل فشرده (مثلاً یک فایل .gz یا .bz2) را باز کرده و محتوای غیرفشرده‌شدهٔ آن را بخوانید، یا بالعکس هنگام نوشتن، داده‌ها را به صورت فشرده ذخیره کنید.

خواندن فایل‌های متنی یا داده‌هایی که با gzip یا bzip2 فشرده شده‌اند بدون نیاز به اجرای دستی ابزارهای فشرده‌سازی. برای مثال، اسکریپتی که باید محتوای یک فایل لاگ فشرده‌شده را بخواند، می‌تواند مستقیماً آن را با compress.zlib:// باز کند. همچنین برای ساخت خروجی‌های فشرده (مثلاً ایجاد فایل CSV و ذخیره آن به صورت gzip) می‌توان در مسیر نوشتن از این رپر استفاده کرد.

توجه داشته باشید که استفاده از این استریم‌ها نیازمند فعال بودن کتابخانه‌های مربوطه در PHP است (zlib معمولاً به صورت پیش‌فرض وجود دارد، bzip2 نیز در بسیاری از توزیع‌ها فعال است).

$compressedFp = fopen("compress.zlib://logs_2025-04-03.txt.gz", "r");
$line = fgets($compressedFp);
echo $line;
fclose($compressedFp);

فرض کنیم فایلی به نام logs_2025-04-03.txt.gz داریم که با gzip فشرده شده است. در این مثال با fopen و پیشوند compress.zlib:// آن را باز می‌کنیم. سپس با fgets یک خط از محتوای غیرفشرده‌شده را می‌خوانیم و نمایش می‌دهیم. PHP به طور خودکار داده‌ها را از حالت فشرده خارج می‌کند، بنابراین نیازی نیست ابتدا فایل را دستی gunzip کنید.

استفاده از compress.bzip2:// نیز دقیقاً به همین شکل است، با این تفاوت که فشرده‌سازی با الگوریتم BZip2 انجام می‌شود و معمولاً برای فایل‌های .bz2 به کار می‌رود.

در قسمت های بعدی با سایر استریم‌ها در PHP آشنا خواهیم شد.

#PHP #PHP_streams
@AmirhDeveloper
.
4🍓1
دوستان دو مورد رو بگم بهتون

یک اینکه، دوره لاراول رو یه وقفه طولانی انداختم.
حقیقتا بعد ۵ فصل مخصوصا فصل های مربوط به دیتابیس خیلی خسته شدم و یه استراحتی کردم😂
الان مجدد دارم می‌نویسم، و به زودی مثل قبل هر روز یک پست میذارم ازش.

دوم اینکه، من معمولا همه دوره هارو خودم می‌نویسم، ولی این دوره PHP Streams به صورت خاص با Chat GPT و حالت Deep Research نوشته شده.
هدف من تست این قابلیت GPT بود، ولی خیلی کامل و جامع توضیح داد، منم یه سری تغییرات ریز دادم و به صورت پست به اشتراک میذارمش.

سوم اینکه، از محتوا هم یک حمایتی بکنید بیشتر دیده بشه، و ممنون از دوستانی که حمایت کردن❤️
8🍓2