Как украсить структуру кода? (Laravel) - PullRequest
2 голосов
/ 16 мая 2019

Я начал кодировать новый сайт, что-то вроде электронной коммерции, но это просто обзорный сайт, на котором пользователь комментирует бренды, продукты и сообщения брендов.Итак, у меня есть полиморфная таблица для комментариев.

Когда кто-то пытается добавить комментарий, сначала мне нужно определить тип комментария, например, Бренд, Продукт или Сообщение.В этом случае я использую переключатель, чтобы узнать, что пользователь хочет сделать.Я думаю, что был бы лучший способ сделать это с чистой структурой кода, поэтому я здесь.

Я просто хочу знать, если это правильный способ добавить комментарий, как показано ниже.

public function addComment(Request $request, $type, $id, $tab = null)
{
    // Error messages
    $messages = [
        'add_comment.required' => '...',
        'add_comment.min' => '...',
        'add_comment.max' => '...',
        'rating.numeric' => '...',
        'rating.min' => '...',
        'rating.max' => '...'
    ];

    // Validate the form data
    $validator = Validator::make($request->all(), [
            'add_comment' => 'required|min:5|max:2000',
            'rating' => 'numeric|min:0|max:5'
        ], $messages);

    if($validator->fails())
    {
        return back()->withErrors($validator);  
    } else {
        $comment = new Comment;
        $comment->body = $request->get('add_comment');
        $comment->user()->associate(Auth::user()->id);
        $comment->star_value = $request->get('rating');

        switch ($type) {
            case 'Post':
                $post = Post::findOrFail($id);
                $comment->star_value = NULL;
                $post->comments()->save($comment);
                break;
            case 'Product':
                $product = Product::findOrFail($id);
                $product->comments()->save($comment);

                //Update rating of product
                $average = $product->comments()->getAvg();
                $product->rating = $average;
                $product->save();
                break;
            default:
                $this->postCommentToBrand($comment, $id, $tab);
                break;
        }                     

        return redirect()->back();
    }
}

$ request = inputs

$ type = commentable_type (Бренд, Продукт, Почта)

$ id = id $ type

$ tab = Это на самом деле для бренда,Потому что у бренда есть поддержка клиентов и техническая поддержка.Нужно определить его и с помощью регистра переключателя.

1 Ответ

2 голосов
/ 16 мая 2019

Разделите его на отдельные маршруты - по одному для каждого комментируемого типа, например:

Route::post('add-comment/post/{post}', 'CommentsController@addPostComment');
Route::post('add-comment/product/{product}', 'CommentsController@addProductComment');
Route::post('add-comment/brand/{brand}/{tab}', 'CommentsController@addBrandComment');

Это позаботится о вашем switch - теперь маршрутизатор Laravel сразу увидит, к какому типу комментируемого объекта вы добавляете комментарий. Маршрутизатор также будет использовать неявное связывание модели и найдет эти модели по указанному вами идентификатору (и вернет 404, если указанная строка не существует в вашей БД), поэтому мы избавимся от этих надоедливых вызовов findOrFail как хорошо.

Теперь в вашем контроллере вы должны использовать формы запросов для проверки (вместо создания Validator экземпляра вручную). Наконец, мы можем сгруппировать логику создания нового экземпляра Comment (который является общим для всех комментируемых типов) в отдельный метод. Тогда ваш контроллер будет выглядеть так:

protected function getNewCommentFromRequest(Request $request)
{
    $comment = new Comment;
    $comment->body = $request->get('add_comment');
    $comment->user()->associate(Auth::user()->id);
    $comment->star_value = $request->get('rating');

    return $comment;
}

public function addPostComment(AddCommentRequest $request, Post $post)
{
    $comment = $this->getNewCommentFromRequest($request);
    $comment->star_value = NULL;
    $post->comments()->save($comment);

    return redirect()->back();
}

...

Методы addProductComment и addBrandComment не будут сильно отличаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...