2016-11-27 2 views
1

Я прихожу от codeigniter к laravel и все еще довольно новичок, поэтому извините, если это очевидно. Я борюсь с чем-то, что кажется довольно простым, но не может найти информацию в Интернете, но нашел несколько пакетов, которые приближаются.Добавление регистрации компании в приложение SaaS Laravel

Я добавил поле ввода для регистрации, чтобы зафиксировать название компании, после того как они нажмут регистр, он должен добавить информацию о пользователе в таблицу пользователя, как это происходит, а также добавить имя_компании в столбец company_name таблицы компаний.

компании Таблица: Таблица

+----+----------------+----------------+--------------+ 
| ID | company_name | created_at | updated_at | 
+----+----------------+----------------+--------------+ 

Пользователь:

+----+------------+------+-------+----------+----------------+------------+------------+ 
| ID | company_id | name | email | password | remember_token | created_at | updated_at | 
+----+------------+------+-------+----------+----------------+------------+------------+ 

компаний Модель:

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Companies extends Model 
{ 
    // 
    // 
    protected $fillable = [ 
     'company_name', 
    ]; 

} 

пользователя Модель:

namespace App; 

use Illuminate\Foundation\Auth\User as Authenticatable; 
use Zizaco\Entrust\Traits\EntrustUserTrait; 

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

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

    public function Company() 
    { 
     return $this->hasMany('App\Companies'); 
    } 
} 

И в моем AuthController:

namespace App\Http\Controllers\Auth; 

use App\User; 
use App\Companies; 
use Validator; 
use App\Http\Controllers\Controller; 
use App\Http\Controllers\CompanyController; 
use Illuminate\Foundation\Auth\ThrottlesLogins; 
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers; 

class AuthController extends Controller 
{ 
    /* 
    |-------------------------------------------------------------------------- 
    | Registration & Login Controller 
    |-------------------------------------------------------------------------- 
    | 
    | This controller handles the registration of new users, as well as the 
    | authentication of existing users. By default, this controller uses 
    | a simple trait to add these behaviors. Why don't you explore it? 
    | 
    */ 

    use AuthenticatesAndRegistersUsers, ThrottlesLogins; 

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

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

    /** 
    * 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, [ 
      'company_name' => 'required|min:5|unique:companies,company_name', 
      'name' => 'required|max:255', 
      'email' => 'required|email|max:255|unique:users', 
      'password' => 'required|min:6|confirmed', 
     ]); 
    } 

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

     $user = User::create([ 
      'name' => $data['name'], 
      'email' => $data['email'], 
      'password' => bcrypt($data['password']), 
     ]); 
     $user->Company()->create(['company_name'=>$data['company_name']]); 
     $user->attachRole(1); // parameter can be an Role object, array, or id 
     return $user; 
    } 
} 

И, наконец, здесь есть форма в моем register.blade.php

<div class="register-box-body"> 
      <div class="register-box-body"> 
<p class="login-box-msg">Register a new membership</p> 
<form action="{{ url('/auth/register') }}" method="post"> 
    <input type="hidden" name="_token" value="{{ csrf_token() }}"> 
    <div class="form-group has-feedback"> 
     <input type="text" class="form-control" placeholder="Company name" name="company_name" value="{{ old('company_name') }}"/> 
     <span class="glyphicon glyphicon-globe form-control-feedback"></span> 
    </div> 
    <div class="form-group has-feedback"> 
     <input type="text" class="form-control" placeholder="Full name" name="name" value="{{ old('name') }}"/> 
     <span class="glyphicon glyphicon-user form-control-feedback"></span> 
    </div> 
    <div class="form-group has-feedback"> 
     <input type="email" class="form-control" placeholder="Email" name="email" value="{{ old('email') }}"/> 
     <span class="glyphicon glyphicon-envelope form-control-feedback"></span> 
    </div> 
    <div class="form-group has-feedback"> 
     <input type="password" class="form-control" placeholder="Password" name="password"/> 
     <span class="glyphicon glyphicon-lock form-control-feedback"></span> 
    </div> 
    <div class="form-group has-feedback"> 
     <input type="password" class="form-control" placeholder="Retype password" name="password_confirmation"/> 
     <span class="glyphicon glyphicon-log-in form-control-feedback"></span> 
    </div> 
    <div class="row"> 
     <div class="col-xs-8"> 
      <div class="checkbox icheck"> 
       <label> 
        <input type="checkbox"> I agree to the <a href="#">terms</a> 
       </label> 
      </div> 
     </div><!-- /.col --> 
     <div class="col-xs-4"> 
      <button type="submit" class="btn btn-primary btn-block btn-flat">Register</button> 
     </div><!-- /.col --> 
    </div> 
</form> 

Это все кажется правильным основанный на this question's answer. Однако, когда я регистрирую его, он просто создает информацию о пользователе в таблице users с company_id: 0 и ничего не добавляет к таблице companies.

Как бы идти о добавлении создания поля при регистрации для пользователя, чтобы ввести company_name, а затем при сохранении он добавляет к companies таблице и сохраняет company_id в users таблицы?

------------------------------------------- ОБНОВЛЕНО -------------------------------------------

Вот моя последняя Auth/RegisterController.php (я предполагаю, что последняя версия Laravel Framework версии 5.3.24 разрывы Auth в различных контроллерах)

<?php 

namespace App\Http\Controllers\Auth; 

use App\User; 
use App\Company; 
use Validator; 
use App\Http\Controllers\Controller; 
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 login/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, [ 
      'company_name' => 'required|unique:companies,company_name', 
      'name' => 'required|max:255', 
      'email' => 'required|email|max:255|unique:users', 
      'password' => 'required|min:6|confirmed', 
     ]); 
    } 

    /** 
    * Create a new user instance after a valid registration. 
    * 
    * @param array $data 
    * @return User 
    */ 
    protected function create(array $data) 
    { 
     $company = \App\Company::create(['company_name'=>$data['company_name']]); 

     $company->users()->create([ 
      'name' => $data['name'], 
      'email' => $data['email'], 
      'password' => bcrypt($data['password']), 
     ]); 

     return $company; 

     // User::create([ 
     //  'name' => $data['name'], 
     //  'email' => $data['email'], 
     //  'password' => bcrypt($data['password']), 
     // ]); 
    } 
} 
+0

Ваш первый пример - это хорошо, второй - фактически тот же, но имеет менее логичный смысл. Однако оба должны работать. В любом примере создается компания, и у нее есть таблица «id» в вашей компании, которая не '0'? –

ответ

4

Я вижу сейчас. Вы делаете это в неправильном направлении. Сначала вам нужно сделать компанию. Затем пользователь. Что-то вроде этого:

$company = \App\Companies::create(['company_name'=>$data['company_name']]); 
    $company->users()->create([ 
      'name' => $data['name'], 
      'email' => $data['email'], 
      'password' => bcrypt($data['password']), 
     ]); 

Если вы думаете об этом, это имеет смысл. Если вы сначала создаете пользователя, вы не можете заполнить company_id, поскольку компания еще не существует.

Одна вещь, которую я настоятельно рекомендую, - это назвать ваши модели в единственном числе - компания не является компанией, поскольку это обычное соглашение.

Кроме того, сделайте() метод, что вы определили пользователей на модели компаний

public function users() 
    { 
     return $this->hasMany(\App\User::class); 
    } 

Этот метод является во множественном числе, как одна компания может иметь множество пользователей. Это не требуется, но имеет смысл.

Кроме того, отношения на модели пользователя (ваш метод Company()) должно быть:

public function company() 
    { 
     return $this->belongsTo(\App\Company::class); 
    } 

Во-первых, конвенция писать имена методов, начинающиеся с буквы в нижнем регистре (CamelCase). Во-вторых, ваша модель пользователя имеет hasMany отношения определены - это неправильно. У пользователя не так много компаний, но он принадлежит компании.

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

Что-то вроде этого:

$user = \App\Users::create([ 
      'name' => $data['name'], 
      'email' => $data['email'], 
      'password' => bcrypt($data['password']), 
     ]); 
$company = \App\Companies::create(['company_name'=>$data['company_name']]); 
$user->company_id = $company->id; 
$user->save(); 

-------------- ОБНОВЛЕНИЕ НА ОСНОВЕ ВОПРОСЕ UPDATE ----------------

Обязательно верните $ user метод create(), а не компанию $, так как он ожидает возврата пользователя.

$company = \App\Companies::create(['company_name'=>$data['company_name']]); 
$user = $company->users()->create([ 
       'name' => $data['name'], 
       'email' => $data['email'], 
       'password' => bcrypt($data['password']), 
      ]); 
return $user; 
+0

Странно, это не работало над установкой, где я установил админ, поручить и помещичьи пакеты. Но когда я сделал новую установку (без пакетов), это сработало нормально. Однако после регистрации я столкнулся с ошибкой в ​​новой установке. Проверка базы данных выглядит так, как будто все было вставлено так, как предполагалось. Почему я получаю эту ошибку: http://imgur.com/a/JR8RW – Derek

+0

Похоже, что вы, возможно, импортировали что-то неправильно. Можете ли вы отправить свой AuthController, как он выглядит сейчас? – schrink

+0

Просто обновленный вопрос, запустил 'php artisan --version' и выяснил, что я запускаю Laravel Framework версии 5.3.24, которая разбивает Auth в разных контроллерах. – Derek

1

Попробуйте сделать «company_id» Fillable в модели пользователя. Метод Create имеет защиту для массового присвоения. Вы не можете вставлять данные, которые не указаны в $ fillable array.

+0

К сожалению, это не сработало ни – Derek

Смежные вопросы