2016-12-13 2 views
4

Я новичок в laravel и работаю с кассиром для веб-приложения, которое я разрабатываю. В моем приложении пользователь создает свою учетную запись и компанию, и им разрешено использовать приложение. Поскольку у компании может быть много пользователей, мне нужен кассир, чтобы проверить, есть ли у компании подписка или нет.Laravel 5 и Cashier on Company table

В cashier docs с использованием Stripe Я установил его там, где перед вами не требуется кредитная карта, и они могут использовать систему в течение 14 дней, пока не будет предложено ввести кредитную карту.

До сих пор я успешно создал столбцы кассира на моей странице компаний и добавил таблицу подписок в соответствии с документами.
add_cashier_table_fields.php миграция файл:

<?php 

use Illuminate\Support\Facades\Schema; 
use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Database\Migrations\Migration; 

class AddCashierTableFields extends Migration 
{ 
    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     // 
     Schema::table('companies', function ($table) { 
      $table->string('stripe_id')->nullable(); 
      $table->string('card_brand')->nullable(); 
      $table->string('card_last_four')->nullable(); 
      $table->timestamp('trial_ends_at')->nullable(); 
     }); 

     Schema::create('subscriptions', function ($table) { 
      $table->increments('id'); 
      $table->integer('company_id'); 
      $table->string('name'); 
      $table->string('stripe_id'); 
      $table->string('stripe_plan'); 
      $table->integer('quantity'); 
      $table->timestamp('trial_ends_at')->nullable(); 
      $table->timestamp('ends_at')->nullable(); 
      $table->timestamps(); 
     }); 
    } 

    /** 
    * Reverse the migrations. 
    * 
    * @return void 
    */ 
    public function down() 
    { 
     // 
    } 
} 

Тогда в моей модели компании я добавил Оплачиваемую черту, как предложено. Company.php - модель

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 
use Laravel\Cashier\Billable; 

class Company extends Model 
{ 
    use Billable; 
    protected $dates = [ 
     'trial_ends_at', 
     'subscription_ends_at' 
    ]; 

    protected $fillable = [ 
     'company_name', 
     'trial_ends_at', 
     'subscription_ends_at' 
    ]; 

    protected $cardUpFront = false; 

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

Теперь в моем файле RegisterController.php я его где, когда компания создается там, где он будет Углерод дата 14 дней с того дня и добавить в 'trial_ends_at' колонку Auth/RegisterController.php

<?php 

namespace App\Http\Controllers\Auth; 

use App\User; 
use App\Company; 
use Validator; 
use App\Http\Controllers\Controller; 
use Illuminate\Foundation\Auth\RegistersUsers; 
use Carbon\Carbon; 

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'], 
      'trial_ends_at' => Carbon::now()->addDays(14), //Collect CC# 14 days from now 
     ]); 

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

     $user->attachRole(1); //Admin role 

     return $user; 

    } 
} 

Я пытаюсь проверить, если текущая подписка находится в пределах его испытательного срока или не используя

if ($company->onTrial()) {} 

Я считаю, что мне нужно ограничить доступ ко всей системе (кроме страниц регистрации), я должен использовать промежуточное программное обеспечение для проверки статуса подписки. Так что я создал Subscription.php промежуточное программное обеспечение со следующими требованиями:

<?php 

namespace App\Http\Middleware; 

use Closure; 
use App\User; 
use App\Company; 
use Illuminate\Support\Facades\Auth; 

class Subscription 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     if (Auth::check()){ 
      //dd($request->user); 
;   $companyID = Auth::user()->company_id; 
      $company = Company::find($companyID); 
      dd($company->onTrial()); 
      if($company->onTrial()){ 
       return redirect('order'); 
      } 
     } 
     return $next($request); 
    } 
} 

Вопрос: Что является лучшим способом, чтобы прикрепить к кассиру компании (вместо одного пользователя) и ограничить доступ к системе, если подписка не активна ? Когда я var_dump($company->onTrial()), что он всегда печатает false? Я убедился, что дата была в начале этого года, поэтому я должен пройти пробное время, но независимо от того, нахожусь ли я в пробном таймфрейме или нет, он всегда печатает ложь. Является ли это лучшим подходом к тому, что я пытаюсь сделать? Извиняясь за весь код, я хотел дать всем картину, потому что информации об этом в Интернете мало.

Единственная вещь, которую я могу отличить от other posts about this topic, - это модель моей компании, которая расширяет модель, а не Authenticatable. Я подтвердил, что подписка была добавлена ​​в мой файл kernel.php, а промежуточное программное обеспечение регистрируется в файле маршрутов.

+0

Я не знаю anwser, но спасибо, что написал четкий подробный вопрос! –

ответ

1

Оказалось, что это работает. Когда я вручную меняю свои даты в базе данных, чтобы быть вне моего пробного, он возвращает false, так же, если я нахожусь в пробном периоде, он возвращает true. В моем случае мне нужно было проверить onTrial(), а также если текущий url был localhost: 8000/order - если нет, приложение перенаправляет их на эту страницу заказа, пока они не войдут в свою карточную информацию. Я размещаю свое последнее промежуточное ПО здесь, если кто-то в будущем будет иметь схожую ситуацию и нуждается в коде функционирования. (Все еще не знаю, подходит ли это лучший подход, но он работает)

<?php 

namespace App\Http\Middleware; 

use Closure; 
use App\User; 
use App\Company; 
use Illuminate\Support\Facades\Auth; 

class Subscription 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     if (Auth::check()){ 
      //dd($request->user); 
      $companyID = Auth::user()->company_id; 
      $company = Company::find($companyID); 
      //dd($company->onTrial()); 
      if(!$company->onTrial() && $request->path() != 'order'){ //If trial has expired redirect to order page 
       return redirect('order'); 
      } 
     } 
     return $next($request); 
    } 
} 
Смежные вопросы