Question organisation de code (MVC, SOLID...) SVP.

a marqué ce sujet comme résolu.

J'ai une question "organisation de code" SVP. Ce qui fait le mieux organisé d'après vous (MVC, SOLID…).

Avec un CMS que je suis en train de développer avec Laravel 5, j'ai un système d'édition d'articles, et un système d'édition de catégories (relation Many to Many).

Les éditions d'articles se font avec le Controller "ArticleController".

Les éditions de catégories se font avec le Controller "CategoryController".

Et avec mon CMS, on peut aussi ajouter des catégories depuis le formulaire d'édition d'articles en Ajax. J'ai donc créé une méthode spécifique à ceci.

Vous pensez que c'est quoi le mieux SVP ? d'où mettre cette méthode spécifique ?

-Dans le Controller "ArticleController" ? (car on est à la base dans une édition d'article).

-Dans le Controller "CategoryController" ? (car malgré qu'on est à la base dans une édition d'article, c'est une catégorie qu'on ajoute).

-Ou dans le Model "Category", et appeller cette méthode spécifique via une méthode intermédiaire que je metterai dans le Controller "ArticleController" ? (Ce que je trouve le + logique, mais ça fait une function en + que les 2 premières solutions).

Voici ma méthode spécifique que je ne sais pas trop où mettre :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
/**
 * AVEC AJAX - Ajouter une catégorie depuis editions d'articles
 *
 * @param Request $request
 */
public function addCategoryWithAjax(Request $request)
{
    if ($request->ajax()) {
        $name = preg_replace('/\s+/', ' ', $request->get('new_category_post'));  // si plusieurs espaces cosécutifs -> 1 espace à la place

        if (mb_strlen($name) > 1 && mb_strlen($name) < 31) {
            $verif = Categoryarticle::where('name', $name)->first();
            if ($verif) {
                echo 'Erreur : Le nom de cette catégorie existe déjà, et doit être unique.';
            } else {
                $slug = Str::slug($name);

                $verif2 = Categoryarticle::where('slug', $slug)->first();
                if ($verif2) {
                    echo 'Erreur : Ce Slug est déjà pris par une autre catégorie.';
                } else {
                    $category_article = new Categoryarticle();
                    $category_article->name = $name;
                    $category_article->slug = $slug;
                    $category_article->save();

                    $id = $category_article->id;

                    echo '<input type="checkbox" name="category[]" checked value="'.$id.'" id="cat-'.$id.'"><label for="cat-'.$id.'">'.$name.'</label><br>';
                }
            }
        } else {
            echo 'Erreur : Le nom de la catégorie doit être compris entre 2 et 30 caractères.';
        }
    }
}
+0 -0

Pourquoi faire une distinction entre l'ajout d'une catégorie en ajax et l'ajout d'une catégorie via un formulaire? Il n'y a aucune raison pour que le serveur fasse la distinction. Ce qui implique que l'ajout d'une méthode spécifique est une mauvaise idée et qu'il faut donc utiliser le contrôleur d'article.

Après, mon point de vue se base sur le fait que lorsque l'on utilise MVC, il est souvent bien plus simple d'avoir la majorité de la vue et du contrôleur côté client (en javascript) et le modèle côté serveur avec une fine couche de vue/contrôleur pour faire les vérifications. Ça permet d'avoir une interface très simple et donc facile à tester/vérifier.

Autre point pas particulièrement spécifique à ta question : tu as beaucoup de conditions imbriqués, ce qui te force à indenter beaucoup et ce qui n'aide pas forcément à la lecture. Je te conseil d'écrire ta fonction plus de cette manière :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
/**
 * AVEC AJAX - Ajouter une catégorie depuis editions d'articles
 *
 * @param Request $request
 */
public function addCategoryWithAjax(Request $request) {
  if (!$request->ajax()) {
    return;
  }
  $name = preg_replace('/\s+/', ' ', $request->get('new_category_post'));  // si plusieurs espaces cosécutifs -> 1 espace à la place
  if (mb_strlen($name) < 2 && mb_strlen($name) > 30) {
    echo 'Erreur : Le nom de la catégorie doit être compris entre 2 et 30 caractères.';
    return;
  }
  $verif = Categoryarticle::where('name', $name)->first();
  if ($verif) {
    echo 'Erreur : Le nom de cette catégorie existe déjà, et doit être unique.';
    return;
  }
  $slug = Str::slug($name);

  $verif2 = Categoryarticle::where('slug', $slug)->first();
  if ($verif2) {
    echo 'Erreur : Ce Slug est déjà pris par une autre catégorie.';
    return;
  }
  $category_article = new Categoryarticle();
  $category_article->name = $name;
  $category_article->slug = $slug;
  $category_article->save();

  $id = $category_article->id;

  echo '<input type="checkbox" name="category[]" checked value="'.$id.'" id="cat-'.$id.'"><label for="cat-'.$id.'">'.$name.'</label><br>';
}

Merci pour ta réponse.

Pourquoi faire une distinction entre l'ajout d'une catégorie en ajax et l'ajout d'une catégorie via un formulaire?

Car le traitement ne se fait pas de la meme manière. Dans le formulaire d'ajout d'édition de catégorie, on peu choisir un 'name' et un 'slug' pour la catégorie.

Alors que dans le formulaire d'édition d'article, on peu choisir que un 'name'.

PS: Ma méthode qui traite l'ajout de catégorie vie l'édition des catégories :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php

/**
 * Conservez une catégorie nouvellement créé dans le stockage.
 *
 * @param $request
 * @return $this|\Illuminate\Http\RedirectResponse
 */
public function store($request)
{
    // Verif données envoyées en POST
    $validator = $this->rulesValidate($request);
    if ($validator->fails()) {
        return redirect()->back()->withErrors($validator->errors())->withInput();
    }

    // --- Requete INSERT ---
    $categoryArticle = new Categoryarticle();
    $categoryArticle->name = $request->input('name');
    $categoryArticle->slug = $request->input('slug');
    $categoryArticle->created_at = Carbon::now();
    $categoryArticle->updated_at = Carbon::now();
    $categoryArticle->save();
    // --- /Requete INSERT ---

    return redirect()->route('admin_article_category_index')->with('success', 'La catégorie a bien été ajoutée.');
}
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte