Paradox 3 گزارش دادن ارسال شده در آبان 1 سلام شب بخیر من میخام کاربر با شماره موبایل ثبت نام انجام بده و بعد از اینکه کد براش ارسال شد وارد صفحه قوانین بشه ، ثبت نام با موبایل و احراز هویت رو انجام دادم و اکیه فقط یه بخش مشکل دارم که میخام چک کنم اگه کاربر کدی که وارد کرد درست بود از دیتابیس کد ارسال شده حذف بشه و کاربر هدایت بشه به صفحه قوانین که مشکلی که دارم اینه صفحه 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
saber 143 گزارش دادن ارسال شده در آبان 1 سلام به نظر مشکل بخاطر این هست که شما کلا یوزر رو از دیتابیس حذف میکنید شما بعد از تایید کاربر برای حذف کد ارسالی فقط باید فیلد کد ارسالی رو آپدیت کنید و مقدارش رو خالی بذارید. نباید از متد delete استفاده کنید چون کلا کاربر رو از دیتابیس حذف میکنه و بعد ارور 404 میده چون کاربری وجود نداره نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در آبان 1 در 46 دقیقه قبل، saber گفته است : سلام به نظر مشکل بخاطر این هست که شما کلا یوزر رو از دیتابیس حذف میکنید شما بعد از تایید کاربر برای حذف کد ارسالی فقط باید فیلد کد ارسالی رو آپدیت کنید و مقدارش رو خالی بذارید. نباید از متد delete استفاده کنید چون کلا کاربر رو از دیتابیس حذف میکنه و بعد ارور 404 میده چون کاربری وجود نداره به چه شکل باید بنویسم؟ چون هم کاربر تو دیتابیس هست هم کد تایید هیچی پاک نشده تو دیتابیس نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در آبان 1 این خط از کد مشکل نداره ؟ $user = User::findOrFail($request->session()->get('auth.user_id')); نقل قول Share this post Link to post Share on other sites
saber 143 گزارش دادن ارسال شده در آبان 1 در 1 ساعت قبل، Paradox گفته است : این خط از کد مشکل نداره ؟ $user = User::findOrFail($request->session()->get('auth.user_id')); مقدار داخل session رو با dd تست کنید ببینید اصلا بهتون خروجی میده؟ نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در آبان 1 در 9 ساعت قبل، saber گفته است : مقدار داخل session رو با dd تست کنید ببینید اصلا بهتون خروجی میده؟ null برمیگردونه دقیقا همون خط رو null // app\Http\Controllers\Auth\RegisterController.php:95 نقل قول Share this post Link to post Share on other sites
saber 143 گزارش دادن ارسال شده در آبان 1 خب پس مشکل از همون قسمت هست باید ببینید جایی که session رو set میکنید چه ایرادی داره چون اصلا ست نمیشه توی کدهایی که گذاشتید قسمت ست شدن session رو ندیدم نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در آبان 1 در 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
saber 143 گزارش دادن ارسال شده در آبان 1 شما با کلید auth.user_id میخواید شناسه کابر رو بگیرید ولی جایی این رو set نکردید زمانی که کاربر رو با متد create ایجاد میکنید بعدش با همون کلید auth.user_id شناسه کاربر رو توی سشن set کنید تا بعدش بتونید با متد get دریافتش کنید. البته اگه بعد ثبت نام کاربر بطور خودکار توی سایت لاگین میشد به این session نیازی نبود و براحتی از طریق هلپر فانکشن auth به اطلاعات کاربر دسترسی داشتین نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در آبان 1 در 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
Paradox 3 گزارش دادن ارسال شده در آبان 1 این خط کد که تو متد register هست یعنی اشتباهه؟ $request->session()->flash('phone' , $data['phone']); و باید این شکل بنویسم؟ $request->session()->flash('auth' , [ 'user_id' => $user->id, ]); نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در آبان 1 وقتی به این شکل نوشتم $request->session()->flash('auth' , [ 'user_id' => $user->id, ]); ارور زیر نمایش داد Ghasedak \ Exceptions \ ApiException error عکس هم ارسال شد نقل قول Share this post Link to post Share on other sites
saber 143 گزارش دادن ارسال شده در آبان 1 متد flush هر چیزی که داخل سشن هست رو کلا حذف میکنه برای اینکه مقداری رو داخل سشن قرار بدید که هنگام استفاده از request باید از متد put استفاده کنید که به این شکل هست: $request->session()->put('auth.user_id', $user->id); بعد هر جایی خواستید این مقدار رو دریافت کنید با متد get به شکل زیر دریافت میکنید $request->session()->get('auth.user_id'); ولی در کل در مورد پروژه ای که انجام بدید بهتره روش کارتون رو تغییر بدید چون اینطوری از سشن که استفاده میکنید اگر کاربری کارش رو نیمه کاره بذاره و بعد یه مدت بیاد ادامه بده بخاطر اینکه اطلاعات داخل سشن منقضی میشن برای ادامه کار مشکل میخورید و مجدد کار زیادی برای اعتبار سنجی دوباره شماره موبایل و چک کردن اینکه کاربر از قبل بوده یا خیر انجام بدید. به نظرم بهتر هست بعد از اینکه کاربر شماره موبایل رو تایید کرد و ثبت نام شد بطور اتوماتیک لاگینش رو هم انجام بدید و مراحل بعدی تکمیل فرمها رو انجام بدید و تا زمانی که مرحله ای رو تکمیل نکرده اجازه رفتن به مرحله بعد رو ندید. اینطوری دیگه نیازی به سشن ندارید و بعد از لاگین از طریق هلپر فانکشن auth به همه اطلاعات کاربر دسترسی دارید. 1 نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در آبان 1 در ۱ ساعت قبل، saber گفته است : ولی در کل در مورد پروژه ای که انجام بدید بهتره روش کارتون رو تغییر بدید چون اینطوری از سشن که استفاده میکنید اگر کاربری کارش رو نیمه کاره بذاره و بعد یه مدت بیاد ادامه بده بخاطر اینکه اطلاعات داخل سشن منقضی میشن برای ادامه کار مشکل میخورید و مجدد کار زیادی برای اعتبار سنجی دوباره شماره موبایل و چک کردن اینکه کاربر از قبل بوده یا خیر انجام بدید. به نظرم بهتر هست بعد از اینکه کاربر شماره موبایل رو تایید کرد و ثبت نام شد بطور اتوماتیک لاگینش رو هم انجام بدید و مراحل بعدی تکمیل فرمها رو انجام بدید و تا زمانی که مرحله ای رو تکمیل نکرده اجازه رفتن به مرحله بعد رو ندید. اینطوری دیگه نیازی به سشن ندارید و بعد از لاگین از طریق هلپر فانکشن auth به همه اطلاعات کاربر دسترسی دارید. بله دقیقا دغدغه منم همین بود اگه نصفه ول کنه چیکار میشه کرد حالا کاربر اگه لاگین شده در نظر بگیریم در ابتدا بعد از احراز هویت با موبایل به روت home دسترسی داره ؟ چون میخام وقتی دفعات بعد لاگین کرد بره به روت home ولی در حالت عادی بعد از اعتبار سنجی موبایل بره به روت قوانین میشه در هر حالت بره به صفحه home ولی شرط بزاریم تا اطلاعات پر نشد روت home نشون نده ؟؟ چطوری میشه این رو بررسی کرد ؟یا اشتباهه این روش؟ نقل قول Share this post Link to post Share on other sites
saber 143 گزارش دادن ارسال شده در آبان 1 میتونید در دیتابیس توی جدول کاربران یه فیلد به اسم register_at اضافه کنید که پیشفرض null قرار بدید بعد زمانی که کاربر مراحل ثبت نام رو تموم کرد مقدار register_at رو برابر با تایم استمپ اون تاریخ قرار بدید که مشخص بشه این کاربر در این تاریخ ثبت نامش تموم شده بعد هر بار کاربری لاگین میکنه چک میکنید که اگر مقدار register_at خالی نبود یعنی کاربر ثبت نامش تموم شده و مجاز به دیدن صفحه home یا هر صفحه ای که دوست دارید هست نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در آبان 1 در 3 ساعت قبل، saber گفته است : میتونید در دیتابیس توی جدول کاربران یه فیلد به اسم register_at اضافه کنید که پیشفرض null قرار بدید بعد زمانی که کاربر مراحل ثبت نام رو تموم کرد مقدار register_at رو برابر با تایم استمپ اون تاریخ قرار بدید که مشخص بشه این کاربر در این تاریخ ثبت نامش تموم شده بعد هر بار کاربری لاگین میکنه چک میکنید که اگر مقدار register_at خالی نبود یعنی کاربر ثبت نامش تموم شده و مجاز به دیدن صفحه home یا هر صفحه ای که دوست دارید هست با میدلور هم میشه انجام داد؟ چطوری میتونم مقدار register_at رو برابر با تایم استمپ تاریخ قرار بدم ؟ نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در آبان 1 آموزشی هست که معرفی کنید ؟ یکم گیج شدم برای ادامه روند برام خیلی مهمه و 3 هفته متاسفانه درگیر این بخش هستم یه آموزش خریدم قبلا ولی برای ورود بود ، کد زمان ثبت نام ارسال نمیشد فقط زمانی که کاربر وارد میشه ارسال کد انجام میشه آموزش های یوتیوب هم به همین شکل بود من میخام یک بار موقع ثبت نام کد احراز هویت ارسال بشه و دفعات بعد کاربر از طریق شماره موبایل و رمز عبور وارد بشه ارسال کد انجام میشه اکیه فقط همون بخش که گفتم مشکل دارم ، روش درست برام مهمه که فرمودید نیاز به سشن نیست نقل قول Share this post Link to post Share on other sites
saber 143 گزارش دادن ارسال شده در آبان 1 شما همون روشی رو که گفتم انجام بدید کارتون درست پیش میره و مشکلی پیش نمیاد اول شماره موبایل رو تایید و کاربر رو ایجاد میکنید که گفتید مشکلی در اینقسمت ندارید بعد کاربر رو لاگین کنید و با یه میدلور چک کنید ببینید اگر مقدار register_at برای کاربر لاگین شده برابر با null بود کاربر رو به صفحه قوانین منتقل کنید تا ثبت نامش رو تکمیل کنه و در نهایت بعد از تکمیل ثبت نام مقدار register_at رو برابر تایم استمپ بذارید که این رو هم مقدارش رو از کلاس کربن به شکل Carbon::now میتونید دریافت کنید. اگر هم register_at مقدار داشت و کاربر ثبت نامش رو قبلا تکمیل کرده بود به صفحه اصلی هدایت میکنید این روند مشکل شما رو حل میکنه خیلی پیچیدگی خاصی نداره 1 نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در آبان 1 در در ۱۴۰۱/۸/۲۳ در 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
Paradox 3 گزارش دادن ارسال شده در آبان 1 ارور از سمت سرویس پیامک بود حل شد الان این ارور دارم 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
Paradox 3 گزارش دادن ارسال شده در آبان 1 تو متد 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
Paradox 3 گزارش دادن ارسال شده در آبان 1 اینجا مشکل از 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
saber 143 گزارش دادن ارسال شده در آبان 1 متد لاگین رو دوبار نوشتین؟ توی کدهاتون متد login با دو ورودی مختلف هست کدوم رو الان استفاده میکنید؟ و در مورد خطایی که بالا اشاره کردید کلاس User رو چک کنید ببینید از کلاس Authenticatable ارث بری کرده؟ باید مادل یوزر از این کلاس ارث بری کنه اگر باز نتونستید حل کنید خواستید کدهاش رو برام زیپ کنید بفرستید روی سیستم خودم تست کنم 1 نقل قول Share this post Link to post Share on other sites
Paradox 3 گزارش دادن ارسال شده در آبان 1 در 38 دقیقه قبل، saber گفته است : متد لاگین رو دوبار نوشتین؟ توی کدهاتون متد login با دو ورودی مختلف هست کدوم رو الان استفاده میکنید؟ و در مورد خطایی که بالا اشاره کردید کلاس User رو چک کنید ببینید از کلاس Authenticatable ارث بری کرده؟ باید مادل یوزر از این کلاس ارث بری کنه اگر باز نتونستید حل کنید خواستید کدهاش رو برام زیپ کنید بفرستید روی سیستم خودم تست کنم من موفق نشدم انجام بدم کد براتون ارسال کردم تو پیام خصوصی انجمن تو تلگرام هم فرستادم نقل قول Share this post Link to post Share on other sites
saber 143 گزارش دادن ارسال شده در آبان 1 مشکل اصلی شما رو در تاپیک زیر راه حلش رو نوشتم بعد از ثبت نام هم خطاهای دیگه ای بعد از ثبت کد ارسالی برای کاربر دارید که اونهم مربوط به متد اسکوپ هست که ورودی متد رو باید اصلاح کنید. 1 نقل قول Share this post Link to post Share on other sites