2016-11-27 43 views
1

我从笨来laravel并仍然相当新,所以原谅我,如果这是显而易见的。我正在努力尝试一些看起来很简单但在网上找不到任何信息的东西,但是发现了一些接近的软件包。增加公司注册于SaaS的应用Laravel

我已经在注册时添加了一个输入字段来捕获公司名称,一旦他们点击注册,它应该像添加用户信息一样将用户信息添加到用户表中,而且还将company_name添加到companies表的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_id0,并且不会在companies表中添加任何内容。

我怎么会去上添加注册创建领域用户在users表时保存它添加到companies表中输入company_name然后和存储company_id

------------------------------------------- 修订 -------------------------------------------

这里是我的最新的认证/ RegisterController.php(我猜的最新版本Laravel Framework版本5.3.24休息验证了在各种控制器)

<?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); 
    } 

这种方法是在复数一个公司可以有许多用户。这不是必需的,但更有意义。

此外,用户模型的关系(你的方法公司())应该是:

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

首先,惯例是写方法名称以小写字母(驼峰)。其次,你的用户模型已经定义了许多关系 - 这是错误的。用户没有很多公司,但他属于公司。

如果因为任何原因想要先创建用户,那么方法是创建一个用户,创建一个公司,然后以该公司的id和更新用户。

事情是这样的:

$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 ----------------

确保您在create()方法上返回$ user,而不是$ company,因为它期望用户返回。

$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 array中列出的数据。

+0

不幸的是,也没有工作要么 – Derek