مصطفی جمالی
4 سال پیش توسط مصطفی جمالی مطرح شد
3 پاسخ

مشکل در شخصی سازی احراز هویت لاراول

سلام دوستان امیدوارم حالتون خوب باشه،
من میخوام سیستم احراز هویت لاراولمو شخصی سازی کنم درواقع اومدم یه کلاس ابسترکت یوزر برای خودم تعریف کردم بعدبقیه نقش هارو از اون ارث بری کردم درواقع اطلاعات اصلی هر یوزر میره توی جدول اصلی یوزرز و مابقی اطلاعات فراخور اون نقش کاربری میره تو جدول مجزا ،
منتها من تو اعمال این تغییرات به مشکل برخوردم و اطلاعات به پایگاه داده ارسال نمیشه ثبت نام بدون اررور انجام میشه اما اتفاقی نمیفته😓
البته تو سرچام به این نتیجه رسیدم که برم تو قسمت config->auth اونجا مقادیر provider و اینارو طبق هر کلاس قرار بدم اما مشکلم اینه که طراحی شی گرام اینطوریه که اطلاعات اصلی هر یوزرز از طریق کلاس یوزرز بره توی دیتابیس و بقیه نقش های کاربریمم از این کلاس ارث بری میکنن اما اینطوری فکر میکنم باید هریوزر جدول کامل داشته باشه و راستش قاطی کردم
کد کلاس ابسترکت اصلیم :

<?php

namespace App\Users;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

abstract class User extends Authenticatable 
{
    use Notifiable;

    //It's important that all files for view or etc should follow its owner lower  name
    //ex:register.blade.php Is Original then we have register.student.blade.php

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'fname','lname', 'email', 'password','nationalcode','birthdate',
        'mobile','secondMobile','telephone','webpage','education_place','study_field',
        'study_orention','avatar'
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    //Learnit functions
    public static function getAllTypes()
    {
        return config('auth.account_types');

    }
    abstract public function setLocaleFillable();
    abstract public function getLocaleFillable();
    abstract public static  function getLocalValidation();
    abstract public function getFillableItemKeys();

}

کد کلاس فرزند (نقش دیگه):

<?php
namespace App\Users;
class Student extends User implements Learner
{
    private $learnerFillable=
    ['learnerCode'];

    public static function getLocalValidation()
    {
    //this function passed to Register Controller

        $validationItem=[
            'learnerCode'=>['required','digits:9']
        ];
        return $validationItem;

    }
    public function __construct()
    {
    }

    public function setLocaleFillable()
    {
        mergeSelfFillableToParent();
    }
    public function getLocaleFillable()
    {
        return
            $this->learnerFillable;
    }
    public function getFillableItemKeys()
    {
        return array_keys($this->learnerFillable);
    }

    public function setLearnercode()
    {
        $this->learnerFillable['learnerCode']=substr(md5(microtime().rand()),9);
    }
    public function getLearnercode()
    {
        return
         $this->learnerFillable['learnerCode'];
    }

    private function mergeSelfFillableToParent()
    {
        return
            array_merge(parent::$fillable,$this->learnerFillable);

    }

}
اینم از اینتفریسش
<?php
namespace App\Users;
interface Learner 
{
    public function setLearnerCode();
    public function getLearnerCode();
}

کلاس رجیستر کنترلر

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Http\Request;
class RegisterController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Register Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles the registration of new users as well as their
    | validation and creation. By default this controller uses a trait to
    | provide this functionality without requiring any additional code.
    |
    */

    use RegistersUsers;

    /*
    user Object that get object name from user input(userType)
    */
    private $userObj;
    /**
     * Where to redirect users after registration.
     *
     * @var string
     */
    protected $redirectTo = RouteServiceProvider::HOME;
    protected $table;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct(Request $request)
    {
        //$this->redirectTo=$this->redirectTo();

        $this->middleware('guest');
        //set our createable user class
        $this->userObj='App\Users\\'.ucfirst($request->input('userType'));
        $this->table=$this->userObj;
    }
    public function redirectTo()
    {
        return app()->getLocale() . '/home';
    }
    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(array $data)
    {
        $validator_data=[
            'fname' => ['required', 'string', 'max:255'],
            'lname' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'password' => ['required', 'string', 'min:8', 'confirmed'],
            'nationalcode' => ['required', 'digits:10'],
            'person_type'=>['required','in_array:User::getAllTypes()'],
            'birthdate' => ['required', 'date', 'max:255'],
            'mobile' => ['required', 'digits_between:11,14'],
            'secondMobile' => ['required', 'digits_between:11,14'],
            'telephone' => ['required', 'digits_between:11,14'],
            'webpage' => ['active_url', 'max:255'],
            'education_place'=>['string','max:255'],
            'study_field'=>['string','max:255'],
            'study_orention'=>['string','max:255'],
            'avatar'=>['between:5,1024|image'],

        ];
        array_merge($validator_data,$this->userObj::getLocalValidation());

        return Validator::make($data,$validator_data);

        //special validation for each class(userType)
        ///die($this->userObj);

    }

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return \App\User
     */
    protected function create(array $data)
    {

        $userObjArray=[
            'fname' => $data['fname'],
            'lname' => $data['lname'],
            'nationalcode' => $data['nationalcode'],
            'birthdate' => $data['birthdate'],
            'mobile' => $data['mobile'],
            'secondMobile' => $data['secondMobile'],
            'telephone' => $data['telephone'],
            'webpage' => $data['webpage'],
            'education_place' => $data['education_place'],
            'study_field' => $data['study_field'],
            'study_orention' => $data['study_orention'],
            'avatar' => $data['avatar'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
        ];
        //assign local fillableItem into create static method of UsersObject
        foreach($userObj::getFillableItemKeys() as $item)
        {
            $userObjArray[$item]=$data[$item];
        }

        $userObj=$userObj::create(ucfirst($userObjArray));//ourClassesName first char is Upper

        try{
        sendWelcomeNotification($userObj);
        }
        catch(Exception $e)
        {
            echo 'error';
        }

        return $userObj;
    }
    private function sendWelcomeNotification()
        //\App\User $user)
    {
        Notification::send($this->userObj,new sendWelcomeNotification(USER));
    }
    public function ajaxShowUserTypeRegForm(Request $request)
    ////$locale is for fixing the bug because one variable 
    //just get locale variable from route 
    {
        if(in_array($request->input('selectVal'),config('auth.account_types'),TRUE))
        {

          //  return 'sdf';
          //return ("auth/register_".$request->input('selectVal'));
          return view("auth/register_".$request->input('selectVal'))->render();
        }
        else
            return 'Error from input that sent.';
    }   

}

ثبت پرسش جدید
حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
0

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

public function login(Request $request)
 // valiodate
if (Auth::attempt([
    'email' => request->email,
    'password' => request->password
])) {
    return redirect('آدرس صفحه مورد نظر');
}

متد attempt اگر اطلاعات درست بود خودش لاگین میکنه


مصطفی جمالی
تخصص : برنامه نویس
@lordmostafajamali 4 سال پیش مطرح شد
0

ممنونم ازت داداش لطف کردی پیشنهادت جالب بود اما من میخوام از خود پکیج auth لاراول تجربه کسب کنم.(سادیسم ندارما صرفا تجربه 😂😂)


مصطفی جمالی
تخصص : برنامه نویس
@lordmostafajamali 4 سال پیش مطرح شد
0

@hesammousavi استاد عزیز ، نظر شما چیه؟


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام