۱۳ اردیبهشت، ۱۳۹۹

۵ ماه پیش ١۰۰+ امتیاز
@daniel58 به گفتگوی مشخصات سایت جواب داد.

@matin افزونه wappalyzer بر اساس پارامتر های تشخیص میدن سایت از چه تکنولوژی های استفاده می کنه. شما می توانید سورس افزونه wappalyze را مشاهده کنید و متوجه بشید، مثلا چطور لاراول رو تشخیص میده. و سپس آنها رو تغییر بدید.

۵ ماه پیش ١۰۰+ امتیاز
@daniel58 به گفتگوی طراحی اختصاصی بخش توکن های لاراول جواب داد.

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

۱۲ اردیبهشت، ۱۳۹۹

۵ ماه پیش ١۵۰۰+ امتیاز
نویسنده @daniel58 یک مقاله تازه به اسم سشن مولتی ساب دامین در لاراول نوشت.

سایت های متعددی دیدم که در یک زیردامنه کاربر احراز هویت می شود و در همه زیر دامنه دیگر کاربر به عنوان کاربر احراز هویت شده شناسایی می شود. شاید برای بعضی کاربران یا برنامه نویسان سوال پیش میاد، چطور این قابلیت پیاده سازی میشه؟ برای پیاده سازی این قابلیت راه های زیادی وجود دارد و ما در این مقاله بعضی از آنها رو توضیح میدیم. پس با ما همراه باشید.

پیاده سازی این قابلیت به دو روش مختلف است و هر روش بر اساس ساختار برنامه شماست. اگر برنامه شما روی یک codebase لاراول است و چندین زیر دامنه به آن وصل شده است، روش اول رو گزینش کنید اما اگر ساختار برنامه شما به این صورت است که هر برنامه روی یک زیردامنه در دسترس است، روش دوم را گزینش کنید.

روش اول

فایل .env موجود در روت برنامه لاراولی تان را باز کرده و سپس کدهای زیر را اضافه کنید و اگر موجود هستند انها را جایگزین کنید.

SESSION_COOKIE=daniel_session

SESSION_DOMAIN=.daniel.local

در SESSION_COOKIE اسم کلید کوکی که در آن کلید سشن ذخیره می شود را وارد کنید برای مثال ما daniel_session را وارد کرده ایم. و در SESSION_DOMAIN آدرس دامنه خود را وارد کنید برای مثال ما دامنه daniel.local را وارد کرده ایم. اما نکته که حاظ اهمیت است اینه که قبل از دامنه ما نقطه (.) وارد کرده ایم. شاید برای شما سوال پیش بیاد چرا نقطه قبل از دامنه گذاشتیم. جواب این سوال اینکه که نقطه قبل از دامنه در سشن ها و کوکی به معنی اینکه این کوکی در همه زیردامنه ها در دسترس باشد.

اما با انجام چند تغییر ساده تونستیم session Multi-subdomain رو پیاده سازی کنیم.

روش دوم

اولا باید مراحل روش اول رو طی کنید و سپس ادامه بدید.

لاراول بصورت پیش فرض سشن ها را بصورت فایل در مسیر storage/framework/sessions ذخیره می کند، اما فقط برنامه ای که در آن سشن ذخیره شده است می تواند به آن فایل ها دسترسی داشته باشد. ما برای اینکه بتونیم به سشن ها در برنامه های دیگر دسترسی داشته باشیم چندین راه داریم، ما آنها در زیر ذکر می کنیم.

دیتابیس

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

اول باید فایل .env را ویرایش کنید و کد زیر را اضافه کنید:


SESSION_DRIVER=database

بعد از قرار دادن کد بالا دستور زیرا را اجرا کنید:


php artisan session:table

php artisan migrate

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

ردیس

شاید شما با دیتابیس محبوب ردیس کار کرده باشید و متوجه بعضی از ویژگی های این دیتابیس باشید، بعضی برنامه نویسان لاراولی فکر می کنند ردیس فقط برای کش هست اما اینو اضافه کنم که ردیس فقط برای کش در لاراول نیست بلکه کاربرد های متفاوتی دارد. و ما در این مقاله از آن برای ذخیره سشن استفاده می کنیم. خب برای اینکه بتونید سشن را در ردیس ذخیره کنید مراحل زیر را دنبال کنید.

اول باید فایل ‍‍.env را ویرایش کنید و کدهای زیرا را اضافه کنید:


SESSION_DRIVER = redis
CACHE_PREFIX = daniel_cache

من در SESSION_DRIVER گفتم که درایور سشن ردیس باشد. لاراول برای ذخیره اطلاعات کش و سشن در ردیس یک prefix تنظیم می کند و آن را قبل از نام کلید دیتا در ردیس استفاده می کند مثلا daniel_blog_session-xxxxx، لاراول برای هر برنامه بر اساس پارامتر های این prefix را تنظیم می کند و ما برای پیشگیری از وقع خطا ‍CACHE_PREFIX را تنظیم می کنیم و آن را از حالت پیش فرض لاراول خارج می کنیم. مثلا ما برای CACHE_PREFIX مقدار daniel_cache تنظیم کرده ایم، شما می توانید هر مقداری را برای آن در نظر بگیرید.

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

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

نکته

یک نکته حاظ اهمیت وجود دارد که من آن را برای آخر گذاشتم. لاراول بعد از نصب بصورت پیش فرض یک APP_KEY تنظیم می کند و آن را در فایل .env قرار میدهد. شاید برای شما سوال پیش پیاد کاربرد این کلید چی هست. یکی از کاربرد های این کلید آنکد و دیکد کردن کوکی هست. لاراول بصورت پیش فرض همه کوکی ها را آنکد می کند، تا مانع از فاش شدن محتوای آنها شود. اما وقتی کوکی ما با استفاده از کلید یکی از برنامه ها آنکد شده نمی تونیم با کلید به غیر از آن کلید کوکی را دیکد کنیم. پس راه حل چیست؟ یکی از راه حل ها این است که کلید APP_KEY را از یکی از برنامه های لاراولی تان کپی و سپس در همه برنامه های لاراولی دیگر پیست کنید.

یادداشت

من به شخصه روش دوم یعنی ردیس رو پیشنهاد می کنم. چرا؟ برای مثال ما هزار یوزر داریم و هر یوزر ممکن است در روز چندین بار وارد و خارج بشود، به نظر شما چه مقدار از سشن ها در دیتابیس ذخیره می شود، واقعا تعداد خیلی زیاد خواهد بود و وقتی حجم اطلاعات دیتابیس افزایش پیدا می کنه باعث افزایش latency کوئری ها میشه و ... از مشکلات میشه و حتی اگر هزار یوزر نداشته باشیم، دیتابیس های مثل MySQL و ... کلا سرعت دیتابیس های مثل ردیس را ندارد و ردیس در این مورد خیلی سریع عمل می کند. و اضافه کنم انتخاب با شماست، هر کدام را صلاح میدونید انتخاب کنید.

چندین اقدام
  • دوستان بعد از پیاده سازی هر کدام از روش های بالا اقدام به پاک کردن کوکی ها و سشن ها کنید و تست کنید.
  • اگر برای پیاده سازی قابلیت Session Multi-subdomain روش دوم را گزینش کرده اید، فراموش نکنید که مراحل مربوط را در همه برنامه هاتان تکرار کنید.

خیلی سپاس گذارم بخاطر اینکه تا آخر مقاله با ما همراه بودید. و فراموش نکنید نظراتان را با ما به اشتراک بگذارید.

منابع: Medium, Stackoverflow

۱۰ اردیبهشت، ۱۳۹۹

۵ ماه پیش ١۵۰۰+ امتیاز
نویسنده @daniel58 یک مقاله تازه به اسم به راحتی از UUID ها در لاراول استفاده کنید نوشت.

UUID مخفف Universal Unique Identifier است. UUID یک شماره 128 بیتی است که برای شناسایی منحصر به فرد یک شی یا در مورد ما، یک رکورد پایگاه داده استفاده می شود.

من نمی خوام UUID رو با Auto Incrementing ID مقایسه کنم، بلکه میخوام نحوه استفاده از UUID در لاراول را به شما آموزش بدهم.

migration خود را آماده کنید

اولین قدم استفاده از UUID در دیتابیس شما، تنظیم ستون شما از یک نوع خاص است. به طور پیش فرض، در هر مایگرشن لاراول که ایجاد می کنید$table->increments('id'); وجود دارد.

برای استفاده UUID کافیه متد ->uuid() را استفاده کنیم. به عنوان مثال، ما میخوایم یک مایگریشن برای پست ها ایجاد کنیم.


Schema::create('posts', function (Blueprint $table) {
    $table->uuid('id')->primary();
    $table->string('title');
    $table->text('body');
    $table->timestamps();
});

خطی که باید به آن توجه کنید این است:

$table->uuid('id')->primary();

توجه کنید ما به جای استفاده از متد معمول increments() از uuid() استفاده کرده ایم. همانطور که مشاهده می کنید، متد uuid() مشخص می کند که ستون باید یک ستون UUID باشد و ما همچنین مشخص می کنیم که باید کلید اصلی جدول باشد.

ایجاد UUID

اگر php artisan migrate را اجرا کنید و سعی کنید با استفاده از چیزی شبیه factory یا روش معمول یک رکورد جدید ایجاد کنید، با خطایی مواجه می شوید که می گویید ستون ID نمی تواند null باشد.

هنگام استفاده از متد primary() در مایگریشن ها، لاراول متوجه می شود که این یک ستون auto-incrementing است، مقداری برای آن تنظیم می کند. اما از آنجایی که ما UUID استفاده می کنیم، باید خودمان ID را ایجاد کنیم.

از Eloquent Events استفاده کنید

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

Eloquent در مدل ها خود چیزی به نام Model Events دارد. در مجموع، 11 Event وجود دارد که هر کدام در سناریو های مختلف مورد استفاده قرار می گیرد.

شما Event های زیر را دارید:

  • retrieved
  • creating
  • created
  • updating
  • updated
  • saving
  • saved
  • deleting
  • deleted
  • restoring
  • restored

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

اکنون، به ایجاد UUID ها باز می گردیم. بیاید نگاهی به مدل Post خود بیاندازیم:


class Post extends Model
{
    protected $guarded = []; // YOLO

    protected static function boot()
    {
        parent::boot();

        static::creating(function ($post) {
            $post->{$post->getKeyName()} = (string) Str::uuid();
        });
    }

    public function getIncrementing()
    {
        return false;
    }

    public function getKeyType()
    {
        return 'string';
    }
}

در مدل ما 3 متد وجود دارد. متد boot جایی است که ما می توانیم در مدل هوک بزنیم و به هر Eloquent Event گوش بدیم. متد getIncrementing زمانی توسط Eloquent استفاده می شود که ما از ‍‍incrementing استفاده می کنیم. به یاد داشته باشید ما از UUID استفاده می کنیم بنابراین ما آن را false تنظیم می کنیم.

در آخر، متد getKeyType فقط مشخص می کند که ID موجود باید بصورت string ذخیره شود.

در متد boot ما، به creating event گوش داده ایم. این event دقیقا قبل از ذخیره شدن رکورد در دیتابیس رخ می دهد. ما به این event هوک میزنیم، و از متد uuid() ارائه شده توسط کلاس Str در لاراول استفاده می کنیم.

در نسخه پیشین لاراول، افراد برای ایجاد UUID لازم بود یک پکیج را با استفاده composer نصب کنند، اما الان می توانید با استفاده از متد uuid() موجود در کلاس Str به راحتی آن را تولید کنید.

به همین راحتی، می توانید از UUID ها در لاراول استفاده کنید.

ما برای اینکه لاجیک بهتری داشته باشیم و تکرار پذیری کد را به حداقل برسانیم، بهتر است یک PHP trait ایجاد کنیم و آن را در هر مدل ای که نیاز داریم از UUID استفاده کنید، آن را صدا میزنیم.

این همان چیزی که UsesUuid trait به نظر می رسد: ‍‍‍

<?php

namespace App\Models\Concerns;

use Illuminate\Support\Str;

trait UsesUuid
{
    protected static function bootUsesUuid()
    {
        static::creating(function ($model) {
            if (! $model->getKey()) {
                $model->{$model->getKeyName()} = (string) Str::uuid();
            }
        });
    }

    public function getIncrementing()
    {
        return false;
    }

    public function getKeyType()
    {
        return 'string';
    }
}

توجه کنید که چطور همه چیز عمومی شد و شما دیگر نیاز ندارید به یک مدل مراجعه کنید و کدها رو کپی کنید.

الان، در هر مدلی که میخواید ستون ID بصورت UUID باشد، کد شما شبیه کد زیر خواهد بود:

class Post extends Model
{
  use App\Models\Concerns\UsesUuid;

  protected $guarded = []; // YOLO
}

خودشه، فقط در چند مرحله ساده فهمیدیم چطور UUID در برنامه های لاراولی کار می کند.

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

منبع : Dev

۲۸ مهر، ۱۳۹۸

١١ ماه پیش ١۰۰+ امتیاز
@daniel58 به گفتگوی بهترین شیوه پرداخت داخل ایران جواب داد.

@amir استاد عزیز شما دارید میگید من همینجوریم تا حدودی راضی هستم. مشتری های ایرانی مقیم خارج دارم! پس تکلیف ما ایرانی ها چی میشه؟ من نمی گم بیاید و مشکلات ما برنامه نویسان ایرانی به خاطر تحریم ها رو حل کنید؟ من منظورم اینه که شما می توانید دسترسی ما رو به محتوای ویژه پارس کلیک راحتر کنید. شما می توانید یا درگاه پرداخت ایرانی بگیرید و سپس پولتون رو اخر هر ماه به بیت کوین تبدیل کنید. یا پرداخت با بیت کوین رو فراهم کنید که در این حالت ما هم چاره برای خود می اندیشیم. ممنونم که نظرم رو خوندید.