Bonjour,

Voila je rencontre un petit problème avec mon code.

J'ai une table Photos & Actualités. Sur ma page d'accueil j'affiche 3 Actualités & 3 Photos

Page d'accueil :

Route::get('/', 'Index@index');

J'ai ça dedans :

class Index extends Controller
{
    public function index()
    {
        $Photos = Photos::all()->take(3)->sortByDesc('created_at');
        $actualites = Actualite::all()->take(3)->sortByDesc('created_at');
        return view('/pages/index', ['Title' => "Accueil", 'Photos' => $Photos, 'actualites' => $actualites]);
    }
}

Mais j'ai aussi un controleur Photos & une controleur Actualites et je demande si ce n'est pas mieux d'avoir une méthode dans chacun de ces controleurs que je puisse appeler dans le controleur index ensuite ?

J'ai cherché un peu mais j'ai lu que c'était mal de faire ça, j'ai du mal à voir comment faire autrement, je débute avec Laravel c'est donc assez flou.

Merci d'avance ;)

PS : L’injection de dépendance peut-être une solution ? Je parle du Repository.

7 réponses


Salut,
Si j'ai bien compris, ton controller Photo a exactement la même méthode index que celle du "Index" ? Au passage au niveau du nommage c'est "mieux" d'avoir IndexController, PhotoController ect.
Si c'est ça, ton site n'est pas bien architecturé, trop d'informations redondantes...
Si tu ne parles que des parties pour récupérer les photos/actualites alors oui un Repository fait l'affaire.
Ou bien tu peux définir simplement un "Local Scope" : https://laravel.com/docs/5.4/eloquent#local-scopes

Salut,

Alors non je n'ai pas exactement la même méthode Index dans IndexController & dans PhotoController.
Je compte afficher seulement 3 photos dans IndexController@Index et dans PhotoController@index je compte afficher la totalité de mes photos, probablement avec un système de pagination.

Je débute avec les framework, et j'avais l'habitude de mettre par exemple dans le IndexController@index une méthode que j'aurai déclaré dans le model de Photo.
Par exemple une méthode nommer FindThreeFirst.
Et je vois là aussi que je pourrais peut-être encore optimiser le code en faisant une méthode commune à Actualités & à Photos comme la méthode est identique.

Il faudrait que ma méthode se situe dans la class model non ?

Après je m'embête peut-être pour rien si je ne compte pas ré-utiliser ce type de requête dans le reste de mon site ?

Merci pour ta réponse.

Salut,

Tu as une relation entre ta table Actualité et ta table Photo ? Si tel est le cas, tu fais une jointure et voilà.
Sinon, tu fais 2 queries pour récupérer les infos dont tu as besoin.
Un controller = une page en l'occurrence, tu n'as pas besoin d'appeler un autre controller. Si tu veux partager une récupération de data entre 2 controllers, utilises plutôt ton model Photo en y incluant un scope. Je te laisse regarder et chercher, il y a une formation sur le site.

Salut,

Non je n'ai pas de relations entre ma table Photo & Actualité.
Finalement j'ai juste besoin de savoir si je peux créer une méthode commune pour ce petit bout de code
class Index extends Controller
{
public function index()
{
$Photos = Photos::all()->take(3)->sortByDesc('created_at');
$actualites = Actualite::all()->take(3)->sortByDesc('created_at');
return view('/pages/index', ['Title' => "Accueil", 'Photos' => $Photos, 'actualites' => $actualites]);
}
}

        $Photos = Photos::all()->take(3)->sortByDesc('created_at');
        $actualites = Actualite::all()->take(3)->sortByDesc('created_at');

Par exemple un truc du genre :

public function FindThreeFirst($Model)
{
    return $Model::all()->take(3)->sortByDesc('created_at');
}

Pour faire ça après :

class IndexController extends Controller
{
    public function index()
    {
        return view('/pages/index', ['Title' => "Accueil", 'Photos' => FindThreeFirst('Photo'), 'actualites' => FindThreeFirst('Actualite")]);
    }
}

Et où je peux mettre cette fonction.

C'est ce qu'il y a de plus propre non ?

Salut,

Pourquoi tu devrais avoir 2x la même méthode je ne comprends pas.
Sinon, regarde du côté du View Composer ;)

Beh j'ai besoin de récuperer les trois premier de Actualité et les trois premier de Photo.
Et du coup je fais ça :

  $Photos = Photos::all()->take(3)->sortByDesc('created_at');
  $actualites = Actualite::all()->take(3)->sortByDesc('created_at');

Mais comme tu le vois c'est répétitif, ça serait probablement plus propre avec la méthode FindThreeFirst($Model)

J'ai mis à jour le post d'avant, si ça te permet de mieux comprendre mon problème.. ^^

Tu te prends la tête pour rien, c'est juste la bonne façon de faire ;)