Philocode – Telegram
از زیبایی‌های Typenoscript:

interface Todo {
noscript: string;
}

const todo: Readonly<Todo> = {
noscript: "Delete inactive users",
};

todo.noscript = "Hello";

⛔️ Cannot assign to 'noscript' because it is a read-only property.
👍1
Philocode
از زیبایی‌های Typenoscript: interface Todo { noscript: string; } const todo: Readonly<Todo> = { noscript: "Delete inactive users", }; todo.noscript = "Hello"; ⛔️ Cannot assign to 'noscript' because it is a read-only property.
البته توی PHP هم می‌تونیم مثل این رو داشته باشیم، ولی از Utility Typeها خبری نیست و باید داخل خود کلاس تعریف بشه:

class Developer
{
public readonly name;
}

$developer = new Developer();
$developer->name = 'John';

⛔️ Error: Cannot modify readonly property Developer::$name...

اینطوری بیرون از آبجکت نمی‌شه پراپرتی‌هارو تغییر داد.
👍1
Philocode
تعریف‌کردن کلاس‌ها به صورت final، چرا؟ اگه کلمۀ کلیدی final رو به کلاسی اضافه کنیم، امکان extendکردن اون کلاس وجود نخواهد داشت. مثال: <?php final class A {} class B extends A {} خروجی: PHP Fatal error: Class B may not inherit from final class (A) می‌فرمایند…
استثنایی که برای این می‌تونه وجود داشته باشه، دیزاین پترن Template ــــه.

این مثال رو بیبنید:
class SomeJob
{
public function handle()
{
$this->firstStep();
$this->secondStep();
$this->thirdStep();
$this->fourthStep();
}
}
مثلاً اون چهارتا متد، روی همون کلاس SomeJob تعریف شدند و هر کدوم از اونها، مرحله‌ای از انجام کاره؛ مثلاً اولی روغن می‌ریزه، دومی تخم مرغ رو اضافه می‌کنه، سومی نمک رو اضافه می‌کنه و چهارمی هم یه چیز دیگه. Template Pattern می‌گه بذارید که این مراحل قابل overrideکردن باشند، تا بشه بعضی از این مراحل رو توی کلاسی که از این کلاس ارث می‌بره، تغییر داد؛ مثلاً به جای مرحلۀ سوم که نمک می‌ریزه، مرگ موش اضافه کنه. (چه مثال دارکی)

اینجا overrideکردن جزئی از ذات این پترنه و معنی نداره با final از overrideشدنش جلوگیری کنیم!
ساختار لاراول بر اساس Technical Responsibilityهاست، بر خلاف Nest.js که پروژه رو بر حسب ماژول تقسیم می‌کنه و می‌شه بر اساس Domain Modelها پروژه رو پیش برد.
👍1😱1
حتماً دیدید که بعضی از سایت‌ها از markdown استفاده کردند و می‌شه کد زبان‌های مختلفی رو نشون داد:
```php
$sum = $a + $b;
```
ولی شاید این رو ندونید که بعضی جاها از جمله گیت‌هاب، می‌شه به تغییرات (حذف و اضافه) کد با این syntax اشاره کرد:
```diff
- old line
+ new line
```
😱5
Philocode
https://www.youtube.com/watch?v=DuB6UjEsY_Y
می‌دونستید چرا توی PHP متغیرهامون $ دارن؟
ربطی به پول‌دوست‌بودن راسموس نداره؛ صرفاً هدف این بوده که وقتی متغیر رو داخل یه string می‌ذاری، قاطی نشه! 😁
😁4
اگه می‌خوایید REST API رو خیلی عمیق بفهمید و مصاحبه‌کنندۀ بعدی رو خَجَل کنید، این چند صفحه رو بخونید:
https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm
👍3🔥2😁1
چند سالت بود که فهمیدی می‌شه ریسپانس رو اینطوری قابل کش کرد؟ 🤭
🔥4
متد DELETE توی REST API باید idempotent باشه. یعنی اگه من صد بار این ریکوست رو بفرستم:
DELETE /api/students/45
نباید state تغییر کنه، فقط و فقط یک ریسورس (که همون دانش‌آموز کوشا و محترم شمارۀ 45 ــه) حذف می‌شه و دفعات بعدی هم اتفاق جدیدی برای ریسورس student رخ نمی‌ده و صرفاً خطای 404 برمی‌گرده.

حالا چرا این مسئله مهمه؟ برای اینکه ممکنه به دلایل عمدی یا غیر عمدی (مثل خطای شبکه)، یک ریکوست، بیشتر از یک‌بار ارسال بشه.

مثال قبلی درست بود، ولی این مثال رو ببینید:
DELETE /api/students/last
در اینجا با هر بار صدازدن، آخرین نمونه از ریسورس student حذف می‌شه و اگه ده‌بار صدا بزنیم، ده‌تا ریسورس مختلف حذف می‌شن! چنین چیزی اشتباهه، چون قرار بود که متد DELETE به صورت idempotent کار کنه!
🔥7
🔥1
👍1🤔1
😁8
Philocode
Photo
قبلاً ایدۀ این رو داشتم که آدم‌ها کپچا رو بزنن، و ربات فرم رو پر کنه.
چیزی که وقت‌گیره، پرکردن فرم با دیتاهای فیکه، نه زدن کپچا!
کافیه پکیج faker رو نصب کنیم و با Selenium یا ابزار مشابهی صفحه رو باز کنیم!
آپشن اول می‌گه: که اگه یوزر توی ریکوستش یه فیلد اضافه فرستاد، پاکش کن و در نظرش نگیر.
آپشن دوم می‌گه: بیا سخت‌گیرتر باشیم، اگه یوزر فیلد اضافه‌ای فرستاد، بهش خطا نشون بده!

سوال: توی لاراول، اولی رو با متد ()validated به دست می‌آوردیم. اما دومی رو چطوری توی لاراول پیاده می‌کنید؟
🔥2