Що таке Laravel пакети?

27

Від автора: як 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:

{
«name»: «alireza/myauth»,
«description»: «How create your laravel 5 package»,
«license»: «MIT»,
«authors»: [
{
«name»: «Alireza Rahmani khalili»,
«email»: «[email protected]»
}
],
«minimum-stability»: «dev»,
«require»: {
«laravel/framework»: «~5.0»
},
«autoload»: {
«psr-4»: {
«Alireza\\Authentication\\»: «src/»
}
}
}

Клас Service Provider це просто файл, що задає основні параметри пакета. На даний момент Service Provider повинен виглядати так (файл src/MyAuthServiceProvider.php):

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:

‘Alireza\Authentication\MyAuthServiceProvider ::class’,

Тепер Laravel знає про пакет. Ви можете задатися питанням, чому я не додасть аліаси в app.php. Особисто я додаю аліаси в метод реєстрації класу service provider, а не в конфіг файл Laravel. Про це я розповім трохи пізніше. Тепер у файлі src/MyAuth.php створіть простий PHP клас MyAuth.

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:

namespace Alireza\Authentication;
use Illuminate\Support\Facades\Facade;
class MyAuthFacade extends Facade
{
protected static function getFacadeAccessor()
{
return ‘MyAuth’;
}
}

Після всього залишилося тільки завантажити пакет. У мене це так:

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:

MyAuth::login([‘username’=>’[email protected]’,’password’=>’test’]);

Має згенеруватися повідомлення «Welcome log-in succeeded». Якщо хочете, то можна зареєструвати свій пакет в Packagist. Пакет MyAuth був зареєстрований і тепер може бути з легкістю доданий в Laravel командою:

composer require «alireza/myauth».

Висновок

Якщо ви шукайте приклад популярного Laravel пакета, можна подивитися на TerranetAdmin. Це був швидкий огляд, як створити пакет для Laravel 5. Як ви помітили, нічого складного в створенні пакетів немає. Даний інструмент вкрай важливий для спрощення і прискорення процесу розробки.