() translation by (you can also view the original English article)
En tant que développeur PHP, vous êtes intéressé de travailler avec des frameworks. Les frameworks tendent à rendre le procéder de développement plus facile en simplifiant les besoins les plus courant de la majorité des projets web grâce au packages, modules, plug-ins et même des composants (CakePHP).
Peut-être que pendant le développement, vous avez l'impression de réinventer sans cesse la roue, par exemple en créent un système d'authentification ou un Captcha. Dans ce cas, vous devez créer un package qui simplifiera et rendra votre développement plus rapide et facile.
Il y a deux types de packages: certains sont indépendant du framework (autonome) et d'autres sont spécifiques à un framework. Cet article va couvrir exclusivement les packages pour Laravel.
Avant de créer un package vous devez en savoir plus sur le outils de gestion des packages (package manager). PEAR est un package manager bien connu en PHP, mais qui est rarement utilisé. Pourquoi? Il force l'installation des packages au niveau du système et non pas uniquement pour votre projet. Composer est devenu le successeur de PEAR.
Que sont les packages de Laravel?
L'un des paramètres pour faire évoluer la puissance d'un framework est la façon dont les développeurs redistribuent des packages utiles. Ceci permet aux développeurs de construire des applications grâce à plusieurs packages plus petits.
En effet, les packages offrent une bonne façon de grouper du code apparenté. Les packages sont très similaires aux "Composants". Il est important de noter que le code source de Laravel est un "package", que Taylor Otwell appel le DEFAULT_BUNDLE
.
Un grand avantage des packages de Laravel est qu'ils ont accès à toutes les fonctionnalités que le framework offre à l'application, comme les routes, les migrations, les tests, les vues et nombres d'autres. Un autre avantage important du package est l'approche DRY (Don't Repeat Yourself - Ne vous répétez pas). En créant un package pour du code que vous utilisez souvent, vous gagnez du temps et améliorez les performances de l'application.
Maintenant, laissez moi vous présenter quelques packages de Laravel utiles. Les packages que j'ai utilisé sont entre autres:
- Generators: une des choses que j'aimais dans CakePHP était sa fonctionnalité de génération de code Bake. C'est ce que j'ai trouvé de plus proche dans n'importe quel autre framework.
- Ardent: modèle intelligent auto-validé pour l'ORM Eloquent.
- IDE helper: ce package tente de corrigé le problème d'auto-complétion dans PhpStorm en créant fichier d'aide dockblock duquel l'IDE peut trouver la bonne définition.
- Sayakb: pour générer un captcha.
- Behat: une solution pour tester votre application en utilisant les principes BDD.
- Artdarek: un bon wrapper pour OAuth.
- Mcamara: traduction i18n facile pour votre application Laravel.
Vous pouvez trouver les packages dont vous avez besoin sur packalyst. Packalyst est un simple registre des packages Laravel, avec un côté social.
Comment construire votre propre package Laravel
Créons un simple package d'authentification pour Laravel 5.0. Pour cela, nous avons besoin d'un fichier composer.json
pour notre nouveau package:
1 |
{ |
2 |
"name": "alireza/myauth", |
3 |
"description": "How create your laravel 5 package", |
4 |
"license": "MIT", |
5 |
"authors": [ |
6 |
{ |
7 |
"name": "Alireza Rahmani khalili", |
8 |
"email": "Alirezarahmani@live.com" |
9 |
} |
10 |
], |
11 |
"minimum-stability": "dev", |
12 |
"require": { |
13 |
"laravel/framework": "~5.0" |
14 |
}, |
15 |
"autoload": { |
16 |
"psr-4": { |
17 |
"Alireza\\Authentication\\": "src/" |
18 |
} |
19 |
} |
20 |
} |
La classe Service Provider est simplement le fichier qui met tout en place pour le package. Voici à quoi doit ressembler le Service Provider à ce moment, dans src/MyAuthServiceProvider.php
:
1 |
namespace Alireza\Authentication; |
2 |
use Illuminate\Support\ServiceProvider; |
3 |
|
4 |
|
5 |
class MyAuthServiceProvider extends ServiceProvider { |
6 |
|
7 |
/**
|
8 |
* Indicates if loading of the provider is deferred.
|
9 |
*
|
10 |
* @var bool
|
11 |
*/
|
12 |
protected $defer = false; |
13 |
|
14 |
/**
|
15 |
* Bootstrap the application events.
|
16 |
*
|
17 |
* @return void
|
18 |
*/
|
19 |
public function boot() |
20 |
{
|
21 |
}
|
22 |
/**
|
23 |
* Register the service provider.
|
24 |
*
|
25 |
* @return void
|
26 |
*/
|
27 |
public function register() |
28 |
{
|
29 |
|
30 |
}
|
31 |
/**
|
32 |
* Get the services provided by the provider.
|
33 |
*
|
34 |
* @return array
|
35 |
*/
|
36 |
public function provides() |
37 |
{
|
38 |
return []; |
39 |
}
|
40 |
|
41 |
}
|
Ajoutez le service provider à config/app.php
:
1 |
'Alireza\Authentication\MyAuthServiceProvider ::class', |
Maintenant Laravel a connaissance du package. Vous pourriez vous demander à propos des "alias" et pourquoi je ne l'ajoute pas à mon app.php
. Personnellement, j'ajoute l'alias à la méthode register du service provider plutôt que de l'ajouter manuellement dans le fichier de configuration de Laravel. J'y reviendrai plus tard. Maintenant créez un simple classe PHP MyAuth
dans src/MyAuth.php
:
1 |
namespace Alireza\Authentication; |
2 |
|
3 |
use Config, Request, Session, Hash; |
4 |
use App\User; |
5 |
|
6 |
Class MyAuth |
7 |
{
|
8 |
public $redirect_login = '/users/home'; |
9 |
public $redirect_logout = '/users/logout'; |
10 |
public $login = '/user/login'; |
11 |
protected $data; |
12 |
|
13 |
public function __construct() |
14 |
{
|
15 |
if (Request::isMethod('post')) //Get post inputs |
16 |
$this->data = array('username' => Input::get('username'), 'password' => Input::get('password')); |
17 |
}
|
18 |
|
19 |
public function login($data = false) |
20 |
{
|
21 |
$this->data = $data; |
22 |
|
23 |
if ($this->data && !is_array($this->data)) |
24 |
return redirect($this->login)->with('message', 'sorry no array to log-in manually')->send(); |
25 |
|
26 |
if ($this->data && !Session::has('user')) { |
27 |
$result = User::Where(['email' => $this->data['username'] |
28 |
])
|
29 |
->first(); |
30 |
|
31 |
if ($result && Hash::check($this->data['password'], $result->password)) { |
32 |
Session::put('user', $result); |
33 |
return Redirect($this->redirect_login)->with('message', 'Welcome log-in succeeded ')->send(); |
34 |
}
|
35 |
Session::flush(); |
36 |
return redirect($this->login)->with('message', 'Login Failed, wrong username or password')->send(); |
37 |
}
|
38 |
}
|
39 |
|
40 |
public function logout() |
41 |
{
|
42 |
Session::flush(); |
43 |
return redirect($this->login)->with('message', 'logout succeeded')->send(); |
44 |
}
|
45 |
|
46 |
}
|
47 |
La classe d'authentification doit être attachée avec l'IoC Container de Laravel au service provider du package. Avant ça, créez une classe de Facade qui nous permettra d'utiliser les méthodes de la classe dans avoir besoin d'une instance, ainsi que d'autres bénéfice dont on a parler plus tôt. Comme la classe MyAuth a créer le nouveau répertoire Facades
dans le dossier Facades, créez une nouvelle classe PHP et appelez la src/MyAuthFacade.php
:
1 |
namespace Alireza\Authentication; |
2 |
use Illuminate\Support\Facades\Facade; |
3 |
class MyAuthFacade extends Facade |
4 |
{
|
5 |
protected static function getFacadeAccessor() |
6 |
{
|
7 |
return 'MyAuth'; |
8 |
}
|
9 |
}
|
Après cela, la seule chose qui reste est d'initialiser le package. Le mien ressemble à ceci:
1 |
public function register() |
2 |
{
|
3 |
$this->app['MyAuth'] = $this->app->share(function($app) |
4 |
{
|
5 |
return new MyAuth; |
6 |
});
|
7 |
$this->app->booting(function() |
8 |
{
|
9 |
$loader = \Illuminate\Foundation\AliasLoader::getInstance(); |
10 |
$loader->alias('MyAuth', 'Alireza\Authentication\MyAuthFacade'); |
11 |
});
|
12 |
}
|
Comme vous pouvez le voir, j'ai lié la classe MyAuth au IoC Container. Maintenant il est facile d'utiliser la classe MyAuth:
1 |
MyAuth::login(['username'=>'Alirezarahmani@live.com','password'=>'test']); |
Cela doit générer le message, Welcome log-in succeeded.
Si vous le souhaitez, vous pouvez enregistrer votre package sur Packagist. Le package MyAuth est maintenant enregistrer et peut aisément être inclus à Laravel avec la commande Composer: composer require "alireza/myauth"
.
Conclusion
Si vous cherchez un exemple d'un package populaire et mature de Laravel, vous pouvez regarder TerranetAdmin pour Laravel.
Ceci était une courte introduction à comment créer un package pour Laravel 5. Comme vous l'avez vu, créer un package est facile, et peut être un outil important pour simplifier et accelérer le développement.