Laravel 5

Nice Artisan

Nouvelle version 0.4 pour Laravel 5.2 !

Artisan est un outil indispensable de Laravel. Il est simple et efficace. La seule chose qu’on pourrait peut-être lui reprocher c’est d’être une application « console ». Pour quelques unes de ses commandes c’est indispensable mais pour la plupart ça ne l’est pas. Alors je me suis dit que ça serait bien d’avoir une interface web pour Artisan.

Je me suis demandé quelle forme elle pourrait prendre et puis l’idée d’un package s’est rapidement imposée. Il m’a fallu ensuite plonger dans le code, me perdre un peu dans celui de symfony sur lequel Artisan repose et puis finalement j’ai abouti à quelque chose d’utilisable.

Ce n’est encore qu’une version de départ non finalisée mais toutes les commandes sont là, enfin presque (par exemple ça serait difficile de mettre up)…

Installation

Le projet est hébergé sur Github :

img46

Pour installer le package c’est facile, il suffit d’utiliser Composer :

<code>composer require bestmomo/nice-artisan</code>

Faire un petit composer dumpautoload.

Et ajouter ceci dans config/app.php :

Bestmomo\NiceArtisan\NiceArtisanServiceProvider::class,

La dernière étape consiste à publier le configuration :

php artisan vendor:publish

L’interface d’Artisan est alors accessible avec l’url …/niceartisan :

img55

Les commande personnalisées et celles ajoutées par des packages figurent dans la dernière option Customs.

Utilisation

Les commande sont classées par catégories. Par défaut ce sont les make qui apparaissent. Il suffit de cliquer sur la commande voulue pour ouvrir le panneau correspondant, par exemple pour créer un contrôleur :

img56

On entre le nom et on coche l’option si on veut un contrôleur vide :

img57

Il ne reste plus alors qu’à cliquer sur le bouton. Si tout s’est bien passé on reçoit un message de succès :

img58

Et on trouve bien le contrôleur créé à sa place :

img51

Avec ce code :

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;

class MyController extends Controller
{
    //
}

Je ne vais évidemment pas détailler toutes les commandes parce que le principe est toujours le même.

Je ne garantis pas qu’il n’y a pas de bug parce que les arguments et options se génèrent automatiquement et je n’ai pas encore tout essayé.

Configuration

Le fichier de configuration publié est ici :

img54

Les commandes sont classées par catégories :

    /*
    | Make commands
    */
    
    'make' => [
        'make:command',
        'make:console',
        'make:event',
        'make:job',
        'make:listener',
        'make:model',
        'make:policy',
        'make:provider',
        'make:request',
        'make:test',
        'make:migration',
        'make:seeder',
        'make:controller',
        'make:middleware',
    ],  

    /*
    | Migrate commands
    */

    'migrate' => [
        'migrate',
        'migrate:install',
        'migrate:rollback',
        'migrate:reset',
        'migrate:refresh',
        'migrate:status',
    ],

...

Le menu est créé à partir des catégories de la configuration et les commandes correspondantes figurent dans le panneau associé. Vous pouvez changer ce que vous voulez dans cette configuration tout en utilisant des noms de commande qui existent !

Sécurité

Ce package est plutôt destiné au développement local. Si vous voulez l’utiliser sur votre serveur de production il faut sécuriser l’accès aux commandes pour une évidente question de sécurité.

Le package teste si le middleware de route nice_artisan est présent, si c’est le cas il le prend en compte. Voilà comment c’est géré dans le constructeur du contrôleur :

public function __construct(Kernel $kernel)
{
    if($kernel->hasRouteMiddleware('nice_artisan')) {
        $this->middleware('nice_artisan');
    }
}

La méthode hasRouteMiddleware n’est pas une fonction standard du framework, j’ai dû la créer en étendant le Kernel.

Pour sécuriser l’interface il suffit donc de créer ce middleware, par exemple :

<?php 

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\RedirectResponse;

class NiceArtisan {

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $user = $request->user();

        if ($user && $user->isAdmin())
        {
            return $next($request);
        }
        return new RedirectResponse(url('/'));
    }

}

En partant du principe que la méthode isAdmin existe dans le modèle User et filtre les administrateurs. Il suffit ensuite d’enregistrer ce middleware dans le Kernel :

protected $routeMiddleware = [
    ....
    'nice_artisan' => \App\Http\Middleware\NiceArtisan::class,
];

Ainsi seules les personnes autorisées pourront jouer avec les commande d’Artisan, ce qui est plus sûr.

Print Friendly, PDF & Email

4 commentaires

  • Surtep

    Rebonjour,

    J’ai vu que le message d’ereuer parlait de la ligne 4 de routes.php

    J’ai donc changé les lignes

    get(‘/{option?}’, ‘\Bestmomo\NiceArtisan\Http\Controllers\NiceArtisanController@show’);
    post(‘item/{class}’, ‘\Bestmomo\NiceArtisan\Http\Controllers\NiceArtisanController@command’);

    en:

    Route::get(‘/{option?}’, ‘\Bestmomo\NiceArtisan\Http\Controllers\NiceArtisanController@show’);
    Route::post(‘item/{class}’, ‘\Bestmomo\NiceArtisan\Http\Controllers\NiceArtisanController@command’);

    et ça marche. J’ai pu faire composer dumpautoload.

    Mais par contre maintenant, je reçois le msg suivant:
    ErrorException in NiceArtisanController.php line 94:
    array_keys() expects parameter 1 to be array, null given

    Une idée? merci, j’ai envie d’essayer votre outil.

  • Surtep

    Bonjour,
    Félicitations, voilà un outil très intéressant.
    Envie de le tester, mais lorsque je lance le composer dumpautoload, je reçois en retour [Symfony\Component\Debug\Exception\FatalErrorException] Call to undefined function get()

    Et lorsque je me connecte à l’url monsite.dev/niceartisan, je reçois le même message.

    J’utilise Laravel 5.2.3

    Une idée?

Laisser un commentaire