От автора: как PHP разработчикам вам должно быть интересно работать с фреймворками. Фреймворки стараются облегчить процесс разработки путем упрощения распространенных практик в большинстве проектов таких, как пакеты, модули, плагины и даже компоненты. И в данной статье, мы ответим на вопрос, что такое Laravel пакеты?
Во время создания формы аутентификации или капчи у разработчика может появляться чувство, что он изобретает колесо. В таких случаях необходимо создать пакет, который упростит и ускорит процесс разработки веб-приложения.
Существует два типа пакетов; одни независимы от фреймворков (автономные), а другие разработаны под конкретные фреймворки. Этот урок мы полностью посвятим теме Laravel пакетов.
Перед созданием пакетов необходимо изучить менеджеры пакетов. PEAR хорошо известный PHP менеджер пакетов, используется редко, хотя и доступен для бесплатного скачивания. Почему? Он заставляет устанавливать все системные пакеты, а не только необходимые в проекте. Composer стал приемником PEAR.
Что такое пакеты Laravel?
Один из параметров масштабируемости фреймворка это то, как разработчики по новой используют полезные пакеты кода. Такой подход позволяет разработчикам разбить приложения на несколько пакетов более мелких приложений.
И действительно, с помощью пакетов можно с легкостью группировать связный код. Пакеты по своей сути очень схожи с компонентами. Важно отметить, что исходный код Laravel это «пакет», который Taylor Otwell называет DEFAULT_BUNDLE.
Одно из основных преимуществ Laravel пакетов в том, что с их помощью мы получаем доступ ко всем возможностям фреймворка веб-приложения, в том числе и маршрутизация, миграции, тесты, просмотры и множество других полезных функций. Другая важная особенность пакетов это принцип DRY (Не повторяйся). Создав пакет часто используемого кода, вы экономите ресурсы и повышаете производительность. Давайте познакомимся с некоторыми полезными пакетами Laravel. Пакеты, которые использую я:
Generators: Больше всего в CakePHP мне нравится Bake. Самое подходящее, что я смог найти в других фреймворках.
Ardent: Самопроверяющие смарт модели для Eloquent ORM.
IDE helper: Пакет исправляет проблему с автоподстановкой кода в PhpStorm путем создания dockblock файла, из которого IDE будет брать подстановки.
Sayakb: Отличная капча.
Behat: С помощью пакета можно протестировать веб-приложение по BDD методике.
Artdarek: Отличный OAuth враппер.
Mcamara: Простая локализация Laravel приложения.
Возможно, вы найдете требуемые пакеты в packalyst. Packalyst создает простой и социальный реестр пакетов для Laravel.
Как создать свой собственный пакеты Laravel
Создадим простой пакет аутентификации для Laravel 5.0. Первым делом, для нового пакета нам потребуется файл composer.json:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
{ "name": "alireza/myauth", "description": "How create your laravel 5 package", "license": "MIT", "authors": [ { "name": "Alireza Rahmani khalili", "email": "Alirezarahmani@live.com" } ], "minimum-stability": "dev", "require": { "laravel/framework": "~5.0" }, "autoload": { "psr-4": { "Alireza\\Authentication\\": "src/" } } } |
Класс Service Provider это просто файл, задающий основные настройки пакета. На данный момент Service Provider должен выглядить так (файл src/MyAuthServiceProvider.php):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
namespace Alireza\Authentication; use Illuminate\Support\ServiceProvider; class MyAuthServiceProvider extends ServiceProvider { /** * индикатор задержки загрузки провайдера. * * @var bool */ protected $defer = false; /** * Bootstrap события. * * @return void */ public function boot() { } /** * ригистрация service provider. * * @return void */ public function register() { } /** * получаем сервисы от провайдера. * * @return array */ public function provides() { return []; } } |
Добавьте service provider в файл config/app.php:
1 |
'Alireza\Authentication\MyAuthServiceProvider ::class', |
Теперь Laravel знает о пакете. Вы можете задаться вопросом, почему я не добавит алиасы в app.php. Лично я добавляю алиасы в метод регистрации класса service provider, а не в конфиг файл Laravel. Об этом я расскажу чуть позже. Теперь в файле src/MyAuth.php создайте простой PHP класс MyAuth.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
namespace Alireza\Authentication; use Config, Request, Session, Hash; use App\User; Class MyAuth { public $redirect_login = '/users/home'; public $redirect_logout = '/users/logout'; public $login = '/user/login'; protected $data; public function __construct() { if (Request::isMethod('post')) //Get post inputs $this->data = array('username' => Input::get('username'), 'password' => Input::get('password')); } public function login($data = false) { $this->data = $data; if ($this->data && !is_array($this->data)) return redirect($this->login)->with('message', 'sorry no array to log-in manually')->send(); if ($this->data && !Session::has('user')) { $result = User::Where(['email' => $this->data['username'] ]) ->first(); if ($result && Hash::check($this->data['password'], $result->password)) { Session::put('user', $result); return Redirect($this->redirect_login)->with('message', 'Welcome log-in succeeded ')->send(); } Session::flush(); return redirect($this->login)->with('message', 'Login Failed, wrong username or password')->send(); } } public function logout() { Session::flush(); return redirect($this->login)->with('message', 'logout succeeded')->send(); } } |
Класс аутентификации должен связываться с IoC Container через провайдер пакета. Но перед этим создайте класс Facade. Это поможет использовать методы класса, не создавая новый экземпляр, а также можно будет воспользоваться всеми преимуществами, описанными выше. Подобно тому, как класс MyAuth создал новый каталог Facades в директории Facades, создайте новый PHP класс с названием src/MyAuthFacade.php:
1 2 3 4 5 6 7 8 9 |
namespace Alireza\Authentication; use Illuminate\Support\Facades\Facade; class MyAuthFacade extends Facade { protected static function getFacadeAccessor() { return 'MyAuth'; } } |
После всего осталось только загрузить пакет. У меня это так:
1 2 3 4 5 6 7 8 9 10 11 12 |
public function register() { $this->app['MyAuth'] = $this->app->share(function($app) { return new MyAuth; }); $this->app->booting(function() { $loader = \Illuminate\Foundation\AliasLoader::getInstance(); $loader->alias('MyAuth', 'Alireza\Authentication\MyAuthFacade'); }); } |
Как видно, я связал класс MyAuth с IoC Container. Теперь стало легко использовать класс MyAuth:
1 |
MyAuth::login(['username'=>'Alirezarahmani@live.com','password'=>'test']); |
Должно сгенерироваться сообщение «Welcome log-in succeeded». Если хотите, то можно зарегистрировать свой пакет в Packagist. Пакет MyAuth был зарегистрирован и теперь может быть с легкостью добавлен в Laravel командой:
1 |
composer require "alireza/myauth". |
Заключение
Если вы ищите пример популярного Laravel пакета, можно посмотреть на . Это был быстрый обзор, как создать пакет для Laravel 5. Как вы заметили, ничего сложного в создании пакетов нет. Данный инструмент крайне важен для упрощения и ускорения процесса разработки.
Автор: Alireza Rahmani Khalili
Источник: //code.tutsplus.com/
Редакция: Команда webformyself.