Блог Vaden Pro

Все о самостоятельном создании и продвижении сайтов

Laravel Spark. Углубленное рассмотрение

Раздел: 

Если в последние пару месяцев Вы следили за новостями связанными с Laravel или же присутствовали на Лараконах в США или Европе, то уже должны были неоднократно слышать о Laravel Spark. Ну а в том случае, если Вы впервые узнали о этой новинке, то рекомендую ознакомиться с видео с Европейского Ларакона, в котором Тайлер ее презентует.

Laravel Spark

Эта статья не спешила с выходом в мир, поскольку данный проект значительно изменился за время своего развития. На сегодняшний же день наконец вышел альфа-релиз Spark-а, потому появилось Api с которым уже можно работать. Хотя некоторые различия между конечным вариантом и текущей версией все же будут.

ВАЖНО! В данной статье описан альфа-релиз. Он еще не отражает окончательную версию api или же функционал технологии. Spark еще неоднократно изменится до своего релиза и не все новшества будут моментально отражены в данной статье. Если же Вы не испытываете особого васторга от работы с данным функционалом и вообще считаете что его создание было плохой идеей, то еще раз повторюсь, это альфа релиз и он еще будет серьезно доработан.

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

Для чего нужен Spark?

Если Вы все еще не понимаете что же такое Laravel Spark, то уточняю, что это инструмент созданный для ускорения SaaS-приложений, который обрабатывает авторизацию пользователей, запланированные события и платежи, выстраивание командной логики.

Большинство SaaS-приложений имеют такие же компоненты: аккаунты пользователей Stripe платежи и различные платежные планы. И многие из них имеют платежные купоны, возможность совместной оплаты заказов.

Чтобы не создавать каждый раз весь этот функционал при разработке нового приложения на Laravel, просто используйте Spark и Вы сразу получите весь необходимый функционал и бесплатный SaaS лендинг для загрузки.

Spark landing

Установка

Как и в случае с Laravel или Lumen, Spark можно просто установить воспользовавшись Composer-ом. Для этого следует воспользоваться командой:

composer global require "laravel/spark-installer=~1.0"

Обратите внимание: как и в случае использования прочих установщиков, сначала убедитесь, что global Composer bin находится в Вашей системной переменной $PATH, чтобы при запуске spark из командной строки он был обнаружен внутри данной папки.

Добавление Spark в новый Laravel install

Итак, давайте создадим новое приложение:

cd ~/Sites
laravel new spark-blog-post
cd spark-blog-post

После установим Spark командой:

spark install

Вот несколько подсказок по процессу установки (возможно Вас устроит вариант просто везде выбрать yes):

Установка Spark

Далее идем в .env и добавляем Ваши Stripe Key & Secret, и, по желанию, Authy key.

Migrations

Если Вы, как и я разрабатываете на Homestead, то на этапе «миграций» можете ничего не делать. И если Вы не добавили ваше .env до запуска spark install, о чем я не упоминал ранее, то тогда ничего делать уж точно не стоит. Но это нормально.

Лучший способ сделать это, если Вы настраиваете сайт на Homestead, это сразу после установки спарка перейти к редактированию .env файла, чтобы настроить имя базы данных сайта, которую Вы желаете использовать для данного сайта. После выкачиваем базу данных через ssh из Homestead box. Вот и все.

Какие изменения вносит Spark в Ваши файлы?

Изменений происходит совсем не много. Проверить это можно тут:

Spark изменения файлов

Как видим меняется несколько стандартных views (к примеру меняется root с показа welcome на показ spark::welcome) и добавляется прочее (/home обернутое в auth middleware). Также обновляется User модель чтобы стать Billable и TwoFactorAuthenticatable. Это добавляет несколько полей связанных с пользователем, с которыми Вы уже можете быть знакомы, если ранее работали с Laravel Cashier (если еще не догадались, Cashier- это зависимость от Spark).

Также добавляются CashierServiceProvider и два SparkServiceProviders. Это обновляет e-mail сброса пароля, чтобы был задействован функционал от Spark. Обновляется экспорт create tables для добавления Cashier, Team, и Two-Factor Auth.

И, в конце концов, это подгружает app.js в Elixir и добавляет несколько специфичных для спарка Sass переменных в app.scss.

Новые файлы из Spark

Spark также добавляет несколько новых файлов для Вас. Давайте просмотрим их:

app/Providers/SparkServiceProvider.php

SparkServiceProvider — файл в котором содержится большинство настроек, потому он весьма большой.

<?php
 
namespace App\Providers;
 
use App\Team;
use Validator;
use Laravel\Spark\Spark;
use Illuminate\Http\Request;
use Laravel\Spark\Providers\AppServiceProvider as ServiceProvider;
 
class SparkServiceProvider extends ServiceProvider
{
    /**
     * Meta-data included in invoices generated by Spark.
     *
     * @var array
     */
    protected $invoiceWith = [
        'vendor' => 'Your Company',
        'product' => 'Your Product',
        'street' => 'PO Box 111',
        'location' => 'Your Town, 12345',
        'phone' => '555-555-5555',
    ];
 
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        parent::boot();
 
        //
    }
 
    /**
     * Customize general Spark options.
     *
     * @return void
     */
    protected function customizeSpark()
    {
        Spark::configure([
            'models' => [
                'teams' => Team::class,
            ]
        ]);
    }
 
    /**
     * Customize Spark's new user registration logic.
     *
     * @return void
     */
    protected function customizeRegistration()
    {
        // Spark::validateRegistrationsWith(function (Request $request) {
        //     return [
        //         'name' => 'required|max:255',
        //         'email' => 'required|email|unique:users',
        //         'password' => 'required|confirmed|min:6',
        //         'terms' => 'required|accepted',
        //     ];
        // });
 
        // Spark::createUsersWith(function (Request $request) {
        //     // Return New User Instance…
        // });
    }
 
    /**
     * Customize the roles that may be assigned to team members.
     *
     * @return void
     */
    protected function customizeRoles()
    {
        Spark::defaultRole('member');
 
        Spark::roles([
            'admin' => 'Administrator',
            'member' => 'Member',
        ]);
    }
 
    /**
     * Customize the tabs on the settings screen.
     *
     * @return void
     */
    protected function customizeSettingsTabs()
    {
        Spark::settingsTabs()->configure(function ($tabs) {
            return [
                $tabs->profile(),
                $tabs->teams(),
                $tabs->security(),
                $tabs->subscription(),
                // $tabs->make('Name', 'view', 'fa-icon'),
            ];
        });
 
        Spark::teamSettingsTabs()->configure(function ($tabs) {
            return [
                $tabs->owner(),
                $tabs->membership(),
                // $tabs->make('Name', 'view', 'fa-icon'),
            ];
        });
    }
 
    /**
     * Customize Spark's profile update logic.
     *
     * @return void
     */
    protected function customizeProfileUpdates()
    {
        // Spark::validateProfileUpdatesWith(function (Request $request) {
        //     return [
        //         'name' => 'required|max:255',
        //         'email' => 'required|email|unique:users,email,'.$request->user()->id,
        //     ];
        // });
 
        // Spark::updateProfilesWith(function (Request $request) {
        //     // Update $request->user()…
        // });
    }
 
    /**
     * Customize the subscription plans for the application.
     *
     * @return void
     */
    protected function customizeSubscriptionPlans()
    {
        // Spark::free()
        //         ->features([
        //             'Feature 1',
        //             'Feature 2',
        //             'Feature 3',
        //         ]);
 
        // Spark::plan('Basic', 'stripe-id')->price(10)
        //         ->trialDays(7)
        //         ->features([
        //             'Feature 1',
        //             'Feature 2',
        //             'Feature 3',
        //         ]);
    }
}

Давайте разберем его по частям:

$invoiceWith

Позволяет настроить счета, которые генерирует Spark. Добавьте сюда Вашу информацию, в итоге она окажется в PDF. Все.

protected $invoiceWith = [
        'vendor' => 'Your Company',
        'product' => 'Your Product',
        'street' => 'PO Box 111',
        'location' => 'Your Town, 12345',
        'phone' => '555-555-5555',
    ];

customizeRegistration()

Позволяет настраивать собственные критерии валидации полей и настраивать процесс создания пользователей.

protected function customizeRegistration()
    {
        // Spark::validateRegistrationsWith(function (Request $request) {
        //     return [
        //         'name' => 'required|max:255',
        //         'email' => 'required|email|unique:users',
        //         'password' => 'required|confirmed|min:6',
        //         'terms' => 'required|accepted',
        //     ];
        // });
 
        // Spark::createUsersWith(function (Request $request) {
        //     // Return New User Instance…
        // });
    }

Функция createUsersWith запускается из контролера регистрации следующим образом:

// Laravel\Spark\Repositories\UserRepository
    protected function createNewUser(Request $request, $withSubscription)
    {
        if (Spark::$createUsersWith) {
            return $this->callCustomUpdater(Spark::$createUsersWith, $request, [$withSubscription]);
        } else {
            return $this->createDefaultUser($request);
        }
    }

И, только для процесса настройки, вот что получится в случае использования данного метода, если Вы не переопределите его:

// Laravel\Spark\Repositories\UserRepository
    protected function createDefaultUser(Request $request)
    {
        $model = config('auth.model');
 
        return (new $model)->create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => bcrypt($request->password),
        ]);
    }

customizeRoles()

По умолчанию, в Spark-ке используется ролевая система для групповых настроек. Вы можете создать перечень ролей пользователей и настройки по умолчанию тут.

protected function customizeRoles()
    {
        Spark::defaultRole('member');
 
        Spark::roles([
            'admin' => 'Administrator',
            'member' => 'Member',
        ]);
    }
customizeSettingsTabs()

По умолчанию спарк создает account/admin панель с несколькими стандартными вкладками. Вы можете удалить их, переопределить или создать собственные.

Если Вы используете Teams, то Вы можете настроить и их вкладки:

protected function customizeSettingsTabs()
    {
        Spark::settingsTabs()->configure(function ($tabs) {
            return [
                $tabs->profile(),
                $tabs->teams(),
                $tabs->security(),
                $tabs->subscription(),
                // $tabs->make('Name', 'view', 'fa-icon'),
            ];
        });
 
        Spark::teamSettingsTabs()->configure(function ($tabs) {
            return [
                $tabs->owner(),
                $tabs->membership(),
                // $tabs->make('Name', 'view', 'fa-icon'),
            ];
        });
    }

customizeProfileUpdates()

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

  protected function customizeProfileUpdates()
    {
        // Spark::validateProfileUpdatesWith(function (Request $request) {
        //     return [
        //         'name' => 'required|max:255',
        //         'email' => 'required|email|unique:users,email,'.$request->user()->id,
        //     ];
        // });
 
        // Spark::updateProfilesWith(function (Request $request) {
        //     // Update $request->user()…
        // });
    }

Настройки по-умолчанию в ProfileController, которые будут перезаписаны в updateProfilesWith:

Auth::user()->fill($request->all())->save();

customizeSubscriptionPlans()

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

Этот фрагмент кода показывает все, кроме годового плана, который можно определить задав запрос к текущему определению плана ->yearly()

protected function customizeSubscriptionPlans()
    {
        // Spark::free()
        //         ->features([
        //             'Feature 1',
        //             'Feature 2',
        //             'Feature 3',
        //         ]);
 
        // Spark::plan('Basic', 'stripe-id')->price(10)
        //         ->trialDays(7)
        //         ->features([
        //             'Feature 1',
        //             'Feature 2',
        //             'Feature 3',
        //         ]);
    }

app/Team.php

Это новая модель для Teams, если Вы собираетесь их использовать.

<?php
 
namespace App;
 
use Laravel\Spark\Teams\Team as SparkTeam;
 
class Team extends SparkTeam
{
    //
}

Так можно расширить модель для настройки

<?php
 
namespace Laravel\Spark\Teams;
 

 
class Team extends Model
{
    protected $table = 'teams';
 
    protected $fillable = ['name'];
 
    /**
     * Get all of the users that belong to the team.
     */
    public function users() {}
 
    /**
     * Get the owner of the team.
     */
    public function owner() {}
 
    /**
     * Get all of the pending invitations for the team.
     */
    public function invitations() {}
 
    /**
     * Invite a user to the team by e-mail address.
     *
     * @param  string  $email
     * @return \Laravel\Spark\Teams\Invitation
     */
    public function inviteUserByEmail($email) {}
 
    /**
     * Remove a user from the team by their ID.
     *
     * @param  int  $userId
     * @return void
     */
    public function removeUserById($userId) {}
}

database/migrations/DATE_create_teams_table.php

Это up для переноса:

// Create Teams Table…
        Schema::create('teams', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('owner_id')->index();
            $table->string('name');
            $table->timestamps();
        });
 
        // Create User Teams Intermediate Table…
        Schema::create('user_teams', function (Blueprint $table) {
            $table->integer('team_id');
            $table->integer('user_id');
            $table->string('role', 25);
 
            $table->unique(['team_id', 'user_id']);
        });
 
        // Create Invitations Table…
        Schema::create('invitations', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('team_id')->index();
            $table->integer('user_id')->nullable()->index();
            $table->string('email');
            $table->string('token', 40)->unique();
            $table->timestamps();
        });

resources/assets/js/app.js

То, к чему должен обращаться JavaScript приложения, этот файл предварительно заполнен Spark JavaScript-ом.

/*
 |--------------------------------------------------------------------------
 | Laravel Spark - Creating Amazing Experiences.
 |--------------------------------------------------------------------------
 |
 | First, we will load all of the "core" dependencies for Spark which are
 | libraries such as Vue and jQuery. Then, we will load the components
 | which manage the Spark screens such as the user settings screens.
 |
 | Next, we will create the root Vue application for Spark. We'll only do
 | this if a "spark-app" ID exists on the page. Otherwise, we will not
 | attempt to create this Vue application so we can avoid conflicts.
 |
 */
 
require('laravel-spark/core/dependencies');
 
if ($('#spark-app').length > 0) {
    require('./spark/components')
 
    new Vue(require('laravel-spark'));
}

resources/assets/js/spark/components.js

Подгружает компоненты VueJS для отдельных страниц

/*
 |--------------------------------------------------------------------------
 | Spark Page Components
 |--------------------------------------------------------------------------
 |
 | These components control the user settings screens for Spark. You will
 | change these paths to your own custom components if you need to use
 | your own component to provide custom logic for your applications.
 |
 | In addition, the components which control the team settings and member
 | management are also included. Again, you may change these paths and
 | require your own custom-built components to manage these screens.
 */
 
require('laravel-spark/settings/dashboard/profile')
require('laravel-spark/settings/dashboard/security/password')
require('laravel-spark/settings/dashboard/security/two-factor')
 
require('laravel-spark/settings/team/owner')
require('laravel-spark/settings/team/membership/edit-team-member')

resources/views/home.blade.php

Домашняя страница по-умолчанию, которую мы видели ранее:

@extends('spark::layouts.app')
 
@section('content')
<!-- Main Content -->
<div class="container spark-screen">
    @if (Spark::usingTeams() && ! Auth::user()->hasTeams())
 
        <!-- Teams Are Enabled, But The User Doesn't Have One -->
        <div class="row">
            <div class="col-md-10 col-md-offset-1">
                <div class="panel panel-default">
                    <div class="panel-heading">You Need A Team!</div>
 
                    <div class="panel-body bg-warning">
                        It looks like you haven't created a team!
                        You can create one in your <a href="/settings?tab=teams">account settings</a>.
                    </div>
                </div>
            </div>
        </div>
 
    @else
 
        <!-- Teams Are Disabled Or User Is On Team -->
        <div class="row">
            <div class="col-md-10 col-md-offset-1">
                <div class="panel panel-default">
                    <div class="panel-heading">Dashboard</div>
 
                    <div class="panel-body">
                        Your Application's Dashboard.
                    </div>
                </div>
            </div>
        </div>
 
    @endif
</div>
@endsection

terms.md

Файл, который будет генерировать страницу «Terms of Service»:

This page is generated from the `terms.md` file in your project root.

Рассмотрим результат установки

Итак, давайте рассмотрим что у нас получилось. Сперва у нас имеется красивый лединг, который мы уже видели на скриншоте выше, но что мы имеем помимо него?

Сперва давайте взглянем на нашу страницу для входа. Обратите внимание, что у нас имеется хороший Bootstrap макет с фикированным футером, копирайтом и несколькими кнопками социальных сетей.

Spark Login

Помимо этого у нас есть страница для сброса пароля

Spark password reset

И страница для регистрации пользователя

ведение контекстной рекламы стоимость сохраняется.

Spark user register

Сроки сервиса

Spark Terms

Встроенная обработка ошибок

Spark errors

Итак, пришло время для регистрации. После ее завершения мы попадем в панель управления (/home), в которой есть выпадающее меню позволяющее нам выйти или изменить наши настройки.

Spark dashboard

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

User settings

Изменение пароля и двухфакторная авторизация:

Spark user security

Это то что мы получили «из коробки». Давайте рассмотрим еще несколько примеров работы.

Teams

Чтобы позволить пользователям присоединиться к команде, Вам необходимо использовать CanJoinTeams свойство, в Вашей модели пользователя. К счастью, Spark уже встроил этот класс в блок с импортом модели пользователя, потому это так же просто как добавление CanJoinTeams для использования списка свойств Вашей модели:

// app/User.php
class User 
{
    use Authorizable, Billable, CanJoinTeams, CanResetPassword, TwoFactorAuthenticatable;

Теперь, после посещения панели настроек пользователя, мы можем увидеть отличия:

Spark Add team

Давайте добавим группу:

Spark teams page

В этом контексте я предлагаю думать о команде как о аккаунте. В нашем приложении, где вы авторизировались, осуществили оплату, и увидели данные не по одному конкретному аккаунту, а по группе, у которой есть единый владелец. Именно этот владелец отвечает за оплату и выбор администраторов. Добавлять новых пользователей в группу или удалять из нее старых могут администраторы и владелец группы. Каждый пользователь в группе получает доступ к тем же данным.

Итак, давайте создадим группу и посмотрим что у нас выйдет:

Spark owner settings

Само собой мы пригласим еще кого-то в нашу команду.

На заметку: если вы получаете сообщение об ошибке проверки при первой попытке пригласить кого-либо в свою команду, проверьте ваши журналы, это скорее всего потому что по умолчанию настройки почты (в .env) отправляет в Mailtrap.io. Вы можете либо изменить это, либо настроить Mailtrap так, что ваша электронная почта заработает.

Вот то, что мы видим, пока пользователи не получили доступа:

Spark invited users

А вот что после того, как они перешли по ссылке в письме:

Spark invited registration

После того, как пользователь был подписан на группу у него появляется возможность покинуть данную группу:

Spark leave team

На заметку: по-умолчанию отсутствуют ограничения для создания команды. Пользователи могут создать столько групп, сколько им нравится.Чтобы ввести свои ограничения для использования групп можно воспользоваться validateNewTeamsWith().

Если вы хотите настроить валидацию создания новых команд, проверьте метод validateNewTeamsWith(). Покачто это не отображается по умолчанию в SparkServiceProvider, но вы можете пойти в customizeSpark() метод и добавить в него запрос:

protected function customizeSpark()
{
    Spark::configure();
 
    Spark::validateNewTeamsWith(function() {
        // Validate here…
    });
}

Также обратите внимание, что если у Вас есть активные группы, то Вам будет необходимо ввести название Вашей команды при входе в профиль:

Spark team on registration

После добавления свойства CanJoinTeams в Вашу модель пользователя вы получите в свое распоряжение несколько полезных методов, в том числе:

  • $user->hasTeams() показывает есть ли у пользователя какие-либо команды с которыми он связан
  • $user->current_team или $user->currentTeam() доступ к выбранной в текущий момент команде.
  • $user->ownsTeam($team) определяет, является ли пользователь владельцем группы.
  • $user->teamRole($team) получает роль для передачи членам группы.

Платежи и планы

До текущего момента, каждый пример, который был рассмотрен, демонстрировал работу приложения без настройки Stripe и планов. Давайте сейчас добавим секретный Stripe ключ и несколько планов в SparkServiceProvider.

Как и в случае с Cashier, Вам необходимо сперва добавить план в Stripe. Давайте добавим свободный план, а также его годовую и месячную версии. Итак, добавляем их в SparkServiceProvider.

// SparkServiceProvider
    protected function customizeSubscriptionPlans()
    {
        Spark::free()
                ->features([
                    'Feature 1',
                    'Feature 2',
                    'Feature 3',
                ]);
 
        Spark::plan('Basic Monthly', 'basic-monthly')->price(10)
                ->trialDays(7)
                ->features([
                    'Feature 1',
                    'Feature 2',
                    'Feature 3',
                ]);
 
        Spark::plan('Basic Yearly', 'basic-yearly')->price(120)
                ->trialDays(7)
                ->yearly()
                ->features([
                    'Feature 1',
                    'Feature 2',
                    'Feature 3',
                ]);
    }

Итак, внезапно мы получаем вкладку подписки:

Spark subskription

Проверим теперь регистрацию:

Spark переключение плана

Теперь при регистрации пользователя запрашивается его информация для оплаты:

Spark billing

Проверка плана при помощи кода:

Auth::user()->getStripePlan();

Coupons

Spark передает запросы купонов в Stripe, потому Вам не нужно ничего делать для их добавления, кроме добавления их в Stripe. Просто используется путь пользователя как параметр при входе человека на страницу регистрации

http://yourapp.com/register?coupon=yourCouponCodeHere

И без строки кода получаем применение купона со скидкой:

Spark coupon

Также имеется возможность временно добавить скидку по купону для всего сайта, добавив его в SparkServiceProvider (примерно как в customizeSpark() методе):

Spark::promotion('coupon-code-here');

Роли

Вы можете определять роли пользователей в SparkServiceProvider, как показано ниже:

// SparkServiceProvider
    protected function customizeRoles()
    {
        Spark::defaultRole('member');
 
        Spark::roles([
            'admin' => 'Administrator',
            'member' => 'Member',
        ]);
    }

Вы можете настроить роль по умолчанию, выберите параметры (у каждого должен быть ключ и значени), и после создания этих ролей вы можете проверить эти параметры и в других местах:

echo Auth::user()->teamRole(Auth::user()->current_team);

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

Views

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

php artisan vendor:publish --tag=spark-basics

выведет следующие представления:

resources/views/vendor/spark/emails/auth/password/email.blade.php
resources/views/vendor/spark/emails/billing/invoice.blade.php
resources/views/vendor/spark/emails/team/invitations/new.blade.php
resources/views/vendor/spark/emails/team/invitations/existing.blade.php
resources/views/vendor/spark/welcome.blade.php
resources/views/vendor/spark/nav/guest.blade.php
resources/views/vendor/spark/layouts/app.blade.php
resources/views/vendor/spark/common/footer.blade.php
resources/views/vendor/spark/nav/authenticated.blade.php
resources/views/vendor/spark/layouts/common/head.blade.php
resources/views/vendor/spark/settings/tabs/profile.blade.php
resources/views/vendor/spark/settings/tabs/security.blade.php
resources/views/vendor/spark/settings/team/tabs/owner.blade.php
resources/views/vendor/spark/auth/registration/simple/basics.blade.php
resources/views/vendor/spark/auth/registration/subscription/basics.blade.php
resources/views/vendor/spark/settings/team/tabs/membership/modals/edit-team-member.blade.php

А для полного экспорта:

php artisan vendor:publish --tag=spark-full

Это выведет все файлы из директории спарка. Их слишком много, чтобы показать тут. Все они лежат в resources/views/vendor/spark.

Прочее

Отключаем Authy

Если Вы хотите отключить двухфакторную аутентификацию пользователей, добавьте protected $twoFactorAuth = false; свойство в Ваш SparkServiceProvider

Дополнительно

Класс Spark-а имеет еще несколько доступных методов. Вот несколько на заметку: Spark::forcingPromotion() показывает используем мы или нет forcingPromotion на сайте в текущий момент. Spark::retrieveusersWith() позволяет настроить методы, которые использует Spark для получения текущего пользователя.

Подводя итоги

Ты сделал это! Это много, я знаю. Как только Spark будет доработан, выйдет новая статья, в которой не будет столь глубокого изучения его работы, как в этом посте, но будут лучше рассмотрены общие принципы его работы.

На самом деле под капотом спарка происходит гораздо больше процессов, здесь же были рассмотрены самые любопытные моменты. Как уже говорилось ранее, изменения в работе еще могут произойти.

Перевод статьи Matt Stauffer "Introducing Laravel Spark: A Deep Dive"