یکی از مرسومترین متد هایی که برای تولید اعداد تصادفی در 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