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

هاست لاراول با پشتیبانی 24 ساعته و امکانات کامل از مدیرهاست

Paradox

مشکل در ثبت نام با موبایل

Recommended Posts

سلام شب بخیر

من میخام کاربر با شماره موبایل ثبت نام انجام بده و بعد از اینکه کد براش ارسال شد وارد صفحه قوانین بشه ، ثبت نام با موبایل و احراز هویت رو انجام دادم و اکیه

فقط یه بخش مشکل دارم که میخام چک کنم اگه کاربر کدی که وارد کرد درست بود از دیتابیس کد ارسال شده حذف بشه و کاربر هدایت بشه به صفحه قوانین

که مشکلی که دارم اینه صفحه 404 نمایش میده که یعنی کاربر وجود نداره

 

    public function token(Request $request)
    {
        $request->validate([
            'token' => 'required'
        ]);
        
        if( ! $request->session()->has('phone')) {
            return redirect()->route('register');
        }

        $user = User::findOrFaild($request->session()->get('auth.user_id'));
        $status = ActiveCode::verifyCode($request->token , $user);
 
        if(! $status) {

            // alert()->error('شماره تلفن و احرازهویت دو مرحلهای شما تایید نشد.' , 'عملیات ناموفق بود');
            return redirect()->route('register');
        } else {
            $user->activeCode()->delete();
            return redirect()->route('rule');
        }
        return redirect()->route('register');
    }

 

با سشن انجام دادم

این خط کد مشکل داره

        $user = User::findOrFaild($request->session()->get('auth.user_id'));

 

وقتی هم به جای findOrFaild از find استفاده میکنم این ارور دارم

 

call to a member function activecode() on null

 

تو این متد به چه شکل باید بنویسم که اگه کدی که کاربر وارد کرد درست بود هدایت بشه به صفحه مد نظر؟

 

Share this post


Link to post
Share on other sites

هاست لاراول با پشتیبانی 24 ساعته و امکانات کامل از مدیرهاست

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

نباید از متد delete استفاده کنید چون کلا کاربر رو از دیتابیس حذف میکنه و بعد ارور 404 میده چون کاربری وجود نداره

Share this post


Link to post
Share on other sites
در 46 دقیقه قبل، saber گفته است :

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

نباید از متد delete استفاده کنید چون کلا کاربر رو از دیتابیس حذف میکنه و بعد ارور 404 میده چون کاربری وجود نداره

به چه شکل باید بنویسم؟

چون هم کاربر تو دیتابیس هست هم کد تایید هیچی پاک نشده تو دیتابیس

Share this post


Link to post
Share on other sites
در 1 ساعت قبل، Paradox گفته است :

این خط از کد مشکل نداره ؟


        $user = User::findOrFail($request->session()->get('auth.user_id'));

 

مقدار داخل session رو با dd تست کنید ببینید اصلا بهتون خروجی میده؟

Share this post


Link to post
Share on other sites
در 9 ساعت قبل، saber گفته است :

مقدار داخل session رو با dd تست کنید ببینید اصلا بهتون خروجی میده؟

null برمیگردونه دقیقا همون خط رو 

null // app\Http\Controllers\Auth\RegisterController.php:95

 

Share this post


Link to post
Share on other sites

خب پس مشکل از همون قسمت هست باید ببینید جایی که session رو set میکنید چه ایرادی داره چون اصلا ست نمیشه توی کدهایی که گذاشتید قسمت ست شدن session رو ندیدم

Share this post


Link to post
Share on other sites
در 1 ساعت قبل، saber گفته است :

خب پس مشکل از همون قسمت هست باید ببینید جایی که session رو set میکنید چه ایرادی داره چون اصلا ست نمیشه توی کدهایی که گذاشتید قسمت ست شدن session رو ندیدم

من کل کدهارو میزارم اینجا

controller

class RegisterController extends Controller
{
        /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest');
    }

    public function showRegister()
    {
        return view('auth.register');
    }

    public function register(Request $request)
    {
        $data = $request->validate([
            'phone' => 'required|unique:users,phone|digits:11|numeric|regex:/[0]{1}[0-9]{10}/',
            'password' => ['required', 'string', 'min:8', 'confirmed'],
            'reagent_code' => ['nullable' , 'string' , 'max:255' , 'min:3'],
     ]);
     
           $user = User::create([
            'phone' => $data['phone'],
            'password' => Hash::make($data['password']),
            'reagent_code' => $data['reagent_code'],
        ]);


        $apiKey = config('services.ghasedak.key');
        $code = ActiveCode::generateCode($user);
        $request->session()->flash('phone' , $data['phone']);
        
        
        try{  
            $message = "کد احراز هویت شما : " . $code . " ";
            $lineNumber = "10008566"; 
            $receptor = $data['phone'];
            $api = new \Ghasedak\GhasedakApi($apiKey);
            $api->SendSimple($receptor,$message,$lineNumber);  
           }  
           catch(ApiException $e){
               throw $e;
           }
           catch(HttpException $e){
               throw $e;
           }           
 
        return redirect()->route('phone.token');

    }

    public function showToken(Request $request)
    {
        if(! $request->session()->has('phone')) {
            return redirect()->route('register');
        }

        $request->session()->reflash();
        
        return view('auth.code');
    }
    
    public function token(Request $request)
    {
        $request->validate([
            'token' => 'required'
        ]);
        
        if( ! $request->session()->has('phone')) {
            return redirect()->route('register');
        }

        // $request->session()->reflash();

        $user = User::findOrFail(dd($request->session()->get('auth.user_id')));
        $status = ActiveCode::verifyCode($request->token , $user);
 
        if(! $status) {

            // alert()->error('شماره تلفن و احرازهویت دو مرحلهای شما تایید نشد.' , 'عملیات ناموفق بود');
            return redirect()->route('register');
        } else {
            $user->activeCode()->delete();
            return redirect()->route('rule');
        }
        return redirect()->route('register');
    }


    public function rule(Request $request)
    {
        // $request->validate([
        //     'rule' => 'required'
        // ]);

        // if($request)
        // {
        //     return redirect(route('auth.child'));
        // }

        return view('auth.rule');
    }


 

}

route

Route::namespace('Auth')->middleware('guest')->group(function() {
   
    Route::get('register' , [RegisterController::class , 'showRegister'])->name('register');
    Route::post('register' , [RegisterController::class , 'register']);

    Route::get('/token' , [RegisterController::class , 'showToken'])->name('phone.token');
    Route::post('/token' , [RegisterController::class , 'token']);

    Route::get('rule' , [RegisterController::class , 'rule'])->name('rule');
});

 

Share this post


Link to post
Share on other sites

شما با کلید auth.user_id میخواید شناسه کابر رو بگیرید ولی جایی این رو set نکردید زمانی که کاربر رو با متد create ایجاد میکنید بعدش با همون کلید auth.user_id شناسه کاربر رو توی سشن set کنید تا بعدش بتونید با متد get دریافتش کنید. البته اگه بعد ثبت نام کاربر بطور خودکار توی سایت لاگین میشد به این session نیازی نبود و براحتی از طریق هلپر فانکشن auth به اطلاعات کاربر دسترسی داشتین

Share this post


Link to post
Share on other sites
در 27 دقیقه قبل، saber گفته است :

شما با کلید auth.user_id میخواید شناسه کابر رو بگیرید ولی جایی این رو set نکردید زمانی که کاربر رو با متد create ایجاد میکنید بعدش با همون کلید auth.user_id شناسه کاربر رو توی سشن set کنید تا بعدش بتونید با متد get دریافتش کنید. البته اگه بعد ثبت نام کاربر بطور خودکار توی سایت لاگین میشد به این session نیازی نبود و براحتی از طریق هلپر فانکشن auth به اطلاعات کاربر دسترسی داشتین

من میخام ثبت نامم چند مرحله ای باشه بعد از اینکه کاربر احراز هویت شد با شماره موبایل بره به صفحات بعدی اطلاعات پر کنه تا به صفحه home دسترسی داشته باشه و بعدا هر وقت login کرد وارد صفحه home بشه

این روشی که دارم میرم یعنی اشتباهه ؟؟

الان من تو متد craete  باید auth.user_id رو قرار بدم ؟

متوجه نشدم چطوری تعریفش کنم 

 

 

Share this post


Link to post
Share on other sites

متد flush هر چیزی که داخل سشن هست رو کلا حذف میکنه برای اینکه مقداری رو داخل سشن قرار بدید که هنگام استفاده از request باید از متد put استفاده کنید که به این شکل هست:

$request->session()->put('auth.user_id', $user->id);

بعد هر جایی خواستید این مقدار رو دریافت کنید با متد get به شکل زیر دریافت میکنید

$request->session()->get('auth.user_id');

ولی در کل در مورد پروژه ای که انجام بدید بهتره روش کارتون رو تغییر بدید چون اینطوری از سشن که استفاده میکنید اگر کاربری کارش رو نیمه کاره بذاره و بعد یه مدت بیاد ادامه بده بخاطر اینکه اطلاعات داخل سشن منقضی میشن برای ادامه کار مشکل میخورید و مجدد کار زیادی برای اعتبار سنجی دوباره شماره موبایل و چک کردن اینکه کاربر از قبل بوده یا خیر انجام بدید. به نظرم بهتر هست بعد از اینکه کاربر شماره موبایل رو تایید کرد و ثبت نام شد بطور اتوماتیک لاگینش رو هم انجام بدید و مراحل بعدی تکمیل فرمها رو انجام بدید و تا زمانی که مرحله ای رو تکمیل نکرده اجازه رفتن به مرحله بعد رو ندید. اینطوری دیگه نیازی به سشن ندارید و بعد از لاگین از طریق هلپر فانکشن auth به همه اطلاعات کاربر دسترسی دارید.

Share this post


Link to post
Share on other sites
در ۱ ساعت قبل، saber گفته است :

ولی در کل در مورد پروژه ای که انجام بدید بهتره روش کارتون رو تغییر بدید چون اینطوری از سشن که استفاده میکنید اگر کاربری کارش رو نیمه کاره بذاره و بعد یه مدت بیاد ادامه بده بخاطر اینکه اطلاعات داخل سشن منقضی میشن برای ادامه کار مشکل میخورید و مجدد کار زیادی برای اعتبار سنجی دوباره شماره موبایل و چک کردن اینکه کاربر از قبل بوده یا خیر انجام بدید. به نظرم بهتر هست بعد از اینکه کاربر شماره موبایل رو تایید کرد و ثبت نام شد بطور اتوماتیک لاگینش رو هم انجام بدید و مراحل بعدی تکمیل فرمها رو انجام بدید و تا زمانی که مرحله ای رو تکمیل نکرده اجازه رفتن به مرحله بعد رو ندید. اینطوری دیگه نیازی به سشن ندارید و بعد از لاگین از طریق هلپر فانکشن auth به همه اطلاعات کاربر دسترسی دارید.

بله دقیقا دغدغه منم همین بود اگه نصفه ول کنه چیکار میشه کرد

حالا کاربر اگه لاگین شده در نظر بگیریم در ابتدا بعد از احراز هویت با موبایل به روت home دسترسی داره ؟

چون میخام وقتی دفعات بعد لاگین کرد بره به روت home

ولی در حالت عادی بعد از اعتبار سنجی موبایل بره به روت قوانین 

 

میشه در هر حالت بره به صفحه home ولی شرط بزاریم تا اطلاعات پر نشد روت home نشون نده ؟؟

چطوری میشه این رو بررسی کرد ؟یا اشتباهه این روش؟

Share this post


Link to post
Share on other sites

میتونید در دیتابیس توی جدول کاربران یه فیلد به اسم register_at اضافه کنید که پیشفرض null قرار بدید بعد زمانی که کاربر مراحل ثبت نام رو تموم کرد مقدار register_at رو برابر با

تایم استمپ اون تاریخ قرار بدید که مشخص بشه این کاربر در این تاریخ ثبت نامش تموم شده بعد هر بار کاربری لاگین میکنه چک میکنید که اگر مقدار register_at خالی نبود یعنی

کاربر ثبت نامش تموم شده و مجاز به دیدن صفحه home یا هر صفحه ای که دوست دارید هست

Share this post


Link to post
Share on other sites
در 3 ساعت قبل، saber گفته است :

میتونید در دیتابیس توی جدول کاربران یه فیلد به اسم register_at اضافه کنید که پیشفرض null قرار بدید بعد زمانی که کاربر مراحل ثبت نام رو تموم کرد مقدار register_at رو برابر با

تایم استمپ اون تاریخ قرار بدید که مشخص بشه این کاربر در این تاریخ ثبت نامش تموم شده بعد هر بار کاربری لاگین میکنه چک میکنید که اگر مقدار register_at خالی نبود یعنی

کاربر ثبت نامش تموم شده و مجاز به دیدن صفحه home یا هر صفحه ای که دوست دارید هست

با میدلور هم میشه انجام داد؟

چطوری میتونم مقدار register_at رو برابر با تایم استمپ تاریخ قرار بدم ؟

 

Share this post


Link to post
Share on other sites

آموزشی هست که معرفی کنید ؟

یکم گیج شدم برای ادامه روند

برام خیلی مهمه و 3 هفته متاسفانه درگیر این بخش هستم 

یه آموزش خریدم  قبلا ولی برای ورود بود ، کد زمان ثبت نام ارسال نمیشد فقط زمانی که کاربر وارد میشه ارسال کد انجام میشه

آموزش های یوتیوب هم به همین شکل بود

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

ارسال کد انجام میشه اکیه فقط همون بخش که گفتم مشکل دارم ، روش درست برام مهمه که فرمودید نیاز به سشن نیست 

Share this post


Link to post
Share on other sites

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

بعد کاربر رو لاگین کنید و با یه میدلور  چک کنید ببینید اگر مقدار register_at برای کاربر لاگین شده برابر با null بود کاربر رو به صفحه قوانین منتقل کنید تا ثبت نامش رو تکمیل کنه

و در نهایت بعد از تکمیل ثبت نام مقدار register_at رو برابر تایم استمپ بذارید که این رو هم مقدارش رو از کلاس کربن به شکل Carbon::now میتونید دریافت کنید.

اگر هم register_at مقدار داشت و کاربر ثبت نامش رو قبلا تکمیل کرده بود به صفحه اصلی هدایت میکنید این روند مشکل شما رو حل میکنه خیلی پیچیدگی خاصی نداره

 

Share this post


Link to post
Share on other sites
در در ۱۴۰۱/۸/۲۳ در 00:38، saber گفته است :

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

بعد کاربر رو لاگین کنید و با یه میدلور  چک کنید ببینید اگر مقدار register_at برای کاربر لاگین شده برابر با null بود کاربر رو به صفحه قوانین منتقل کنید تا ثبت نامش رو تکمیل کنه

و در نهایت بعد از تکمیل ثبت نام مقدار register_at رو برابر تایم استمپ بذارید که این رو هم مقدارش رو از کلاس کربن به شکل Carbon::now میتونید دریافت کنید.

اگر هم register_at مقدار داشت و کاربر ثبت نامش رو قبلا تکمیل کرده بود به صفحه اصلی هدایت میکنید این روند مشکل شما رو حل میکنه خیلی پیچیدگی خاصی نداره

 

سشن رو برداشتم مثل همون ارور بالا رو دارم 

این کد مشکلی داره ؟

   protected function validator(array $data)
    {
        return Validator::make($data, [
            'phone' => 'required|unique:users,phone|digits:11|numeric|regex:/[0]{1}[0-9]{10}/',
            'password' => ['required', 'string', 'min:8', 'confirmed'],
        ]);
    }

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return \App\Models\User
     */
    protected function create(array $data)
    {
        $user = User::create([
            'phone' => $data['phone'],
            'password' => Hash::make($data['password']),
        ]);

        $apiKey = config('services.ghasedak.key');
        $code = ActiveCode::generateCode($user);

        try{  
            $message = "کد احراز هویت شما : " . $code . " ";
            $lineNumber = "10008566"; 
            $receptor = $data['phone'];
            $api = new \Ghasedak\GhasedakApi($apiKey);
            $api->SendSimple($receptor,$message,$lineNumber);  
           }  
           catch(ApiException $e){
               throw $e;
           }
           catch(HttpException $e){
               throw $e;
           }   

           return redirect(route('phone.token'));
    }

 

کد تو دیتابیس ساخته میشه ولی اس ام اس نمیشه 

و از این لاین ارور میگیره

            $api->SendSimple($receptor,$message,$lineNumber);  

 

Share this post


Link to post
Share on other sites

ارور از سمت سرویس پیامک بود حل شد 

الان این ارور دارم

 

lluminate\Auth\SessionGuard::login(): Argument #1 ($user) must be of type Illuminate\Contracts\Auth\Authenticatable, Illuminate\Http\RedirectResponse given, called in C:\xampp\htdocs\project\vendor\laravel\ui\auth-backend\RegistersUsers.php on line 36

کد ادامه بخش چجوری به هلپر فانکشن ورود دسترسی داشته باشم کاربر لاگین بشه ؟

این شکلی که نوشتم ارو بالا گرفتم

  public function showToken()
    {
        return view('auth.code');
    }

    public function token(Request $request)
    {
        $user = $request->validate([
            'token' => 'required'
        ]);

        $status = ActiveCode::verifyCode($request->token , $user);

        if(auth()->loginUsingId($request->user()->get('auth.remember'))) {
            $user->activeCode()->delete();
            return redirect('/');
        }

        if($status) {
            return redirect(route('rule'));
        } else {
            // alert()->error('شماره تلفن و احرازهویت دو مرحلهای شما تایید نشد.' , 'عملیات ناموفق بود');
            return redirect(route('phone.token'));
        }
        return redirect(route('phone.token'));
    }

 

Share this post


Link to post
Share on other sites

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

      $user = User::find($request->user()->id);

        $status = ActiveCode::verifyCode($request->token , $user);

        if(Auth::loginUsingId($user->id , true)) {
            $user->activeCode()->delete();
            return redirect('/');
        }

 

Share this post


Link to post
Share on other sites

اینجا مشکل از remmber هست ؟

اروری که داده این لاین از متد اشاره کرده

    public function login(AuthenticatableContract $user, $remember = false)

 

تو متد token  به این شکل نوشتم 

  public function token(Request $request , User $user)
    {
        $request->validate([
            'token' => 'required'
        ]);

        $status = ActiveCode::verifyCode($request->token , $user);

        if(Auth::loginUsingId($user->id , $request->get('remember'))) {
            $user->activeCode()->delete();
            return redirect('/');
        }

        if($status) {
            return redirect(route('rule'));
        } else {
            // alert()->error('شماره تلفن و احرازهویت دو مرحلهای شما تایید نشد.' , 'عملیات ناموفق بود');
            return redirect(route('phone.token'));
        }
        return redirect(route('phone.token'));
    }

 

 

تو loginController به این شکل  نوشتم که نمیدونم اشتباه از متد token هست  یا متد login

اینجا validate تو متد login باشه مشکلی نداره؟


    public function login(Request $request)
    {
  
        $request->validate([
            'phone' => 'required|exists:users,phone|digits:11|numeric|regex:/[0]{1}[0-9]{10}/', 
            'password' => 'required|string',
        ]);

        $remember = ($request->has('remember')) ? true : false;

        return redirect()->route('home');
    }

 

Share this post


Link to post
Share on other sites

متد لاگین رو دوبار نوشتین؟ توی کدهاتون متد login با دو ورودی مختلف هست کدوم رو الان استفاده میکنید؟

و در مورد خطایی که بالا اشاره کردید کلاس User رو چک کنید ببینید از کلاس Authenticatable ارث بری کرده؟ باید مادل یوزر از این کلاس ارث بری کنه
اگر باز نتونستید حل کنید خواستید کدهاش رو برام زیپ کنید بفرستید روی سیستم خودم تست کنم

Share this post


Link to post
Share on other sites
در 38 دقیقه قبل، saber گفته است :

متد لاگین رو دوبار نوشتین؟ توی کدهاتون متد login با دو ورودی مختلف هست کدوم رو الان استفاده میکنید؟

و در مورد خطایی که بالا اشاره کردید کلاس User رو چک کنید ببینید از کلاس Authenticatable ارث بری کرده؟ باید مادل یوزر از این کلاس ارث بری کنه
اگر باز نتونستید حل کنید خواستید کدهاش رو برام زیپ کنید بفرستید روی سیستم خودم تست کنم

من موفق نشدم انجام بدم کد براتون ارسال کردم تو پیام خصوصی انجمن

تو تلگرام هم فرستادم

Share this post


Link to post
Share on other sites

مشکل اصلی شما رو در تاپیک زیر راه حلش رو نوشتم

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

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.


×
×
  • جدید...