Статьи

9 горячих советов, чтобы улучшить свой опыт искры

Некоторое время назад я писал о продукте, который хотел создать , чтобы обеспечить легкое удаленное резервное копирование для сайтов Pagekit . Я работал над этим (периодически) с тех пор, и наткнулся на несколько интересных советов.

Я решил использовать Laravel Spark в качестве основы для продукта, и я подумал, что будет полезно поделиться советом. Если вы только запускаете свое приложение Spark или находитесь в режиме обслуживания, я думаю, что некоторые из этих советов будут вам полезны!

Экран-заставка сайта Laravel Spark

1. Вам не нужно хранить все базовые файлы

Вы можете быть обеспокоены удалением слишком большого количества базовых файлов из стандартной установки Spark. Когда я только начинал, я думал, что крайне важно не менять контроллеры аутентификации (в app/Http/Controllers/Auth ), опасаясь, что это нарушит систему регистрации и входа в систему.

Оказывается, эти файлы не используются Spark. Фактически, если вы добавите к ним маршруты и попытаетесь зарегистрироваться / войти в систему, вы, вероятно, просто столкнетесь с проблемами. Эти контроллеры проверки подлинности по умолчанию совместно используют одну и ту же защиту проверки подлинности (драйвер сеанса), поэтому вход через один из них сделает вас аутентифицированными через другой.

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

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

2. Используйте простые репозитории

Spark включает в себя несколько простых репозиториев. Это как статические списки конфигурации (для стран и других в основном статических данных), но они могут быть загружены через контейнер IoC. Они выглядят так:

 namespace Laravel\Spark\Repositories\Geography; use Laravel\Spark\Contracts\Repositories\ Geography\CountryRepository as Contract; class CountryRepository implements Contract { /** * {@inheritdoc} */ public function all() { return [ 'AF' => 'Afghanistan', 'AX' => 'Åland Islands', 'AL' => 'Albania', // ...snip 'YE' => 'Yemen', 'ZM' => 'Zambia', 'ZW' => 'Zimbabwe', ]; } } 

Это от vendor/bin/laravel/spark/src/Repositories/Geography/CountryRepository.php

Мы можем видеть случаи использования этого в некоторых видах регистрации:

 <select class="form-control" v-model="registerForm.country" lazy> @foreach (app(Laravel\Spark\Repositories\ Geography\CountryRepository::class)->all() as $key => $country) <option value="{{ $key }}">{{ $country }}</option> @endforeach </select> 

Это из resources/views/vendor/spark/auth/register-address.blade.php

Я настоятельно рекомендую вам использовать эти репозитории для данных по стране и штату. Я также рекомендую использовать этот стиль репозитория для своих собственных списков:

 namespace App\Repositories; use DateTimeZone; class TimezoneRepository { /** * @return array */ public function get() { $identifiers = DateTimeZone::listIdentifiers(DateTimeZone::ALL); return array_combine( $identifiers, array_map(function ($identifier) { return str_replace("_", " ", $identifier); }, $identifiers) ); } } 

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

Кроме того, вы можете использовать псевдонимы в поставщике сервисов приложений:

 namespace App\Providers; use App\Repositories\CountryRepository; use App\Repositories\TimezoneRepository; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { /** * @inheritdoc */ public function register() { $this->app->singleton("timezones", function () { return new TimezoneRepository(); }); } } 

Это из app/Providers/AppServiceProvider.php

Это делает их супер простыми в использовании в представлениях:

 <select class="form-control" v-model="registerForm.timezone" lazy> @foreach (app("timezones")->get() as $key => $timezone) <option value="{{ $key }}">{{ $timezone }}</option> @endforeach </select> 

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

3. Не используйте каретные (^) зависимости Laravel

Laravel развивается быстро. Это здорово для того, чтобы заинтересовать разработчиков, но у него есть недостатки в обслуживании. Сделайте себе одолжение и замените любые номера версий зависимостей ^xx номерами версий ~xxx .

Spark 1.x построен на Laravel 5.2.x Если вы не будете осторожны (читай: используя ^5.2 ), вызов composer update Laravel до версии 5.3.x , что внесет множество критических изменений.

Laravel не претендует на то, чтобы следовать Semver, поэтому нет никаких оснований полагать, что незначительные ошибки версии будут безопасны. Тем не менее, Тейлор вполне разумен, когда дело доходит до сложности, связанной с обновлением минорных версий. Если внесенные критические изменения потребуют слишком много времени для смягчения, они будут отложены до следующей основной версии.

Spark 2.x основан на Laravel 5.3.x , поэтому начните с него, если можете. Тогда у вас будет доступ ко всем блестящим новым функциям в 5.3.x с самого начала. Запустить новое приложение Spark гораздо проще, чем обновить существующее. Поверь мне в этом …

Еще раз, вам лучше сделать полную резервную копию перед запуском composer update . Вы создаете продукт. Вы заплатили деньги за использование Spark. Резервные копии теперь вещь.

4. Документы — ваш друг

В Spark заложено много предполагаемых знаний. В большинстве связанных представлений используются (или, по крайней мере, ссылки) компоненты VueJS. Spark зависит от Кассы и от Stripe или Braintree .

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

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

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

5. Не стесняйтесь изучать VueJS

Я знаю, что только что упомянул VueJS, но правда в том, что вам не нужно изучать его, прежде чем пытаться Spark. Прежде чем я провел много времени в Spark, я думал, что сделал. Оказывается, документы расскажут вам все, что вам нужно знать, а связанные виды заполнят все пробелы примерами.

Если ваша цель состоит в том, чтобы сделать что-то с интерфейсом swish-bang, неплохо было бы изучить VueJS. Если все, что вам нужно (в отношении JabbaScript), это добавить поле здесь или там, просто следуйте примерам в коде.

Ничто не мешает вам сделать весь код для вашего приложения простым HTML и PHP.

6. Хост в Forge

С уважением (и без всякого поощрения упоминать их) я не могу рекомендовать Кузницу достаточно высоко. Это разумное и доступное управление сервером, ориентированное на приложения Laravel.

Я принимал другие (не Spark) вещи там, но это сделало мой опыт Spark богаче. Мне особенно понравились инструменты управления демоном .env , планировщиком и .env . Каждое приложение на основе подписки требует запланированных заданий. Каждое умеренно сложное приложение получает выгоду от работы в очереди.

7. Переупорядочить промежуточное ПО

Одна из лучших функций (по моему личному мнению) Laravel — привязка модели маршрута . Вот когда вы определяете маршруты следующим образом:

 use App\Http\Controllers\CustomersController; Route::get("customers/:customer", [ "uses" => CustomersController::class, "as" => "customers.edit", ]); 

… а затем определите это действие как:

 /** * @param Customer $customer * * @return Response */ public function edit(Customer $customer) { return view("customers.edit", [ "customer" => $customer, "groups" => Groups::all(), ]); } 

Если вы запустите этот код (как действие контроллера), $customer будет автоматически извлечен из базы данных. Это мощная функция! Когда я запустил это приложение Spark 1.x , я старался применять глобальные области действия ко всем моделям, специфичным для команды:

 namespace App\Scopes; use App\User; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Scope; class TeamScope implements Scope { /** * @param Builder $builder * @param Model $model * * @return Builder */ public function apply(Builder $builder, Model $model) { /** @var User $user */ $user = auth()->user(); return $builder->where( "team_id", "=", $user->currentTeam()->id ); } } 

Это из app/Scopes/TeamScope.php

Я применил это в моделях boot() :

 namespace App; use App\Scopes\TeamScope; use Illuminate\Database\Eloquent\Model; class Customer extends Model { /** * @inheritdoc */ protected static function boot() { parent::boot(); static::addGlobalScope(new TeamScope()); } } 

Ожидается, что все клиенты будут отфильтрованы в соответствии с текущими командами вошедших в систему пользователей. Проблема в том, что это не работает в 5.2.x , так как сеанс не запускается, когда происходят привязки модели маршрута. Чтобы обойти это, мне пришлось переместить промежуточное программное обеспечение сеанса из web группы в глобальную группу:

 /** * The application's global HTTP middleware stack. * * These middleware are run during every request to your application. * * @var array */ protected $middleware = [ \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, \Illuminate\Session\Middleware\StartSession::class ]; /** * The application's route middleware groups. * * @var array */ protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, // \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, ], 'api' => [ 'throttle:60,1', ], ]; 

Это из app/Http/Kernel.php

Обратите внимание, как я закомментировал \Illuminate\Session\Middleware\StartSession::class в $middlewareGroups["web"] и добавил его в $middleware ? Выполнение этого запускает сеанс до Model::boot() , что означает, что auth()->user() (или Auth::user() ) вернет зарегистрированного пользователя.

8. Сделай себе помощников

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

 /** @var User $user */ $user = auth()->user(); /** @var Team $team */ $team = user()->currentTeam(); 

… прежде чем я создал эти помощники:

 use App\User; use App\Team; if (!function_exists("user")) { /** * @return App\User */ function user() { return auth()->user(); } } if (!function_exists("team")) { /** * @return App\Team */ function team() { return user()->team(); } } 

Они не сумасшедшие и не сложные. Они даже не много кода для ввода. Но я рекомендую вам включить их с самого начала, потому что вы будете часто печатать (и подсказывать) альтернативы.

9. Используйте Ngrok для тестирования веб-хуков

Весьма распространено создавать продукт вокруг одной или нескольких сторонних услуг. Подумайте об этом — вы уже зависите от Stripe и / или Braintree. Как насчет того, когда вы хотите опубликовать в Twitter или отправить SMS ?

Когда это происходит, вам часто нужно указывать URL-адрес веб-хука. Это маршруты в вашем приложении, которые отвечают (или собирают данные) на запросы от сторонней службы. Обычно это отчет о доставке из почтовой службы транзакции или данные подтверждения от этого провайдера доставки.

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

Это проще, чем вы думаете. Установите Ngrok с помощью Homebrew :

 brew install ngrok 

… Затем подайте ваше приложение Laravel (предположительно с сервером разработки PHP):

 php artisan serve 

… И в другой вкладке запустите Ngrok:

 ngrok http 8000 

Вы увидите общедоступный URL (например, http://7d54aeb8.ngrok.io -> localhost:8000 ). Когда вы попробуете этот URL в своем браузере, вы сможете просмотреть свое приложение!

Более подробная информация о Ngrok доступна здесь .

Вывод

Если вы решите попробовать Spark, я могу порекомендовать это. Это дало моему продукту преимущество, которого не было бы иначе. Надеемся, что эти советы сэкономят вам еще больше времени. Вы нашли какие-нибудь советы по разработке Spark? Дайте знать вашим коллегам-разработчикам в комментариях!