Gravatar használata Laravel keretrendszerrel

Kisebb szünet után folytatódik a cikkek és tutorialok rendszeres publikálása. Az első téma a Gravatar szolgáltatás implementálása Laravel környezetben, amelyen keresztül bemutatom az egyedi konfiguráció és Facade osztály készítésének lépéseit is.


Először készítsünk egy új Laravel projektet Composer csomagkezelő segítségével:

composer create-project laravel/laravel --prefer-dist gravatar

A létrejött alkalmazáson belül az app mappában hozzunk létre egy tetszőleges névteret, aminek a Webtuts nevet választottam. Ezután állítsuk be az automatikus osztálybetöltést a composer.json fájlban PSR-4 használatával.

Tipp! A névtér tetszőleges helyre is rakható.

// composer.json
{
    // ...
    "autoload": {
        // ...
        "psr-4": {
            "Webtuts\\": "app/Webtuts"
        }
    },
    // ...
}

Majd generáltassuk újra az automatikus osztálybetöltéshez szükséges fájlokat a következő paranccsal:

composer dump-autoload

Konfiguráció létrehozása

Folytassuk a konfigurációs fájl létrehozásával, amelyben teljesüljenek a következő feltételek:

  • Megadható legyen a Gravatar mérete, besorolása, alapértelmezett képe és a HTTPS protokoll használata
  • Kezeljen több Gravatar profilt a különböző méretű megjelenítéshez

Ehhez hozzuk létre az app/config/gravatar.php konfigurációs fájlt az alábbi tartalommal:

<?php

return array(

    // Alapértelmezett Gravatar Profil
    'default' => 'site',

    // Gravatar Profilok
    'profiles' => array(

        'site' => array(
            'size'    => 80,
            'rating'  => 'g',
            'default' => null,
            'secure'  => false,
        ),

    ),

);

A konfigurációs fájl értékeit ezután a következő módon érhetjük el:

// Lekérés
Config::get('gravatar.default');
Config::get('gravatar.profiles');

// Futásidejű felülírás
Config::set('gravatar.default', 'admin');

Gravatar osztály implementálása

Hozzuk létre az app/Webtuts/Gravatar mappát, majd ide készítsük el a Gravatar.php fájlt. Ezt követően másoljuk bele az alábbi kódrészletet a névtér helyes megadásával:

<?php namespace Webtuts\Gravatar;

class Gravatar {

    // ...

}

Következő lépésként szükségünk van a korábban létrehozott konfigurációra, amelyet elérhetnénk a Config Facade osztállyal is, de a konvenció szerint ezeket csak a Controller osztályokban érdemes használni. Ezért az IoC konténer segítségével konstruktoron keresztül adjuk át a beregisztrált példányt.

Tipp! A különböző Facade osztályokhoz tartozó referenciát ezen a linken érhetjük el.

A referencia alapján használjuk a Config Facade osztályhoz tartozó Illuminate\Config\Repository osztályt:

// Gravatar.php
// ...
use Illuminate\Config\Repository;
// ...

Hozzuk létre a helyi példányt tároló adattagot, és adjuk át a konstruktoron keresztül:

// Gravatar.php
//...
protected $config;

public function __construct(Repository $config)
{
    $this->config = $config;
}
// ...

Az alapértelmezett konfigurációs profil lekéréséhez hozzunk létre egy getter metódust:

// Gravatar.php
// ...
public function getDefaultGravatar()
{
    return $this->config->get('gravatar.default');
}
// ...

Ezután készítsünk egy protected láthatóságú metódust az adott profilhoz tartozó konfiguráció lekéréséhez:

// Gravatar.php
// ...
protected function getConfig($name = null)
{
    $name = $name ?: $this->getDefaultGravatar();

    $profiles = $this->config->get('gravatar.profiles');

    if ( ! $config = array_get($profiles, $name))
    {
        throw new \InvalidArgumentException(sprintf('Gravatar [%s] nincs beállítva.', $name));
    }

    return $config;
}
// ...

Tipp! Az array_get egy Laravel specifikus segédfüggvény a pontokkal elválasztott kulcs értelmezéséhez.

Végül készítsük el a Gravatar URL összeállításáért felelős metódust, amelynek második paraméterként opcionálisan átadható a konfigurációs profil neve:

// Gravatar.php
// ...
public function getUrl($email, $name = null)
{
    $config = $this->getConfig($name);

    $hash = md5(mb_strtolower($email));

    $map = array(
        's' => $config['size'],
        'r' => $config['rating'],
        'd' => $config['default'],
    );

    return ($config['secure'] ? 'https://secure' : 'http://www') . '.gravatar.com/avatar/' . $hash . '?' . http_build_query(array_filter($map));
}
// ...

Tipp! Az array_filter meghívása a tömbön eltávolítja az üres elemeket.

IoC Service Provider létrehozása

Saját szolgáltatásainkat használat előtt be kell regisztrálnunk az IoC konténerbe, ezért készítsünk egy app/Webtuts/Providers nevű mappát, és hozzuk létre az IoCServiceProvider.php nevű fájlt. Ezután a következő kódrészlettel létrehozzuk az IoCServiceProvider osztályt, származtatva az Illuminate\Support\ServiceProvider ősosztályból:

<?php namespace Webtuts\Providers;

use Illuminate\Support\ServiceProvider;

class IoCServiceProvider extends ServiceProvider {

    // ...

}

Az ősosztály két metódusát kell felülírni, az egyik beregisztrálja a szükséges szolgáltatásokat, a másik visszaadja a beregisztrált szolgáltatások nevét.

// IoCServiceProvider.php
// ...
public function register()
{
    $this->app->singleton('gravatar', 'Webtuts\Gravatar\Gravatar');
}

public function provides()
{
    return array('gravatar');
}
// ...

Tipp! A konténer automatikusan kielégíti a Gravatar osztály függőségét.

Az app/config/app.php konfigurációs állomány providers kulcsához vegyük fel az elkészült osztályt:

// app.php
return array(
    // ...
    'providers' => array(
        // ...
        'Webtuts\Providers\IoCServiceProvider',
    ),
    // ...
);

Ezután már elérhető az IoC konténeren keresztül a Gravatar szolgáltatásunk:

echo app('gravatar')->getUrl('info@webtuts.hu');

// http://www.gravatar.com/avatar/e3c1b45ea0d65048c976418e70a926cf?s=80&r=g

Facade osztály létrehozása

A könnyebb kezelhetőség érdekében hozzunk létre egy Facade osztályt. Ehhez először készítsünk egy app/Webtuts/Facades mappát, majd ezen belül egy Gravatar.php nevű fájlt. A tartalma legyen a következő:

<?php namespace Webtuts\Facades;

use Illuminate\Support\Facades\Facade;

class Gravatar extends Facade {

    protected static function getFacadeAccessor() { return 'gravatar'; }

}

Tipp! Az implementált getFacadeAccessor metódusnak a szolgáltatás nevével kell visszatérnie.

Az app/config/app.php konfigurációs állomány aliases kulcsához regisztráljuk be az elkészült osztályt:

// app.php
return array(
    // ...
    'aliases' => array(
        // ...
        'Gravatar' => 'Webtuts\Facades\Gravatar',
    ),
    // ...
);

Nincs más dolgunk, mint használatba venni, és szükség esetén további konfigurációs profilokkal bővíteni.

echo Gravatar::getUrl('info@webtuts.hu');
echo Gravatar::getUrl('info@webtuts.hu', '<profil_neve>');

// http://www.gravatar.com/avatar/e3c1b45ea0d65048c976418e70a926cf?s=80&r=g