یکی از مرسومترین متد هایی که برای تولید اعداد تصادفی در PHP از اون استفاده میکنیم، متد
متد
متد
ولی با اینحال، هیچ یک از متد های
برای همین اگر نیاز به تولید اعداد رندوم cryptographic دارید، توصیه میکنم از متد های
💎 Channel: @DevelopixPHP
rand هستمتد
rand با وجود استفاده زیاد، تقریبا منسوخ و غیربهینه محسوب میشه و بهصورت drop-in میتونیم با متد جدیدتری بهاسم mt_rand جایگزینش کنیممتد
mt_rand از الگوریتم Mersenne Twister استفاده میکنه که حدودا 4 برابر سریعتر از الگوریتم مورد استفاده rand هستولی با اینحال، هیچ یک از متد های
rand یا mt_rand ایمن نیستند و به اصطلاح cryptographic secure نیستند، در اصل با پی بردن به seed اولیهشون میشه کل بازی رو در دست گرفتبرای همین اگر نیاز به تولید اعداد رندوم cryptographic دارید، توصیه میکنم از متد های
random_int و random_bytes استفاده کنید، که معمولا چندین برابر کندتر از جنریتور های بالا هستند، ولی امنیت بهتری دارند💎 Channel: @DevelopixPHP
👍12❤🔥2👎1🔥1
معمولا در PHP برای سر و کله زدن با String ها از متد های خانواده str استفاده میکنیم
مثلا برای گرفتن اندازه رشته، از متد
نکتهای که حائز اهمیت است، این است که استفاده از متد های str برای کاراکتر های Unicode و UTF توصیه نمیشود
چرا که متد های str به صورت خالی با byte سر و کار دارند
مثلا ایموجیها را در نظر بگیرید، ایموجیها معمولا 3 بایت حجم اشغال میکنند، به این علت که شکل نمایشی آنها با شکل نوشتاری آنها متفاوت است
مثلا
از جمله دلایلی که validate کردن length یا سر و کله زدن با String های یونیکدی و UTF ای را در PHP پیچیده میکند، نداشتن درک درمورد توابع MB است
به صورت خلاصه، اگر سر و کارتان با byte های یک String است، توابع str برای شما کفایت میکند
ولی اگر با متن های غیرساده سر و کار دارید، استفاده از متد های MultiByte یک ضرورت است، هرچند که چندین برابر کندتر است
💎 Channel: @DevelopixPHP
مثلا برای گرفتن اندازه رشته، از متد
strlen و برای پیدا کردن مختصات یک کاراکتر از strpos و به همین ترتیب برای سایر موارد نیز از سایر متد های خانواده str استفاده میکنیمنکتهای که حائز اهمیت است، این است که استفاده از متد های str برای کاراکتر های Unicode و UTF توصیه نمیشود
چرا که متد های str به صورت خالی با byte سر و کار دارند
مثلا ایموجیها را در نظر بگیرید، ایموجیها معمولا 3 بایت حجم اشغال میکنند، به این علت که شکل نمایشی آنها با شکل نوشتاری آنها متفاوت است
مثلا
strlen برای ایموجی 😒 معادل 3 است، ولی mb_strlen آن معادل 1 استاز جمله دلایلی که validate کردن length یا سر و کله زدن با String های یونیکدی و UTF ای را در PHP پیچیده میکند، نداشتن درک درمورد توابع MB است
به صورت خلاصه، اگر سر و کارتان با byte های یک String است، توابع str برای شما کفایت میکند
ولی اگر با متن های غیرساده سر و کار دارید، استفاده از متد های MultiByte یک ضرورت است، هرچند که چندین برابر کندتر است
💎 Channel: @DevelopixPHP
🔥12👍4👎1
اوپن سوله (OpenSwoole) یک Extension بسیار قوی و کارآمد برای PHP است
در واقع OpenSwoole یک مکمل و SuperCharge کننده برای PHP است و قابلیتهایی که PHP همیشه کمبود داشته را به PHP اضافه میکند
از جمله قابلیت های OpenSwoole:
وبسرور HTTP بسیار قدرتمند و سریع با توانایی هندل کردن چندین هزار درخواست بر ثانیه (حداقل 10 برابر بیشتر از وبسرور داخلی PHP)
پشتیبانی از کو روتینها (Coroutine) در PHP و ممکن کردن برنامهنویسی Async
پشتیبانی از Hook های متعدد برای قابلیت های built-in خود PHP از جمله CURL و MySQL و …
پشتیبانی از برنامهنویسی MultiProcess و MultiThread و Async
پشتیبانی از gRPC و قابلیت پروتکلنویسی
قابلیت برنامهنویسی Event Driven و ریختن قیمه JS ها توی ماست PHP ها
و کلی قابلیت دیگه
به صورت خلاصه، اگر PHP کار میکنید و هنوز از OpenSwoole استفاده نمیکنید، دارید کلی مزیت رو از دست میدید
💠 گروه OpenSwoole
💎 Channel: @DevelopixPHP
در واقع OpenSwoole یک مکمل و SuperCharge کننده برای PHP است و قابلیتهایی که PHP همیشه کمبود داشته را به PHP اضافه میکند
از جمله قابلیت های OpenSwoole:
وبسرور HTTP بسیار قدرتمند و سریع با توانایی هندل کردن چندین هزار درخواست بر ثانیه (حداقل 10 برابر بیشتر از وبسرور داخلی PHP)
پشتیبانی از کو روتینها (Coroutine) در PHP و ممکن کردن برنامهنویسی Async
پشتیبانی از Hook های متعدد برای قابلیت های built-in خود PHP از جمله CURL و MySQL و …
پشتیبانی از برنامهنویسی MultiProcess و MultiThread و Async
پشتیبانی از gRPC و قابلیت پروتکلنویسی
قابلیت برنامهنویسی Event Driven و ریختن قیمه JS ها توی ماست PHP ها
و کلی قابلیت دیگه
به صورت خلاصه، اگر PHP کار میکنید و هنوز از OpenSwoole استفاده نمیکنید، دارید کلی مزیت رو از دست میدید
💠 گروه OpenSwoole
💎 Channel: @DevelopixPHP
👍16
یکی از کمبود هایی که در زبان PHP بهعنوان یک زبان برنامهنویسی مدرن امروزی حس میشود، کتابخانههای مرتبط با هوش مصنوعی و یادگیری ماشین است
در راستای جبران این کمبود، کتابخانه RubixML یکی از اولین کتابخانه های Machine Learning و Deep Learning در این زبان است
این کتابخانه دارای ساختار OOP و Developer Friendly برای توسعهدهندگان PHP است
همچنین در حال حاضر بیش از 40 الگوریتم یادگیری نظارت شده و غیرنظارت شده را پشتیبانی میکند
از ETL و پیشپردازش و چندگانهسنجی هم پشتیبانی میکند
در حالت کلی، یکی از کاملترین کیتهای یادگیری ماشین برای PHP است و از Pipeline ها پشتیبانی میکند و دارای Tokenizer های متنوعی است
البته قابل ذکر است که در مقایسه با کتابخانههایی مثل Tensorflow یا ML.net مانند مقایسه 206 با لندکروز عمل میکند و جای توسعه و پیشرفت زیادی دارد
همچنین در حال حاضر Tokenizer های قدرتمندی برای زبانهای یونیکدی مثل فارسی ندارد و باید خودتان پیادهسازی کنید
با این حال، وجود و توسعه چنین کتابخانهای برای PHP خبر خوبی است و آیندهای روشن دارد
💎 Channel: @DevelopixPHP
در راستای جبران این کمبود، کتابخانه RubixML یکی از اولین کتابخانه های Machine Learning و Deep Learning در این زبان است
این کتابخانه دارای ساختار OOP و Developer Friendly برای توسعهدهندگان PHP است
همچنین در حال حاضر بیش از 40 الگوریتم یادگیری نظارت شده و غیرنظارت شده را پشتیبانی میکند
از ETL و پیشپردازش و چندگانهسنجی هم پشتیبانی میکند
در حالت کلی، یکی از کاملترین کیتهای یادگیری ماشین برای PHP است و از Pipeline ها پشتیبانی میکند و دارای Tokenizer های متنوعی است
البته قابل ذکر است که در مقایسه با کتابخانههایی مثل Tensorflow یا ML.net مانند مقایسه 206 با لندکروز عمل میکند و جای توسعه و پیشرفت زیادی دارد
همچنین در حال حاضر Tokenizer های قدرتمندی برای زبانهای یونیکدی مثل فارسی ندارد و باید خودتان پیادهسازی کنید
با این حال، وجود و توسعه چنین کتابخانهای برای PHP خبر خوبی است و آیندهای روشن دارد
💎 Channel: @DevelopixPHP
👍12❤4🔥1
یکی از نکات بسیار مهمی که تقریبا در تمامی زبانها وجود دارد ولی برنامهنویسان از آن آگاه نیستند، منطق اجرای حلقهها میباشد
در تصویر بالا میتوانید ببینید که دو کد مشابه، که اکثرا هم حالت اول آن را مینویسیم، چقدر میتواند باعث غیربهینه بودن کد شود
نکته مهم این پست اینجاست که تمامی کد های داخل condition حلقه، در هر iteration اجرا میشوند و اگر حلقهتان از توابع داینامیک مثل count یا … استفاده میکند، در هر iteration شما آرایه را count میکنید که این بهینه نیست
💎 Channel: @DevelopixPHP
در تصویر بالا میتوانید ببینید که دو کد مشابه، که اکثرا هم حالت اول آن را مینویسیم، چقدر میتواند باعث غیربهینه بودن کد شود
نکته مهم این پست اینجاست که تمامی کد های داخل condition حلقه، در هر iteration اجرا میشوند و اگر حلقهتان از توابع داینامیک مثل count یا … استفاده میکند، در هر iteration شما آرایه را count میکنید که این بهینه نیست
💎 Channel: @DevelopixPHP
👍22🔥1
🤔 میدونستید با php میتونید تگ های html بسازید؟
با استفاده از کلاس DOMDocument این کار امکان پذیر هست
😍 کد بالا بسیار خوانا و ساده نوشته شده برای درک این موضوع
👤 Matin Soleymani
💎 Channel: @DevelopixPHP
با استفاده از کلاس DOMDocument این کار امکان پذیر هست
😍 کد بالا بسیار خوانا و ساده نوشته شده برای درک این موضوع
👤 Matin Soleymani
💎 Channel: @DevelopixPHP
👍28❤2🔥1
Forwarded from | Codilo |
🍉 یلدای امسال رو کُدیلویی بگذرونید!
🍓 تا پایان روز جمعه با دعوت دو کاربر جدید به کدیلو، فایل های کدیلو رو رایگان دریافت کنید
🥝 یلدای خوبی داشته باشید (:
💎 @Codilo
🍓 تا پایان روز جمعه با دعوت دو کاربر جدید به کدیلو، فایل های کدیلو رو رایگان دریافت کنید
🥝 یلدای خوبی داشته باشید (:
💎 @Codilo
❤2
یه چیزی که از php8 اضافه شده و چیز خفنیه همین تعریف پراپرتی ها هست
در پی اچ پی های قدیمی تر روند این بود که توی کلاس Car میبینید پراپرتی ها تعریف میشد و در کانستراکتور مقدار دهی میشد
اما در پی اچ پی هشت به بعد یه روش جدید اومد که کد های مارو کوتاه تر میکنه مثل کلاس Car2
میبینید که پراپرتی ها تعریف نشدن و توی ورودی کانستراکتور هم تعریف و هم مقدار دهی میشن !
که این باعث میشه کد های ما کوتاه تر بشه
و هیچ تغییری توی خروجی ها نداریم
نکته حائز اهمیت این هست که توی Interface ها و توی abstract function ها نمیتونیم از این ویژگی استفاده کنیم :)
👤 Matin Soleymani
💎 Channel: @DevelopixPHP
در پی اچ پی های قدیمی تر روند این بود که توی کلاس Car میبینید پراپرتی ها تعریف میشد و در کانستراکتور مقدار دهی میشد
اما در پی اچ پی هشت به بعد یه روش جدید اومد که کد های مارو کوتاه تر میکنه مثل کلاس Car2
میبینید که پراپرتی ها تعریف نشدن و توی ورودی کانستراکتور هم تعریف و هم مقدار دهی میشن !
که این باعث میشه کد های ما کوتاه تر بشه
و هیچ تغییری توی خروجی ها نداریم
نکته حائز اهمیت این هست که توی Interface ها و توی abstract function ها نمیتونیم از این ویژگی استفاده کنیم :)
👤 Matin Soleymani
💎 Channel: @DevelopixPHP
👍16🔥2
Forwarded from Quera
کوئرا جامعه برنامهنویسان ایران
⌛️۵۰درصد تخفیف فقط تا ۲۴ ساعت
بهترین فرصت شروع PHP
📚 دوره پروژهمحور برنامهنویسی وب با PHP
(آموزش تفکر شیگرایی، امنیت، پایگاهداده، مفاهیم وب و ...)
👨🏻💻 با توسعهی پروژههای واقعی شرکت دیجیکالا 👩🏻💻
⏺ کاملا آنلاین با امکان پرسش و پاسخ با مدرسان دوره
کد تخفیف:
☑️ آشنایی بیشتر با دوره و پیش ثبتنام رایگان:
🔗 https://quera.org/r/49xv9
➖➖➖➖➖➖➖
@Quera_ir
👎4❤3
یه مورد جذاب توی php رو باهم یاد بگیریم :)
توی php 8 به بعد یه ویژگی اضافه شده که شما میتونید هر کدوم از پارامتر فانکشن رو مقدار دهی کنید بزارید از روی تصویر و مثال بگم که بهتر متوجه بشید
ما یه function login داریم که چند تا ورودی میپذیره و دوتا از ورودی ها اپشنال هستن و مقدار دیفالت دارن حالا ما شاید میخوایم به اخرین مورد که مقدار دیفالت داره یه مقداری بدیم اون موقع چی؟
توی php های ورژن قبل مجبور بودیم همه رو مقدار دهی کنیم که به اون مورد برسیم یا که همون مقدار دیفالت رو بهشون بدیم (لاین 8)
اما توی php 8 یه فیچر اضافه شده که شما میتونید با زدن اسم متغییر و یک دو نقطه جلوش مقدار دهی کنید
جوری که توی لاین 14 میبینید
چند تا نکته داره
اگه از این مدل مقدار دهی استفاده کنید باید از اون به بعد رو هم به همین شکل مقدار دهی کنید
همون اسم متغییر رو میزنیم فقط بدون $
** توی فانکشن های خود php هم میتونید از این مورد استفاده کنید و لذت ببرید :))
👤 Matin Soleymani
💎 Channel: @DevelopixPHP
توی php 8 به بعد یه ویژگی اضافه شده که شما میتونید هر کدوم از پارامتر فانکشن رو مقدار دهی کنید بزارید از روی تصویر و مثال بگم که بهتر متوجه بشید
ما یه function login داریم که چند تا ورودی میپذیره و دوتا از ورودی ها اپشنال هستن و مقدار دیفالت دارن حالا ما شاید میخوایم به اخرین مورد که مقدار دیفالت داره یه مقداری بدیم اون موقع چی؟
توی php های ورژن قبل مجبور بودیم همه رو مقدار دهی کنیم که به اون مورد برسیم یا که همون مقدار دیفالت رو بهشون بدیم (لاین 8)
اما توی php 8 یه فیچر اضافه شده که شما میتونید با زدن اسم متغییر و یک دو نقطه جلوش مقدار دهی کنید
جوری که توی لاین 14 میبینید
چند تا نکته داره
اگه از این مدل مقدار دهی استفاده کنید باید از اون به بعد رو هم به همین شکل مقدار دهی کنید
همون اسم متغییر رو میزنیم فقط بدون $
** توی فانکشن های خود php هم میتونید از این مورد استفاده کنید و لذت ببرید :))
👤 Matin Soleymani
💎 Channel: @DevelopixPHP
👍25🔥9
Forwarded from Developix Support
🔴 شتابان هاست 🔴
🔰 تخفیف ویژه 12 درصدی برای
خرید انواع🔹هاست🔹سرور
در شتابان هاست به مناسبت فرا رسیدن عید نوروز 🥳:
✅ https://shetabanhost.com/
🌟 کد تخفیف اختصاصی:
🔗 https://shetabanhost.com/
🌐 پشتیبانی ۲۴ ساعته شتابان هاست👇👇
☎️ 024-91311031
💎 Channel: @shetabanhostcom
🔰 تخفیف ویژه 12 درصدی برای
خرید انواع🔹هاست🔹سرور
در شتابان هاست به مناسبت فرا رسیدن عید نوروز 🥳:
✅ https://shetabanhost.com/
🌟 کد تخفیف اختصاصی:
shetabanhost
🔗 https://shetabanhost.com/
🌐 پشتیبانی ۲۴ ساعته شتابان هاست👇👇
☎️ 024-91311031
💎 Channel: @shetabanhostcom
❤31👍26🔥13
Forwarded from | کانال توسعهدهندگان لاراول |
💢 آموزش View Composer
یکی از نکاتی که باعث بهینه شدن پروژه میشود این است که درخواستهایمان را به سمت سرور برای گرفتن اطلاعات از دیتابیس کمتر کنیم؛ موقعیتی را در نظر بگیرید که نیاز است یک سری اطلاعات از جدول مشخصی را به چندین ویو پاس بدهیم در این شرایط راحتترین کاری که میشود کرد این است که در روت مربوط به همه ویوها یک فانکشن ایجاد کنیم و برای هر کدام عمل کوئری انتخاب از دیتابیس را انجام دهیم و در نهایت داده دریافتی را به ویوهای مربوطه Compact کنیم.
در این شرایط علاوه بر ارسال درخواست تکراری به سمت دیتابیس ما با کدهای تکراری روبهرو هستیم که از بهینه و تمیز بودن کدها کم میکند؛ مورد دومی که شاید به ذهنتان برسد این است که یک متغیر پابلیک ایجاد کنیم و یک بار درخواست ارسال کنیم و چندین جا از آن استفاده کنیم ولی عیبی که این روش دارد این است که این متغیر داخل همه ویوها/کلاسهایی که نیاز به آن متغیر ندارند هم قابل دسترس است و نمیتوان به راحتی مشخص کرد که به کدام ویوها این متغیر ارسال شود.
برای حل چنین عیبهایی میتوان از View Composer ها استفاده کنیم با استفاده از این ویژگی لاراول میتوانیم یک کلاس یا یک تابع Callback به پروژه شناسایی کنیم و مشخص کنیم هر موقع یک View خاصی در حال رندر شدن بود آن کلاس یا تابع که به آن View Composer گفته میشود اجرا شود ( میتوانید نتیجه اجرای ویو کامپوزر و ویوتان هم برای بهینه شدن بیشتر پروژهتان کش کنید تا LCP سایتتان کمتر هم شود )
🔺نوشتن View Composer
ویوکامپوزرها معمولا در Service Provider ها تعریف میشوند که بهتر است یک سرویس پرووایدر اختصاصی ایجاد کنیم و درنهایت آن را به لیست مربوطه اضافه کنیم، برای ایجاد یک سرویس پرووایدر اختصاصی از کد زیر استفاده کنید:
با زدن این دستور یک فایل با نام ViewServiceProvider در مسیر زیر ایجاد میشود:
app/providers
بعد از ساخت فایل مربوطه باید سرویس پرووایدر مان را به لاراول شناسایی کنیم برای این کار تنها کافی است که به فایل config/app.php برید و سرویس پرووایدر تان را به آرایه Providers اضافه کنید با این کار سرویس پرووایدر مربوطه به پروژه شناسایی میشود و وقت آن است که ویو کامپوزر دلخواهمان را ایجاد کنیم.
🔺ایجاد View Composer
برای ایجاد یک ویو کامپوزر تنها کافی است به ViewServiceProvider که در مرحله قبلی ایجاد کردیم برویم و در متد boot این فایل از متد composer که در کلاس view قرار دارد استفاده کنیم:
🔺بررسی کد بالا
داخل پارامتر اول متد composer اسم ویوهایی که میخواهیم این دیتا را داشته باشند مینویسم لازم به ذکر است که میتوان در این قسمت یک آرایه بنویسم و یا مشخص کنیم به کل ویوهای یک پوشه این دیتا ارسال شود برای مثال:
در پارامتر دوم هم مقادیری که باید به ویوهای مربوطه ارسال شود را با with مشخص میکنیم، و درنهایت در ویوهای مربوطه از آنها استفاده میکنیم، صرفا با یک بار ارسال درخواست به سمت دیتابیس و عدم تکرار کد.
🔗 اطلاعات بیشتر و داکیومنت مربوطه
👤 Maryam
💎 Channel: @DevelopixLaravel
یکی از نکاتی که باعث بهینه شدن پروژه میشود این است که درخواستهایمان را به سمت سرور برای گرفتن اطلاعات از دیتابیس کمتر کنیم؛ موقعیتی را در نظر بگیرید که نیاز است یک سری اطلاعات از جدول مشخصی را به چندین ویو پاس بدهیم در این شرایط راحتترین کاری که میشود کرد این است که در روت مربوط به همه ویوها یک فانکشن ایجاد کنیم و برای هر کدام عمل کوئری انتخاب از دیتابیس را انجام دهیم و در نهایت داده دریافتی را به ویوهای مربوطه Compact کنیم.
در این شرایط علاوه بر ارسال درخواست تکراری به سمت دیتابیس ما با کدهای تکراری روبهرو هستیم که از بهینه و تمیز بودن کدها کم میکند؛ مورد دومی که شاید به ذهنتان برسد این است که یک متغیر پابلیک ایجاد کنیم و یک بار درخواست ارسال کنیم و چندین جا از آن استفاده کنیم ولی عیبی که این روش دارد این است که این متغیر داخل همه ویوها/کلاسهایی که نیاز به آن متغیر ندارند هم قابل دسترس است و نمیتوان به راحتی مشخص کرد که به کدام ویوها این متغیر ارسال شود.
برای حل چنین عیبهایی میتوان از View Composer ها استفاده کنیم با استفاده از این ویژگی لاراول میتوانیم یک کلاس یا یک تابع Callback به پروژه شناسایی کنیم و مشخص کنیم هر موقع یک View خاصی در حال رندر شدن بود آن کلاس یا تابع که به آن View Composer گفته میشود اجرا شود ( میتوانید نتیجه اجرای ویو کامپوزر و ویوتان هم برای بهینه شدن بیشتر پروژهتان کش کنید تا LCP سایتتان کمتر هم شود )
🔺نوشتن View Composer
ویوکامپوزرها معمولا در Service Provider ها تعریف میشوند که بهتر است یک سرویس پرووایدر اختصاصی ایجاد کنیم و درنهایت آن را به لیست مربوطه اضافه کنیم، برای ایجاد یک سرویس پرووایدر اختصاصی از کد زیر استفاده کنید:
php artisan make:provider ViewServiceProviderبا زدن این دستور یک فایل با نام ViewServiceProvider در مسیر زیر ایجاد میشود:
app/providers
بعد از ساخت فایل مربوطه باید سرویس پرووایدر مان را به لاراول شناسایی کنیم برای این کار تنها کافی است که به فایل config/app.php برید و سرویس پرووایدر تان را به آرایه Providers اضافه کنید با این کار سرویس پرووایدر مربوطه به پروژه شناسایی میشود و وقت آن است که ویو کامپوزر دلخواهمان را ایجاد کنیم.
🔺ایجاد View Composer
برای ایجاد یک ویو کامپوزر تنها کافی است به ViewServiceProvider که در مرحله قبلی ایجاد کردیم برویم و در متد boot این فایل از متد composer که در کلاس view قرار دارد استفاده کنیم:
View::composer('header',
funcation($view) {
$Categories = Category::all();
$view->with([
'category' => $Categories
]);
});🔺بررسی کد بالا
داخل پارامتر اول متد composer اسم ویوهایی که میخواهیم این دیتا را داشته باشند مینویسم لازم به ذکر است که میتوان در این قسمت یک آرایه بنویسم و یا مشخص کنیم به کل ویوهای یک پوشه این دیتا ارسال شود برای مثال:
View::composer(['panel.*', 'users.header'], ... )در پارامتر دوم هم مقادیری که باید به ویوهای مربوطه ارسال شود را با with مشخص میکنیم، و درنهایت در ویوهای مربوطه از آنها استفاده میکنیم، صرفا با یک بار ارسال درخواست به سمت دیتابیس و عدم تکرار کد.
🔗 اطلاعات بیشتر و داکیومنت مربوطه
👤 Maryam
💎 Channel: @DevelopixLaravel
👍7
Forwarded from | کانال توسعهدهندگان لاراول |
💢 آدرسهای امضاء شده در لاراول
فرض کنید یک سیستم خبرنامه دارید و کاربری درخواست لغو اشتراک خبرنامه را دارد، URL مربوطه میتواند به شکل زیر باشد:
example.com/unsubscribe/4
وقتی کاربری این URL را باز میکند اشتراک خبرنامه کاربری با آیدی 4 لغو خواهد شد، حالا فرض کنید کاربری از روی عمد آیدی 4 را به 60 تغییر بدهد، در این صورت اشتراک خبرنامه کاربری با آیدی 60 هم بدون اطلاع خودش لغو خواهد شد. این سناریو میتواند به مرور باعث لغو اشتراک خبرنامه کلیه کاربران شود؛ یکی از ویژگیهایی که لاراول برای جلوگیری از این خرابکاری دارد، آدرسهای امضاء شده است؛ با استفاده از URL های امضا شده، میتوان تا حدودی از درخواستهای ایجاد شده با URL های اصلاح شده و همچنین از خرابکاریهای احتمالی جلوگیری کرد.
🔺ساختن یک Signed URL
در مثال بالا فرض کردیم URL لغو اشتراک خبرنامه به شکل زیر است:
example.com/unsubscribe/4
در نتیجه روت آن به این شکل خواهد بود:
برای امضاء و امن کردن این URL باید از متد signedRoute که در کلاس URL قرار دارد استفاده کنیم:
نتیجه کد بالا به شکل زیر خواهد داشت:
example.com/unsubcribe/1/?signature=f834ed8570e05de6c50ad10bd6abcf71e9867fcb14bdf2670b4bf572ce346f3b
و اگر کاربری این URL را تغییر داد به هیچوجه معتبر نخواهد بود و میتوان اینگونه از خراب کاریهای احتمالی جلوگیری کرد؛ همچنین لازم به ذکر است که با متد temporarySignedRoute میتوان یک تاریخ انقضاء برای URL مان مشخص کنیم و تعیین کنیم URL مربوطه تا چه زمانی میتواند معتبر باشد:
🔺 اعتبار سنجی آدرسهای امضاء شده
برای اعتبار سنجی آدرسهای مربوطه میتوانید از متد hasValidSignature که در کلاس Request قرار دارد استفاده کنید و بررسی کنید که URL مربوطه معتبر است یا خیر:
همچنین میتوانید از میدلور ValidateSignature استفاده کنید تا عملیات اعتبارسنجی خودکار انجام برای استفاده کردن از این میدلور فقط کافی است که به فایل Kernel.php بروید و کد زیر را اضافه کنید:
و در نتیجه این میدلور را به روتتان اضافه کنید:
از حالا به بعد این روت زمانی به درستی کار خواهد کرد که مقدار پارامتر signature معتبر باشید در غیر این صورت خطای 403 به کاربر نمایش داده میشود.
📍همچنین یک نمونه بسیار ساده از آدرسهای امضاء شده در این مخزن ایجاد کردهام که طبق نیاز میتوانید آن را تغییر داده و استفاده کنید
🔗 اطلاعات بیشتر و داکیومنت مربوطه
👤 Maryam
💎 Channel: @DevelopixLaravel
فرض کنید یک سیستم خبرنامه دارید و کاربری درخواست لغو اشتراک خبرنامه را دارد، URL مربوطه میتواند به شکل زیر باشد:
example.com/unsubscribe/4
وقتی کاربری این URL را باز میکند اشتراک خبرنامه کاربری با آیدی 4 لغو خواهد شد، حالا فرض کنید کاربری از روی عمد آیدی 4 را به 60 تغییر بدهد، در این صورت اشتراک خبرنامه کاربری با آیدی 60 هم بدون اطلاع خودش لغو خواهد شد. این سناریو میتواند به مرور باعث لغو اشتراک خبرنامه کلیه کاربران شود؛ یکی از ویژگیهایی که لاراول برای جلوگیری از این خرابکاری دارد، آدرسهای امضاء شده است؛ با استفاده از URL های امضا شده، میتوان تا حدودی از درخواستهای ایجاد شده با URL های اصلاح شده و همچنین از خرابکاریهای احتمالی جلوگیری کرد.
🔺ساختن یک Signed URL
در مثال بالا فرض کردیم URL لغو اشتراک خبرنامه به شکل زیر است:
example.com/unsubscribe/4
در نتیجه روت آن به این شکل خواهد بود:
Route::get('unsubscribe/{user_id}', '...')->name('unsubscribe');برای امضاء و امن کردن این URL باید از متد signedRoute که در کلاس URL قرار دارد استفاده کنیم:
$url = URL::signedRoute('unsubscribe', ['user_id' => 1]);نتیجه کد بالا به شکل زیر خواهد داشت:
example.com/unsubcribe/1/?signature=f834ed8570e05de6c50ad10bd6abcf71e9867fcb14bdf2670b4bf572ce346f3b
و اگر کاربری این URL را تغییر داد به هیچوجه معتبر نخواهد بود و میتوان اینگونه از خراب کاریهای احتمالی جلوگیری کرد؛ همچنین لازم به ذکر است که با متد temporarySignedRoute میتوان یک تاریخ انقضاء برای URL مان مشخص کنیم و تعیین کنیم URL مربوطه تا چه زمانی میتواند معتبر باشد:
$url = URL::temporarySignedRoute(
'unsubscribe',
now()->addMinutes(60), ['user' => 1]
);🔺 اعتبار سنجی آدرسهای امضاء شده
برای اعتبار سنجی آدرسهای مربوطه میتوانید از متد hasValidSignature که در کلاس Request قرار دارد استفاده کنید و بررسی کنید که URL مربوطه معتبر است یا خیر:
Route::get('unsubscribe/{user_id}/', function (Request $request) {
if (! $request->hasValidSignature()) {
abort(401);
}
// ...
});همچنین میتوانید از میدلور ValidateSignature استفاده کنید تا عملیات اعتبارسنجی خودکار انجام برای استفاده کردن از این میدلور فقط کافی است که به فایل Kernel.php بروید و کد زیر را اضافه کنید:
protected $routeMiddleware = [
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
....
];و در نتیجه این میدلور را به روتتان اضافه کنید:
Route::get('unsubscribe/{user_id}', '...')->name('unsubscribe')->middleware('signed');از حالا به بعد این روت زمانی به درستی کار خواهد کرد که مقدار پارامتر signature معتبر باشید در غیر این صورت خطای 403 به کاربر نمایش داده میشود.
📍همچنین یک نمونه بسیار ساده از آدرسهای امضاء شده در این مخزن ایجاد کردهام که طبق نیاز میتوانید آن را تغییر داده و استفاده کنید
🔗 اطلاعات بیشتر و داکیومنت مربوطه
👤 Maryam
💎 Channel: @DevelopixLaravel
👍14🔥1
❇️ صد درصد در پروژه هایی که کار میکنید میخواید قیمت ها رو به فرمت درست نمایش بدید به عبارت دیگه میخوایم که سه رقم سه رقم جدا کنیم
✳️ برای این که با php فقط کافیه از یک تابع درونی خود php استفاده کنید به شرح زیر :
⚜️ ممکنه بعضی مواقع قیمت به صورت string یا همون متنی در دیتابیس یا به نحو های دیگر قرار گرفته باشه برای استفاده از این تابعه نیاز هست که string رو به number تبدیل کنید که مثال این رو هم باهم خواهیم داشت:
برای مطالعه بیشتر لینک 📕
👤 Matin Soleymani
💎 Channel: @DevelopixPHP
✳️ برای این که با php فقط کافیه از یک تابع درونی خود php استفاده کنید به شرح زیر :
$price = 500000;
number_format($price);
# 500,000
⚜️ ممکنه بعضی مواقع قیمت به صورت string یا همون متنی در دیتابیس یا به نحو های دیگر قرار گرفته باشه برای استفاده از این تابعه نیاز هست که string رو به number تبدیل کنید که مثال این رو هم باهم خواهیم داشت:
$price = "500000";
number_format((int)$price)
# 500,000
برای مطالعه بیشتر لینک 📕
👤 Matin Soleymani
💎 Channel: @DevelopixPHP
👍17❤1👎1
کلاسهای انتزاعی (Abstract Classes) در PHP یکی از مفاهیم پایهای در برنامهنویسی شیگرا هستند.
این کلاسها به عنوان قالبی برای سایر کلاسها عمل میکنند و نمیتوان از آنها به طور مستقیم نمونهسازی (Instantiate) کرد.
به بیان دیگر، شما نمیتوانید یک شی مستقیم از یک کلاس انتزاعی ایجاد کنید.
هدف از کلاسهای انتزاعی، تعریف یک قرارداد برای کلاسهای وراثتی است تا اطمینان حاصل شود که تمام کلاسهای فرزند، روشهای خاصی را پیادهسازی میکنند.
کلاسهای انتزاعی اجازه میدهند تا شما یک سری از توابع (متدها) را که باید در کلاسهای فرزند پیادهسازی شوند، تعریف کنید.
مثال:
فرض کنید میخواهیم یک سیستم برای مدیریت حیوانات در یک باغ وحش ایجاد کنیم.
ما میتوانیم یک کلاس انتزاعی به نام
کلاسهای انتزاعی به شما امکان میدهند تا ساختار پایهای برای کلاسهای فرزند تعریف کنید و اطمینان حاصل کنید که تمام کلاسهای فرزند، رابط کاربری مشخصی را پیادهسازی میکنند.
👤 AmirHossein
💎 Channel: @DevelopixPHP
این کلاسها به عنوان قالبی برای سایر کلاسها عمل میکنند و نمیتوان از آنها به طور مستقیم نمونهسازی (Instantiate) کرد.
به بیان دیگر، شما نمیتوانید یک شی مستقیم از یک کلاس انتزاعی ایجاد کنید.
هدف از کلاسهای انتزاعی، تعریف یک قرارداد برای کلاسهای وراثتی است تا اطمینان حاصل شود که تمام کلاسهای فرزند، روشهای خاصی را پیادهسازی میکنند.
کلاسهای انتزاعی اجازه میدهند تا شما یک سری از توابع (متدها) را که باید در کلاسهای فرزند پیادهسازی شوند، تعریف کنید.
مثال:
فرض کنید میخواهیم یک سیستم برای مدیریت حیوانات در یک باغ وحش ایجاد کنیم.
ما میتوانیم یک کلاس انتزاعی به نام
Animal داشته باشیم که توابع انتزاعی مانند makeSound را تعریف میکند. سپس، کلاسهای فرزند میتوانند این تابع را بر اساس نوع حیوان پیادهسازی کنند.abstract class Animal {
protected $name;
public function __construct($name) {
$this->name = $name;
}
// تابع انتزاعی
abstract public function makeSound();
public function getName() {
return $this->name;
}
}
class Dog extends Animal {
public function makeSound() {
return "Woof";
}
}
class Cat extends Animal {
public function makeSound() {
return "Meow";
}
}
$dog = new Dog("Sag");
echo $dog->getName() . " says " . $dog->makeSound(); // Sag says Woof
$cat = new Cat("Goorbe");
echo $cat->getName() . " says " . $cat->makeSound(); // Goorbe says Meow
در این مثال، Animal یک کلاس انتزاعی است که نمیتوان از آن نمونهسازی کرد. این کلاس یک تابع انتزاعی به نام makeSound تعریف میکند که هر کلاس فرزند باید آن را پیادهسازی کند. Dog و Cat دو کلاس فرزند هستند که از Animal ارثبری میکنند و تابع makeSound را پیادهسازی میکنند.کلاسهای انتزاعی به شما امکان میدهند تا ساختار پایهای برای کلاسهای فرزند تعریف کنید و اطمینان حاصل کنید که تمام کلاسهای فرزند، رابط کاربری مشخصی را پیادهسازی میکنند.
👤 AmirHossein
💎 Channel: @DevelopixPHP
🔥10👍3❤2
اینترفیسها (Interfaces) یکی دیگر از مفاهیم مهم برنامه نویسی شیگرا هستند. آنها به عنوان قراردادی بین کلاسها عمل میکنند و تعیین میکنند که کلاسهایی که این اینترفیسها را پیادهسازی میکنند، باید چه متدهایی را ارائه دهند، و اطمینان میدهند که کلاسهای پیادهسازیکننده، تمام متدهای مورد نیاز را پیادهسازی کنند.
تفاوت با کلاسهای انتزاعی:
یک کلاس میتواند چندین اینترفیس را پیادهسازی کند، در حالی که فقط میتواند از یک کلاس انتزاعی ارثبری کند.
اینترفیسها فقط تعریف متدها را ارائه میدهند و هیچ پیادهسازی متدی ندارند، در حالی که کلاسهای انتزاعی میتوانند شامل پیادهسازی متدها باشند.
اینترفیسها نمیتوانند حاوی پراپرتی ها باشند و فقط میتواند ثابت هارا تعریف کند.
مثال:
فرض کنید میخواهیم یک سیستم برای مدیریت وسایل نقلیه ایجاد کنیم. ما میتوانیم یک اینترفیس به نام
در این مثال،
👤 AmirHossein
💎 Channel: @DevelopixPHP
تفاوت با کلاسهای انتزاعی:
یک کلاس میتواند چندین اینترفیس را پیادهسازی کند، در حالی که فقط میتواند از یک کلاس انتزاعی ارثبری کند.
اینترفیسها فقط تعریف متدها را ارائه میدهند و هیچ پیادهسازی متدی ندارند، در حالی که کلاسهای انتزاعی میتوانند شامل پیادهسازی متدها باشند.
اینترفیسها نمیتوانند حاوی پراپرتی ها باشند و فقط میتواند ثابت هارا تعریف کند.
مثال:
فرض کنید میخواهیم یک سیستم برای مدیریت وسایل نقلیه ایجاد کنیم. ما میتوانیم یک اینترفیس به نام
VehicleInterface داشته باشیم که توابعی مانند start و stop را تعریف میکند. سپس، کلاسهای مختلف وسایل نقلیه میتوانند این اینترفیس را پیادهسازی کنند.interface VehicleInterface {
public function start();
public function stop();
}
class Car implements VehicleInterface {
public function start() {
echo "Car started\n";
}
public function stop() {
echo "Car stopped\n";
}
}
class Bike implements VehicleInterface {
public function start() {
echo "Bike started\n";
}
public function stop() {
echo "Bike stopped\n";
}
}
$car = new Car();
$car->start(); // Car started
$car->stop(); // Car stopped
$bike = new Bike();
$bike->start(); // Bike started
$bike->stop(); // Bike stoppedدر این مثال،
VehicleInterface یک اینترفیس است که تعریف میکند هر وسیله نقلیهای که آن را پیادهسازی میکند باید دارای متدهای start و stop باشد. کلاسهای Car و Bike هر دو این اینترفیس را پیادهسازی میکنند و متدهای مورد نظر را ارائه میدهند. این ساختار اطمینان میدهد که هر وسیله نقلیهای که از این اینترفیس پیروی میکند، قابلیتهای اساسی مشترکی دارد.👤 AmirHossein
💎 Channel: @DevelopixPHP
👍7🔥3
تریتها (Traits) در PHP، مکانیزمی انعطافپذیر برای اشتراکگذاری متدها بین کلاسها هستند. تریتها به شما اجازه میدهند کد های مشترک را به اشتراک بگذارید، بدون آنکه محدودیتهای ارثبری را به همراه داشته باشند.
چگونگی استفاده از تریتها:
تریتها با استفاده از کلمه کلیدی
برای استفاده از تریت در یک کلاس، از کلمه کلیدی
مثال:
فرض کنید میخواهیم علاوه بر توانایی لاگ کردن، قابلیت ثبت تاریخچه را نیز به چندین کلاس اضافه کنیم. میتوانیم از دو تریت استفاده کنیم:
در این مثال، ما دو تریت
استفاده از تریتها با حل تعارض:
گاهی اوقات، دو تریت ممکن است متدهایی با نام یکسان داشته باشند.
در این مثال، کلاس
برای حل این تعارض، ما از عبارت
همچنین، با استفاده از عبارت
👤 AmirHossein
💎 Channel: @DevelopixPHP
چگونگی استفاده از تریتها:
تریتها با استفاده از کلمه کلیدی
trait تعریف میشوند. شما میتوانید درون تریت، متدها و خصوصیاتی را تعریف کنید که میخواهید بین چندین کلاس به اشتراک گذاشته شوند.برای استفاده از تریت در یک کلاس، از کلمه کلیدی
use داخل کلاس استفاده کنید. این کار تمام متدها و خصوصیات تعریف شده در تریت را در دسترس کلاس قرار میدهد.مثال:
فرض کنید میخواهیم علاوه بر توانایی لاگ کردن، قابلیت ثبت تاریخچه را نیز به چندین کلاس اضافه کنیم. میتوانیم از دو تریت استفاده کنیم:
trait LoggerTrait {
public function log($message) {
echo "Log: $message\n";
}
}
trait HistoryTrait {
protected $history = [];
public function addHistory($event) {
$this->history[] = $event;
}
public function getHistory() {
return $this->history;
}
}
class UserActivity {
use LoggerTrait, HistoryTrait;
public function login($username) {
$this->log("User logged in: $username");
$this->addHistory("Login at " . date('Y-m-d H:i:s'));
}
}
// Other Classses ...
$userActivity = new UserActivity();
$userActivity->login('JohnDoe');
print_r($userActivity->getHistory());Log: User logged in: JohnDoe
Array
(
[0] => Login at 2024-03-30 14:26:04
)
در این مثال، ما دو تریت
LoggerTrait و HistoryTrait را تعریف کردهایم. سپس، در کلاس UserActivity، از هر دو تریت با استفاده از کلمه کلیدی use استفاده کردهایم. این کار به UserActivity امکان میدهد که هم از متدهای لاگ کردن و هم از قابلیتهای مربوط به ثبت تاریخچه استفاده کند.استفاده از تریتها با حل تعارض:
گاهی اوقات، دو تریت ممکن است متدهایی با نام یکسان داشته باشند.
PHP امکان مدیریت این تعارضها را با استفاده از عبارت insteadof فراهم میآورد. همچنین، میتوانید با استفاده از عبارت as نام یک متد را در کلاس استفادهکننده تغییر دهید.trait A {
public function doSomething() {
echo "Doing something from A\n";
}
}
trait B {
public function doSomething() {
echo "Doing something from B\n";
}
}
class SampleClass {
use A, B {
A::doSomething insteadof B;
// استفاده از متد doSomething از تریت A و نادیده گرفتن آن از تریت B
B::doSomething as doSomethingFromB;
// تغییر نام متد doSomething از تریت B به doSomethingFromB
}
}
$sample = new SampleClass();
$sample->doSomething();
// Doing something from A
$sample->doSomethingFromB();
// Doing something from Bدر این مثال، کلاس
SampleClass هر دو تریت A و B را استفاده میکند. از آنجا که هر دو تریت متدی با نام doSomething دارند، ما با یک تعارض مواجه هستیم. برای حل این تعارض، ما از عبارت
insteadof استفاده میکنیم تا مشخص کنیم که میخواهیم از پیادهسازی متد doSomething در تریت A استفاده کنیم و پیادهسازی آن در تریت B را نادیده بگیریم. همچنین، با استفاده از عبارت
as، متد doSomething از تریت B را به doSomethingFromB تغییر نام میدهیم تا همچنان بتوانیم به آن دسترسی داشته باشیم، اما با نام جدید.👤 AmirHossein
💎 Channel: @DevelopixPHP
🔥9👍2