رفتن به مطلب
انجمن پشتیبانی لاراول ایران
negar_a

تغییر ثبت نام کاربر

Recommended Posts

سلام دوستان.

من تو پروژه ام میخوام قسمت auth و ثبت نام رو تغییر بدم .

بعنوان مثال فیلدهایی به جدول user اضافه کردم : phone , address,city,postCode .

در مرحله ی اول میخوام کاربر اینها رو فقط پر کنه : name , emaile ,password,phone 

و بعد از اینکه کدی به موبایلش ارسال شد و کاربر درست وارد کرد بعد از اون ثبت ، لاگین و ریدایرکت اتفاق بیفته . و در مراحل بعد مابقی اطلاعات مثل ادرس و ... رو پر کنه

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

مثلا در registreController  چه تغییری ایجاد کنم که بعد از چک کردن phone اطلاعات رو ذخیره کنه .

احتمالا باید middleware بسازم درسته ؟ ممنون میشم راهنمایی کنید .

Share this post


Link to post
Share on other sites

سلام وقت بخیر 

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

در این فیلد بعد از ثبت نام یک کد رندم تولید کنید و در اون ذخیره کنید .

در قسمت بعد ثبت نام بعد از وارد کردن شماره تماس کد رندوم داخل جدول توسط پنل پیامک به کاربر ارسال میشود و باید چک‌شود آیا صحیح است یا خیر .

موفق باشید. 

Share this post


Link to post
Share on other sites

ممنون. فکر میکردم پیچیده تر از اینها باشه.

پس به پکیجی مثل nexmo نیازی نیست ؟ 

و از طرفی اگر کاربر کد تایید رو وارد نکرد ، بهتره هر چند ساعت یکبار رکوردهای اضافی حذف بشوند با کرون جاب ؟ 

Share this post


Link to post
Share on other sites

و یک مساله دیگه اینه که وقتی از سیستم خود uath استفاده کنم ، وقتی اطلاعات اولیه مثل موبایل نام پسورد وارد میشه ، در پایگاه یک رکورد درج شده و در نتیجه لاگین اتفاق میفته . ایا منطقی هست که قبل از تایید کد ، کاربر لاگین بشه ؟ اینو چطور تغییر بدم ؟ 

Share this post


Link to post
Share on other sites

سلام

در صورتیکه بخواهید فیلد phome به جدول users اضافه کنید باید متغیر fillable$ در  کلاس User را بصورت زیر اصلاح کنید.

 protected $fillable = [
        'name', 'email', 'password',  'phone'
];

سپس وارد کلاس App\Http\Controllers\Auth\RegisterController شوید و متد ()create را ویرایش کنید:

return User::create([
            'name'     => $data['name'],            
            'email'    => $data['email'],
            'password' => Hash::make($data['password']),
            'phone'   => $data['family'],
 ]);

نیازی به استفاده از میان افزار Midlleware نیست.اصولا زمانی که بخواهید شرایط خاصی را بررسی کنید از میان افزار استفاده می کنید. برای مثال اگر شما بخواهید کاربران سایت شما در مدت زمان یک ساعت فقط یک دیدگاه برای یک پست خاص ارسال کنند می توانید از یک میان افزار به نام AllowComment بصورت زیر استفاده کنید:

namespace App\Http\Middleware;

use Carbon\Carbon;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class AllowComment
{
    
    public function handle($request, Closure $next)
    {
        if (auth()->check())
        {
            //dd($request->post_id);
            $post_id = $request->post_id;

            $max_count =1;
            $max_time   = 60;

            $first = Carbon::now()->subMinutes($max_time);
            $count = auth()->user()->comments()
                ->where('post_id', $post_id)
                ->where('created_at', '>=', $first)->count();

            if ($count < $max_count)
                return $next($request);
        }

        $msg ='your error message';
        return redirect()->back()->with('invalid', $msg);
    }
}

امیدوارم که این پاسخ به شما کمک کرده باشد.

موفق باشید.

Share this post


Link to post
Share on other sites

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

مثلا اینکه نیازی هست کد تایید هم مثلا با نام verify در دیتابیس ذخیره بشه یا فقط در سشن کافیه ؟

کد کپچا بهتره در کدوم مرحله باشه ؟ ثبت نام من دو مرحله ای هست ، مرحله ی اول نام موبایل پسورد .... مرحله دوم ادرس  شهر و ... 

اون max_time برای زمانی هست که کاربر فرصت وارد کردن کد تایید رو داره . درسته ؟ 

Share this post


Link to post
Share on other sites

در مرحله اول ثبت نام شما باید نام، موبایل و ایمیل را از کاربر دریافت کنید تا ثبت نام انجام شود. کد تایید ثبت نام هم بصورت تصادفی ایجاد و در یک session ذخیره می شود.  در انتهای متد  ()create در کلاس RegisterController نشست را ایجاد نمایید. یک session با نام user-xxx و مقدار موبایل کاربر ایجاد می شود.(xxx شناسه (id) کاربر است)

protected function create(array $data)
{	    
        $user = User::create([
            'name'     => $data['name'],
            'phone'   => $data['phone'],
            'email'    => $data['email'],
            'password' => Hash::make($data['password']),
        ]);
        session()->put('user-' . $user->id, $data['phone']);
        return $user;
    }

حال کاربر باید کد تایید را در فرم مربوطه وارد نمایید. فرض بر آن است که مسیر (Route) مربوطه را در فایل web.php بصورت زیر تعریف کرده باشید.

Route::get('/register/verify/{user}', 'UserController@verify')->middleware('check-verify')->name('register.verify');

در میان افزار CheckVerify باید بررسی کنید که آیا کاربر در مدت زمان لازم کد تایید را وارد کرده یا خیر. با اندکی تغییر در کد قبلی (تابع ()handle ) می توانید این کار را انجام دهید.

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

موفق باشید.

 

Share this post


Link to post
Share on other sites

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

میخوام وقتی کاربر وارد صفحه ی وارد کردن کد تایید شد ، اگر بیش از شصت ثانیه زمان برد ریدایرکت بشه . 

ولی کد کار نمیکنه . (  بنظرم در اینجا میشه به جای زمان create_at از زمان فعلی هم استفاده کرد . درسته ؟)

public function handle($request, Closure $next)
{
    if (auth()->check()) {

        $expire_verify =date('H:i:s', strtotime('+60 second'));
        if(date('H:i:s')>$expire_verify){
            $msg ='your error message';
            return redirect()->back()->with('invalid', $msg);
        }
    }
    return $next($request);
}

اسم این صفحه ای که کاربر کد تایید وارد میکنه check-code هست و من middleware  رو به همین صفحه اختصاص دادم .

 

Share this post


Link to post
Share on other sites

وارد این گفتگو شوید

میتوانید پیام خود را ارسال کنید و بعد ثبت نام نمایید. در صورتی که حساب کاربری دارید, هم اکنون وارد شوید و در این گفتگو شرکت کنید.

مهمان
پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  Only 75 emoji are allowed.

×   لینک شما به صورت اتوماتیک جایگذاری شد.   نمایش به عنوان یک لینک به جای

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • جدید...