2017-11-28 18 views
1

私は既存のプロジェクトでユーザー名または電子メールでログインを実装しており、うまくいきます。ユーザー名、電子メール、または電話でログインするように拡張したいと思います。私はユーザー名、電子メール、または電話番号とパスワードのいずれかでログインする必要があります。ここでLaravel - ユーザーネーム、電子メールまたは電話でログインしてください

私のコードは のApp \のHttp \コントローラである

<?php 

namespace App\Http\Controllers\Auth; 
use Socialite; 

use Illuminate\Http\Request; 
use App\Http\Controllers\Controller; 
use Illuminate\Foundation\Auth\AuthenticatesUsers; 

class LoginController extends Controller 
{ 
    /* 
    |-------------------------------------------------------------------------- 
    | Login Controller 
    |-------------------------------------------------------------------------- 
    | 
    | This controller handles authenticating users for the application and 
    | redirecting them to your home screen. The controller uses a trait 
    | to conveniently provide its functionality to your applications. 
    | 
    */ 

    use AuthenticatesUsers; 

    /** 
    * Where to redirect users after login. 
    * 
    * @var string 
    */ 
    protected $redirectTo = '/home'; 

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

    /** 
    * Redirect the user to the GitHub authentication page. 
    * 
    * @return \Illuminate\Http\Response 
    */ 
     public function redirectToProvider($social) 
     { 
      return Socialite::driver($social)->redirect(); 
     } 

     /** 
     * Obtain the user information from GitHub. 
     * 
     * @return \Illuminate\Http\Response 
     */ 
     public function handleProviderCallback($social) 
     { 
      $user = Socialite::driver($social)->user(); 

      // $user->token; 
     } 
     /** 
     * Get the needed authorization credentials from the request. 
     * 
     * @param \Illuminate\Http\Request $request 
     * @return array 
     */ 
     protected function credentials(Request $request) 
     { 
      $field = filter_var($request->get($this->username()), FILTER_VALIDATE_EMAIL) 
       ? $this->username() 
       : 'username'; 

      return [ 
       $field => $request->get($this->username()), 
       'password' => $request->password, 
      ]; 
     } 
} 

のApp \のHttp \コントローラのAuth \ LoginControllerを\

<?php 

namespace App\Http\Controllers\Auth; 

use App\User; 
use App\Http\Controllers\Controller; 
use Illuminate\Support\Facades\Validator; 
use Illuminate\Foundation\Auth\RegistersUsers; 

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; 

    /** 
    * Where to redirect users after registration. 
    * 
    * @var string 
    */ 
    protected $redirectTo = '/home'; 

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

    /** 
    * Get a validator for an incoming registration request. 
    * 
    * @param array $data 
    * @return \Illuminate\Contracts\Validation\Validator 
    */ 
    protected function validator(array $data) 
    { 
     return Validator::make($data, [ 
      'name' => 'required|string|max:255', 
      'username' => 'required|string|max:20|unique:users', 
      'phone' => 'required|string|max:20|unique:users', 
      'email' => 'required|string|email|max:255|unique:users', 
      'password' => 'required|string|min:6|confirmed', 
      'gender' => 'required|bool', 
     ]); 
    } 

    /** 
    * Create a new user instance after a valid registration. 
    * 
    * @param array $data 
    * @return \App\User 
    */ 
    protected function create(array $data) 
    { 
     if($data['gender']) 
      { 
      $avatar = 'default/avatars/male.png'; 
      } 
     else 
      { 
      $avatar = 'default/avatars/female.png'; 
      } 
     return User::create([ 
      'name' => $data['name'], 
      'gender' => $data['gender'], 
      'username' => $data['username'], 
      'phone' => $data['phone'], 
      'email' => $data['email'], 
      'password' => bcrypt($data['password']), 
      'slug' => str_slug($data['username']), 
      'avatar' => $avatar, 
     ]); 
    } 
} 

登録は保存することができ、微細でイム作品のAuth \ RegisterControllerを\ユーザーの電話をユーザーテーブルに追加します。私はview/auth/login.php上のテキストに電子メールの入力タイプを変更して、ユーザー名か電子メールでログインできるようにしました。

LoginControllerでユーザー名を電話に変更すると、[App \ Http \ Controllers \ Auth \ LoginController]にメソッド[phone]が存在しないため、電話でログインできません。

私は方法

/** 
    * Create a new controller instance. 
    * 
    * @return void 
    */ 
public function phone() 
    { 
     return 'phone'; 
    } 
/** 
     * Get the needed authorization credentials from the request. 
     * 
     * @param \Illuminate\Http\Request $request 
     * @return array 
     */ 
     protected function credentials(Request $request) 
     { 
      $field = filter_var($request->get($this->phone()), FILTER_VALIDATE_EMAIL) 
       ? $this->phone() 
       : 'phone'; 

      return [ 
       $field => $request->get($this->phone()), 
       'password' => $request->password, 
      ]; 
     } 

を追加するとそれは私が電話を使用してログインすることはできません。エラーこれらの資格情報は当社の記録と一致しません。 はまた、私はユーザ名でログインを達成するためにどのようにユーザー名 と今ではなく、電話や電子メールを使ってログインすることができるよ、電子メールまたは電話

+0

のように見えるユーザ名みては? –

+0

@RazaMehdiはい。そのとおり!今すぐコードを更新しました。私は今電話と電子メールでログインできます。しかし、1つのフィールドからユーザー名や電子メール、または電話でログインする場合 –

+0

値が有効な電子メールか電話かどうかを確認するには、正規表現を使用する必要があります。たとえば、電話機の場合は、数値などしか持たないようにする必要があります。 –

答えて

1

このコードが動作する

/** 
     * Get the needed authorization credentials from the request. 
     * 
     * @param \Illuminate\Http\Request $request 
     * @return array 
     */ 
     protected function credentials(Request $request) 
     { 
      if(is_numeric($request->get('email'))){ 
       return ['phone'=>$request->get('email'),'password'=>$request->get('password')]; 
      } 
      return $request->only($this->username(), 'password'); 
     } 

をしようとしました。誰かを助けることを願っています。

protected function credentials(Request $request) 
     { 
      if(is_numeric($request->get('email'))){ 
      return ['phone'=>$request->get('email'),'password'=>$request->get('password')]; 
      } 
      elseif (filter_var($request->get('email'), FILTER_VALIDATE_EMAIL)) { 
      return ['email' => $request->get('email'), 'password'=>$request->get('password')]; 
      } 
      return ['username' => $request->get('email'), 'password'=>$request->get('password')]; 
     } 

数字の場合は、番号でログインしてください。電子メールの場合は、電子メールアドレスでログインしてください。エルス

最終LoginControllerあなたは正しいユーザ名、電子メールまたは電話のいずれかを使用してログインする単一のフィールドを使用しているこの

<?php 

namespace App\Http\Controllers\Auth; 
use Socialite; 

use Illuminate\Http\Request; 
use App\Http\Controllers\Controller; 
use Illuminate\Foundation\Auth\AuthenticatesUsers; 

class LoginController extends Controller 
{ 
    /* 
    |-------------------------------------------------------------------------- 
    | Login Controller 
    |-------------------------------------------------------------------------- 
    | 
    | This controller handles authenticating users for the application and 
    | redirecting them to your home screen. The controller uses a trait 
    | to conveniently provide its functionality to your applications. 
    | 
    */ 

    use AuthenticatesUsers; 

    /** 
    * Where to redirect users after login. 
    * 
    * @var string 
    */ 
    protected $redirectTo = '/home'; 

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

    /** 
    * Redirect the user to the GitHub authentication page. 
    * 
    * @return \Illuminate\Http\Response 
    */ 
     public function redirectToProvider($social) 
     { 
      return Socialite::driver($social)->redirect(); 
     } 

     /** 
     * Obtain the user information from GitHub. 
     * 
     * @return \Illuminate\Http\Response 
     */ 
     public function handleProviderCallback($social) 
     { 
      $user = Socialite::driver($social)->user(); 

      // $user->token; 
     } 

     /** 
     * Get the needed authorization credentials from the request. 
     * 
     * @param \Illuminate\Http\Request $request 
     * @return array 
     */ 
     protected function credentials(Request $request) 
     { 
      if(is_numeric($request->get('email'))){ 
      return ['phone'=>$request->get('email'),'password'=>$request->get('password')]; 
      } 
      elseif (filter_var($request->get('email'), FILTER_VALIDATE_EMAIL)) { 
      return ['email' => $request->get('email'), 'password'=>$request->get('password')]; 
      } 
      return ['username' => $request->get('email'), 'password'=>$request->get('password')]; 
     } 
} 
関連する問題