A
A
Alexander Shapovalov2013-04-09 17:56:55
PHP
Alexander Shapovalov, 2013-04-09 17:56:55

Refactoring MVC model controller code?

Hello comrades! For a long time I tried to figure out how to get rid of the abundance of conditional operators in the code, they pretty much make my eyes run and reduce the readability of the code. Please tell me how to get rid of the abundance of conditional statements without creating new class methods, below is an example of the controller class method code:

//вывод запрашиваемой статьи из базы
  function getAction()
  {
    $fc=FrontController::get();
    $url=$fc->getParams();
    $view=new View();
    //возваращаем запрашиваемую статью из базы в виде ассоциативного массива
    $view->content=Articles::get()->getArticle((int)$url['id']);
    //выборка комментариев к статье
    $view->comments=Articles::get()->getComments((int)$url['id']);
    
    if($_SERVER['REQUEST_METHOD']=='POST' and isset($_POST['addcomment']))
    {
      if($_SESSION['captcha']==crypt($_POST['captcha'],'x)p_q1'))
      {
        if(!empty($_POST['comment_txt']) and !empty($_POST['name']))
        {
          if($_POST['article_id']==(int)$url['id'])  
          {
            $check=Articles::get()->checkComment($_POST['article_id'], $_POST['comment_txt'], $_POST['name']);
            if($check=='0')
            {
              $view->comments=Articles::get()->addComment($_POST['article_id'], $_POST['comment_txt'], $_POST['name']);						    
              ($view->comments) ? $view->comments='Ваш комментарий успешно добавлен!' : $view->comments='Ошибка при вставке комментария!';
            }
            else
              $view->comments='Данный комментарий уже добавлен!';
          }
          
          else 
            $view->comments='Вы пытаетесь вставить комментарий не в ту статью!';
        }
        else
          $view->comments='Поля не должны содержать пустых значений!';
      }
      else
      {
        $view->comments='Вы ввели символы с картинки некорректно!';
      }
      
    }
    else
    {
      //проверка на наличие пришедших данных
      ($view->comments==false) ? $view->comments='Комментариев к статье еще нет!': $view->comments;
    }
    
    (empty($view->content['title'])) ? $view->title='Такой статьи нет': $view->title=$view->content['title'];
    (empty($view->content['meta_key'])) ? $view->keywords='' : $view->keywords=$view->content['meta_key'];
    (empty($view->content['meta_description'])) ? $view->description='' : $view->description=$view->content['meta_description'];
    
    $result=$view->render('../views/article.php');
    $fc->setBody($result);
  }

Thanks in advance! don't cut off my hands please :)

Answer the question

In order to leave comments, you need to log in

4 answer(s)
A
anitspam, 2013-04-10
@shapovalov_org

Use model?

<?php
//вывод запрашиваемой статьи из базы
    function getAction()
    {
        $fc=FrontController::get();
        $url=$fc->getParams();
        $model = new ArticleModel();
        $model->setParams($fc->getParams());
        $model->validate();
        $view=new View();
        //возваращаем запрашиваемую статью из базы в виде ассоциативного массива
        $view->content=$model->getContent();
        //выборка комментариев к статье
        $view->comments=$model->getComments();
        
        $view->title=$model->getTitle();
...
        
        $result=$view->render('../views/article.php');
        $fc->setBody($result);
    }

PS. For some reason, the code highlighting did not turn on.

I
Ivan, 2013-04-09
@iSage

Use a form validator.

A
Alexey Zhurbitsky, 2013-04-09
@blo

As one of the options
<?php
function getAction()
{
    $fc   = FrontController::get();
    $url  = $fc->getParams();
    $view = new View();
    //возваращаем запрашиваемую статью из базы в виде ассоциативного массива
    $view->content = Articles::get()->getArticle((int)$url['id']);
    //выборка комментариев к статье
    $view->comments = Articles::get()->getComments((int)$url['id']);

    if ($_SERVER['REQUEST_METHOD'] != 'POST' || !isset($_POST['addcomment'])) {
        $view->comments == false ? $view->comments = 'Комментариев к статье еще нет!' : $view->comments;

        return _renderView($view);
    }

    if ($_SESSION['captcha'] != crypt($_POST['captcha'], 'x)p_q1')) {
        $view->comments = 'Вы ввели символы с картинки некорректно!';

        return _renderView($view);
    }

    if (empty($_POST['comment_txt']) || empty($_POST['name'])) {
        $view->comments = 'Поля не должны содержать пустых значений!';

        return _renderView($view);
    }

    if ($_POST['article_id'] != (int)$url['id']) {
        $view->comments = 'Вы пытаетесь вставить комментарий не в ту статью!';

        return _renderView($view);
    }

    $check = Articles::get()->checkComment($_POST['article_id'], $_POST['comment_txt'], $_POST['name']);

    if ($check != '0') {
        $view->comments = 'Данный комментарий уже добавлен!';

        return _renderView($view);
    }

    $view->comments = Articles::get()->addComment($_POST['article_id'], $_POST['comment_txt'], $_POST['name']);
    $view->comments ? $view->comments = 'Ваш комментарий успешно добавлен!' : $view->comments = 'Ошибка при вставке комментария!';

    return _renderView($view);
}

function _renderView($view)
{
    $fc = FrontController::get();

    (empty($view->content['title'])) ? $view->title = 'Такой статьи нет' : $view->title = $view->content['title'];
    (empty($view->content['meta_key'])) ? $view->keywords = '' : $view->keywords = $view->content['meta_key'];
    (empty($view->content['meta_description'])) ? $view->description = '' : $view->description = $view->content['meta_description'];

    $result = $view->render('../views/article.php');
    $fc->setBody($result);
}

though with an additional method for convenience.

M
markoffko, 2013-04-09
@markoffko

Why take the article id when adding a comment if the article is already selected and the id is there anyway?
Why does one action handle selecting an article and adding comments?
It is better to validate the data in a separate form class.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question