Bonsoir !
Je suis en train d’apprendre Laravel en ce moment, un framework qui me plaît beaucoup.
J’ai terminé un petit projet, Tweety (Github), qui est en fait le projet développé dans les tutos Laracasts. Pour ce projet, j’ai décidé de faire les améliorations proposées, histoire de bien m’entraîner.
J’ai pu faire tout ce que je voulais. En revanche, je ne suis pas pleinement satisfait de deux de mes controlleurs. Je trouve le code beaucoup trop long, et le controlleur fait trop de chose à la fois selon moi.
J’aimerais donc avoir votre aide pour savoir ce que je peux améliorer, et comment je peux l’améliorer.
Voici les deux codes en question :
TweetController
public function store()
{
$validatedRequest = request()->validate([
'image' => ['file', 'image'],
'body' => ['required', 'max:200'],
]);
if (empty(request('image'))) {
unset($validatedRequest['image']);
} else {
$validatedRequest['image'] = request('image')->store('tweets');
}
$tweet = auth()->user()->tweets()->create($validatedRequest);
// Mentions (un message qui contient un @chris pour mentionner l'utilisateur chris)
$mentions = [];
preg_match_all('/\@[\w._]+/', $tweet->body, $mentions);
foreach ($mentions as $mention) {
if (!count($mention)) {
continue;
}
$mention = $mention[0]; // Parce que $mention est un array (je sais pas trop pourquoi)
$username = substr($mention, 1); // On enlève le @ au début
$userMention = User::where('username', $username)->first();
if ($userMention) {
$userMention->notify(new MentionNotification(auth()->user(), $tweet));
}
}
return back()->with('success', 'Tweet published!');
}
ProfileController
public function update(User $user)
{
// Validate Request
$validatedRequest = request()->validate([
'banner' => ['file', 'image'],
'avatar' => ['file', 'image'],
'username' => ['required', 'string', 'max:50', Rule::unique('users')->ignore($user), 'alpha_dash'],
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', Rule::unique('users')->ignore($user)],
'password' => ['nullable', 'string', 'min:8', 'confirmed'],
]);
// Banner
if (empty(request('banner'))) {
unset($validatedRequest['banner']);
} else {
$validatedRequest['banner'] = request('banner')->store('banners');
}
// Avatar
if (empty(request('avatar'))) {
unset($validatedRequest['avatar']);
} else {
$validatedRequest['avatar'] = request('avatar')->store('avatars');
}
// Password
if (empty(request('password'))) {
unset($validatedRequest['password']);
} else {
$validatedRequest['password'] = Hash::make($validatedRequest['password']);
}
// Update User
$user->update($validatedRequest);
// Redirect Back
return redirect()->route('profiles.edit', $user);
}
Déjà, parlons du premier code. Le fait de traiter les mentions dans la même méthode que l’ajout d’un Tweet, je trouve pas ça super. Sauf que je ne sais pas trop où mettre ce code ni comment l’organiser.
Ensuite, mon code des mentions et vraiment pas propre. En réalité, ça fait un petit moment que j’ai pas codé en PHP, et je le ressent (voici donc une chose que je dois travailler).
Le deuxième code, lui, est beaucoup mieux. Mais je ne sais pas si c’est une bonne façon de faire des unset
pour ne pas remplir ces champs (si ils sont vide par exemple) dans le User. Peut être existe-t-il une autre méthode plus propre ?
Si vous avez des conseils, je suis preneur !
Merci !