2016-01-07 1 views
4

Я довольно новичок в laravel (используя 5.2, которая является последней версией на сегодняшний день), поэтому у меня есть следующая дилемма: я знаю, что Laravel поставляется с классом User прямо из коробки, но я хочу разработать систему, У меня могут быть еще два типа пользователей: Researcher и Admin.Могу ли я создать новый класс, который наследуется от пользователя в Laravel 5.2?

Моя основная потребность в создании совершенно разных классов пользователей (Исследователь и Администратор), возможно наследующих от User, потому что бизнес-логика почти на 100% отличается от них, и я бы не хотел создавать столбец в базе данных для классификации тип пользователя. Кроме того, не так много полей, которые перекрываются между запасами User, Admin и Researcher классами.

Мой главный вопрос: будет ли все еще работать одинаково (Auth Controller, middleware enabled и т. Д.), Если я наследую от User для других моих 2 классов? Я знаю, что принципы объектно-ориентированного программирования и интуиции, я полагаю, я должен быть хорошо, если я следующее:

//'Stock' User class: 
// 
class User extends Authenticatable{ 
    //Any overlapping logic between Researcher and Admin. 
} 


class Researcher extends User{ 
    //My class definition here. 
} 

class Admin extends User{ 
    //My class definition here. 
} 

И затем использовать оба класса, как я обычно использую экземпляр класса User. Под этим я подразумеваю использование всех методов и прямо из коробки User.

ВОПРОС РАСШИРЕНИЕ: Во время написания мой вопрос, я понимаю, что класс User выглядит так по умолчанию:

<?php 

namespace App; 

use Illuminate\Foundation\Auth\User as Authenticatable; 

class User extends Authenticatable 
{ 
    /** 
    * The attributes that are mass assignable. 
    * 
    * @var array 
    */ 
    protected $fillable = [ 
     'name', 'email', 'password', 
    ]; 

    /** 
    * The attributes excluded from the model's JSON form. 
    * 
    * @var array 
    */ 
    protected $hidden = [ 
     'password', 'remember_token', 
    ]; 
} 

Может я не просто следующее вместо унаследованного от User создать мои другие 2 класса (Researcher & Admin):

//Researcher Class: 
namespace App; 

use Illuminate\Foundation\Auth\User as Authenticatable; 

class Researcher extends Authenticatable 
{ 
    //Class definition... 
} 

... 

//Admin Class: 
namespace App; 

use Illuminate\Foundation\Auth\User as Authenticatable; 

class Admin extends Authenticatable 
{ 
    //Class definition 
} 

в этом подходе, я пытаюсь 'имитируют' на User класс. Дело в том, что я не знаю, есть ли какая-либо логика в ядре, которая жестко запрограммирована, и неявно ссылается на класс User.

Любые мысли и помощь будут высоко оценены. Извините, если это глупо для вас. Я только начинаю с рамки laravel.

Cheers!

ответ

0

Если вы хотите, чтобы несколько классов для пользователя для аутентификации, то прочитайте следующую тему:

How to use multi Auth in laravel 5.2

Я надеюсь, что это помогает!

0

Да, вы можете расширить класс Illuminate\Foundation\Auth\User:

use Illuminate\Foundation\Auth\User as Authenticatable; 

class Researcher extends Authenticatable { 
    //My class definition here. 
} 

Если вы посмотрите на User класс:

class User extends Model implements 
    AuthenticatableContract, 
    AuthorizableContract, 
    CanResetPasswordContract 
{ 
    use Authenticatable, Authorizable, CanResetPassword; 
} 

вы видите, что он расширяет Model класс и реализует все другие полезные интерфейсы для обработки подлинности

Вы можете безопасно расширить User класс, потому что Laravel достаточно хорошо, чтобы работать с интерфейсом Illuminate\Contracts\Auth\Authenticatable для обработки аутентификации, а не непосредственно с User класса

В самом деле, если вы проверяете в:

Illuminate/Auth/SessionGuard.php 

Это является основным классом для обработка аутентификации, вы увидите, что все Auth действия производятся с интерфейсом Illuminate\Contracts\Auth\Authenticatable, то есть:

/** 
* Log a user into the application. 
* 
* @param \Illuminate\Contracts\Auth\Authenticatable $user 
* @param bool $remember 
* @return void 
*/ 
public function login(AuthenticatableContract $user, $remember = false) 
{ 
    //other code 
} 

Думаю, что ваша реальная проблема будет: как в заставляют классы Researcher и Admin вместо класса User во время процесса аутентификации?

Если вы используете Eloquent в качестве драйвера аутентификации, по умолчанию Laravel собирается использовать Illuminate\Auth\EloquentUserProvider для создания экземпляра модели. Итак, если вы хотите создать экземпляр одного из своих классов вместо User, вы должны переопределить этого провайдера (или создать свой собственный), и здесь вы можете выбрать класс для создания экземпляра

+0

Я думаю, что лучше всего здесь идти с вашим подходом. Единственное, что я хотел бы знать, - где я могу зарегистрировать этого нового провайдера? Я полагаюсь на 'App \ config \ app.php', я прав? Моя первая мысль заключалась в том, чтобы создать как под «Illuminate \ Auth \» как «EloquentAdminProvider», так и «EloquentResearcherProvider», но тогда это не имеет большого смысла, поскольку оно не является частью пакета Illuminate. Я думаю, что я создам обоих поставщиков в «пользовательском» каталоге 'App \ Custom \ Providers \'. – idelara

+0

@JackGal: вы можете создать специализированного поставщика услуг, в котором вы можете зарегистрировать новый 'EloquentResearcherProvider'. и заставить приложение использовать его вместо стандартного 'EloquentUserProvider'. Вы никогда не должны писать свой код в папке «vendor» – Moppo