Laravel 5

Les bonnes pratiquent

  • Avatar de AlexisGatuingt
    Membre depuis :
    06/01/2019
    Messages :
    31

    Bonjour,

    Voilà ça fait quelque temps que je développe avec Laravel et a chaque fois je repense l'architecture de mes classes et view . Je sais pas si il y'a une bonne ou mauvaise manière de faire . Voici un exemple sur un projet sur lequel je travail. Tout revient aux mêmes , mais la méthode est différente .

    Le projet ( je simplifie ) : un intranet CRM avec gestion client, facture devis ect on se concentre sur les classes Facture, Config et User .
    J'ai 3 manière de pensé pour gérer mes controllers et communiquer entre eux :
    1) Je créer 1 controllers pour chacuns avec requête sql pour récupérer les variables donc FactureController.php :

    use App\User;
    use App\Config;
    use App\Facture;

    public function factures() {
    return Facture::all();
    }
    public function clients() {
    return User::where('type','=','client')->get();
    }

    public function client($id) {
    return User::where('type', '=', 'client')->where('id', '=', $id)->first();
    }

    public function config() {
    return Config::where('id', '=', 1)->first();
    }
    // CRUD
    // VIEW

    et j'invoque mes variables comme ça avec le CRUD et les view pour les factures dans ce controller

    2) Même chose sauf que j'effectue une instance des autres classes plutôt que des requetes


    use App\Facture;
    App\Http\Controllers\Admin\User;

    public function user() {
    return new User();
    }

    public function factures() {
    return Facture::all();
    }

    // CRUD
    // VIEW

    et mon UserController return les variables de la tables users qui lui même instancie la classe facturecontroller ect

    3) Je créer mes 3 controllers pour récuperer les variables et faire le CRUD et ajax ect ect ; et un 4eme controller que j'appelle IndexController ; qui se charge uniquement de récupérer les données et renvoyer les vues

    En faites ma question se tourne aussi comme ça : Qu'elle différence entre instancier un controller et un model sur laravel ? Est ce que je gagne en performance si j'instancie la classe qui a déjà effectué la requete ou si je refais cette même requête ?

    Merci à tous bonne soirée

  • Avatar de AlexisGatuingt
    Membre depuis :
    06/01/2019
    Messages :
    31

    Oh la grosse faute dans le titre je suis désolé ahah ; si un admin veut bien corriger merci

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2565

    Bonjour,

    Je ne peux pas changer le titre mais je le trouve très amusant, il faut pas le changer !

    Pour la question il n'y a pas vraiment de règle si ce n'est de s'y retrouver dans son code. Au niveau des performances les différences sont insignifiantes. Personnellement je pars des principes suivants :

    • le contrôleur doit savoir le moins de choses possible, c'est juste un chef d'orechestre qui impose le rythme mais ne s'occupe pas des détails
    • pour les données je passe presque toujours par un (ou des) repository qui s'occupe(nt) de toute cette intendance
    • s'il y a des traitements spécifiques je crée des helpers
  • Avatar de AlexisGatuingt
    Membre depuis :
    06/01/2019
    Messages :
    31

    Hello merci pour ta réponse, mais je me disais , quand c'est un code qui est destiné à être vendu, ou être redévelopper par d'autre par la suite , il y a forcément un standard ou des bonnes pratiquent à avoir quand on utilise un framework

    Par exemple mon controller qui gère les facture se présente comme ça (pour l'instant) :

    <?php

    namespace App\Http\Controllers\Admin;

    use Illuminate\Http\Request;
    use App\Http\Controllers\Controller;
    use App\Quote;
    use App\User;
    use App\Config;
    use Illuminate\Support\Str;
    use Illuminate\Support\Facades\DB;

    class InvoiceController extends Controller
    {

    public function __construct()
    {
    $this->middleware('admin');
    }

    public function quotes() {
    return Quote::All();
    }

    public function config() {
    return Config::where('id','=', 1)->first();
    }

    public function clients() {
    return User::where('type','=','client')->get();
    }
    //View
    public function index() {
    return view('admin.invoice.first')
    ->with('quotes', $this->quotes())
    ->with('clients', $this->clients())
    ->with('config', $this->config());
    }
    //CRUD
    /*
    @param Request (quote, reference)
    @var $idquote : get id from url
    @var $q : get quote from id
    @var $jq : json format
    @var $count : number of ref
    */
    public function newWithQuote(Request $request) {
    $idquote = $request->input('quote');
    $q = Quote::where('id', '=', $idquote)->first();
    if($q):
    $jq = json_decode($q->jref);
    $count = count($jq)-1;
    $ji = [];
    $ji[0] = $jq[0];
    if($this->config()->autoref === 0):
    $parameters=$request->validate([
    'reference' => 'max:191|required|unique:factures',
    ]);
    $ji[0]->ref = Str::slug($parameters['reference'], '-');
    else:

    $ji[0]->ref = 'Facture'.date('dmY-His', time());
    endif;

    for($i = 0; $i<$count; $i++):
    $ji[$i+1] = $jq[$i+1];
    endfor;
    DB::table('factures')->insert([
    'user_id' => $q->user->id,
    'reference' => $ji[0]->ref,
    'created_at' => new \Datetime(),
    'price' => $q->price,
    'jref' => json_encode($ji),
    'title' => $ji[0]->title,

    ]);
    else:
    return redirect()->route('firstInvoice')->with('warning', 'Aucun devis trouvé');
    endif;
    }
    }

    Je pense que y'a des choses que je peux revoir, notament les variables , je me vois souvent répéter les mêmes choses pour récupérer les données dans la table

    La fonction newWithQuote crée une facture a partir d'une devis existant, et récupére toute les données en json du devis
    Et enfin ce petit code if($this->config()->autoref === 0): c'est pour créer les réferences automatiquement depuis une table de configuration

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2565

    Salut,

    Quelques remarques....

    Tu peux rendre ton code plus élégant en remplaçant :

    Config::where('id','=', 1)->first();

    Par

    Config::find(1);

    De la même manière :

    User::where('type','=','client')->get();

    Peut s'écrire :

    User::whereType('client')->get();

    Ca me fait bizarre de voir une méthode de contrôleur qui renvoie une collection :

    public function quotes() {
    return Quote::All();
    }

    Autant utiliser directement là où tu en as besoin. Peut-être dans ce cas précis un view composer serait judicieux.
    Pour les configs et les clients tu pourrais utiliser un scope dans les modèles. Par exemple :

    public function scopeClients($query)
    {
    return $query->whereType( 'client');
    }

    Du coup à l'utilisation :

    ->with('clients', User::clients())

    Pourquoi tu n'utilises pas Eloquent pour la table factures ?

    Je n'utilise jamais la syntaxe alternative pour les conditions avec les deux points, mais c'est vrai que c'est plus lisible.

    La fonction newWithQuote ne renvoie rien en cas de réussite, ce n'est pas courant...

    Comme Laravel embarque automatiquement Carbon pour la date autant utiliser Carbon::now()

    Il y aurait d'autres choses à dire, mais tout ça est très personnel finalement.

  • Avatar de AlexisGatuingt
    Membre depuis :
    06/01/2019
    Messages :
    31

    Re,

    Merci beaucoup je vais regarder ça
    Oui c'est pas finit j'ai pas fais la redirection avec le retour statut

    Pourquoi tu n'utilises pas Eloquent pour la table factures ?

    Oui en effet je peux, ça dépend si je tombe sur la partie query builder ou eloquent dans la doc aha

    Je n'utilise jamais la syntaxe alternative pour les conditions avec les deux points, mais c'est vrai que c'est plus lisible.

    Je l'utilise partout avec for foreach while ; avec une bonne indentation je suis vraiment fan, on dirait du python

    Comme Laravel embarque automatiquement Carbon pour la date autant utiliser Carbon::now()
    Il y aurait d'autres choses à dire, mais tout ça est très personnel finalement.

    Après c'est tout autant de chose que je sais pas ou j'ai pas pris le temps de voir encore justement et je veux avoir l'avis et l'expérience des autres qui on acquis les subtilités du framework . ça fais a peu prés 1an que je travail le framework et je me suis fais un peu tout seul j'ai pas forcément de retour sur mon travail

  • Avatar de F.M.
    Membre depuis :
    10/07/2017
    Messages :
    109

    Les bonnes pratiquent... la programmation ?!

    Sinon question style tu devrais plutot jeter un oeil sur les PSR :

    https://www.php-fig.org/psr/psr-1/
    https://www.php-fig.org/psr/psr-2/

Vous ne pouvez pas répondre à ce sujet.