shapovalov_org
@shapovalov_org
Инженер-программист

Рефакторинг кода контроллера MVC модели?

Здравствуйте товарищи! Я долго пытался понять как избавится от обилия условных операторов в коде, они изрядно заставляют глаза побегать и снижают читаемость кода. Подскажите пожалуйста, как без создания новых методов класса избавится от обилия условных операторов, ниже пример кода метода класса контроллера:

//вывод запрашиваемой статьи из базы
	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);
	}



Заранее благодарен! не отрубайте мне руки пожалуйста :)
  • Вопрос задан
  • 4109 просмотров
Решения вопроса 1
@anitspam
Использовать модель?
<?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);
    }

ПС. Почему-то не включилась подсветка кода.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
iSage
@iSage
Использовать валидатор форм.
Ответ написан
Комментировать
blo
@blo
инженер-программист
Как один из вариантов
<?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);
}

правда с дополнительным методом для удобства.
Ответ написан
markoffko
@markoffko
Зачем принимать id статьи при добавлении комментария если статья уже выбирается и id есть в любом случае?
Почему один экшен обрабатывает выбор статьи и добавление комментариев?
Валидировать данные лучше в отдельном классе формы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы