PHP скрипт. Simple URL checker — контроллер

Владимир | | CodeIgniter, PHP, Web разработка.

Simple URL checker - контроллер
Сегодня я продолжу рассказ о разработке web приложения, выполняющего проверку URL.

Но, прежде всего, кратко напомню, что уже сделано на данный момент. Мы определились со структурой приложения и базы данных, установили и настроили фреймворк, а также написали модели для работы с БД.

Примечание. Ссылки на все предыдущие статьи находятся здесь.

Теперь самое время заняться контроллером.

Т.к. приложение довольно простое нам вполне хватит одного контроллера, назовем его main. Кстати, при настройке CodeIgniter в файле routes.php мы указали, что этот контроллер должен загружаться по-умолчанию.

Со структурой приложения и его функциями мы уже определились, переходим к написанию методов контроллера.

class Main extends Controller {

	var $errorMes;

	function Main() {
		parent::Controller();

		$this->errorMes = null;
		$this->output->enable_profiler(TRUE);
	}

	/**
	 * Отображает главную страницу с таблицей результатов
	 */
	function index() {
		$this->load->model('resultmodel');
		$this->load->helper('form');

		$resData = $this->resultmodel->getGeneralData();
		$pageData['results'] = $resData;

		$pageData['title'] = "Simple URL checker - Главная";
		$pageData['error'] = $this->errorMes;
		$this->load->view('header', $pageData);
		$this->load->view('mainpage');
		$this->load->view('footer');
	}

	/**
	 * Отображает страницу с таблицей результатов проверок заданного URL
	 *
	 * @param $urlId - значение поля urlId в базе данных (таблица results)
	 */
	function urldetails($urlId) {
		if (!isset($urlId) || !is_numeric($urlId) || $urlId <= 0) {
			redirect('main/index');
		}
		$this->load->model('resultmodel');
		$this->load->helper('form');

		$urlInfo = $this->resultmodel->getUrlData($urlId);

		$pageData['title'] = "Simple URL checker - подробно";
		$pageData['urlInfo'] = $urlInfo;
		$pageData['urlId'] = $urlId;

$this->load->view('header', $pageData); $this->load->view('urldetails'); $this->load->view('footer'); } /** * Добавляет новый URL * * @param newurl (передается в массиве $_POST) */ function addurl() { $this->load->helper('form'); $this->load->model('urlmodel'); $url = $this->input->post('newurl'); if ($url !== FALSE && $this->_isValidURL($url)) { $id = $this->urlmodel->addURL($url); } else { $this->errorMes = "Некорректный URL"; } $this->index(); } /** * Отправляет запрос (и сохраняет его результаты) по указанным URL * * @param $urlId - значение поля urlId в базе данных (таблица results), * если не задан или равен 0 - нужно пропинговать все URL из базы */ function ping($urlId = 0) { //этот метод мы рассмотрим немного позже } /** * Проверяет формат URL * * @param строка, содержащая URL * @return TRUE - если URL имеет правильный формат, FALSE - если нет */ function _isValidURL($url) { $strRegex = "/^[a-zA-Z0-9]+:\/\/[^ ]+$/"; return preg_match($strRegex, $url); } /** * Удаляет результат проверки URL * * @param $urlId - значение поля urlId в базе данных (таблица results) * @param $id - значение поля id в базе данных (таблица results) */ function removeresult($urlId, $id) { $this->load->model('resultmodel'); $this->resultmodel->removeResult($id); $this->urldetails($urlId); } /** * Удаляет URL из базы данных * * @param $urlId - значение поля id в базе данных (таблица urls) */ function removeurl($urlId) { if (isset($urlId) && is_numeric($urlId) && $urlId > 0) { $this->load->model('urlmodel'); $this->urlmodel->deleteURL($urlId); } $this->index(); } }

Чтобы в контроллере было проще ориентироваться, приведу диаграмму, которую мы составили во второй части этого цикла.

Взаимодействие посетителя с приложением

Конструктор (строки 5-10). Тут сбрасываем сообщение об ошибке и включаем профайлер (в релизе его, естественно, нужно будет отключить).

Метод index (строки 15-27). Формирует главную страницу сайта. На этой странице должны быть размещены таблица с усредненными результатами проверок, форма добавления нового URL и кнопка, запускающая проверку всех URL.

Поэтому в начале метода мы загрузили модель (resultmodel) и хелпер form (содержит методы для создания форм). После этого с помощью модели получаем данные (строка 19), формируем массив с данными для представления ($pageData) и загружаем представления.

Примечание. Сами представления мы рассмотрим немного позже, но думаю, уже по названию понятно, что header формирует заголовок страницы, mainpage – основное содержимое главной страницы, а footer – хвостовик.

Метод urldetails (строки 34-50). Формирует страницу с подробными данными о проверках выбранного URL. Работает аналогично методу index, но, естественно, используются другой метод модели (getUrlData) и представление (urldetails).

В начале метода (строки 35-37) выполняется проверка параметра $urlId и если он имеет недопустимое значение, посетитель перенаправляется на главную страницу.

Для добавления URL в базу данных служит метод addurl (строки 57-68). Здесь мы читаем url из массива $_POST и выполняем проверку.

Проверка простейшая, выполняется с помощью регулярного выражения в методе _isValidURL (строки 86-89). URL считается правильным если содержит символы «://» и не содержит пробелов, кроме того в первой части URL могут быть только английские буквы и цифры.

Естественно, можно написать более сложное выражение для проверки, но я хотел оставить возможность добавлять локальные адреса (вроде http://localhost).

Если URL прошел проверку, то он добавляется в базу данных. В противном случае – формируем сообщение об ошибке. После этого вызываем метод index, т.е. загружаем главную страницу.

Метод removeresult (строки 97-101). Удаляет указанный результат проверки (используется метод removeResult модели resultmodel). После удаления загружаем страницу с подробными данными о выбранном URL.

removeurl (строки 108-114) – удаляет URL из базы данных. Здесь тоже ничего особенного. Используем метод deleteURL модели urlmodel.

Вызовы методов removeresult и removeurl происходят при клике по ссылке «Удалить», которая находится напротив соответствующего URL или результата проверки.

Осталось рассмотреть метод ping. Но он получился довольно объемный, поэтому о нем я напишу отдельный пост.

До встречи!

P.S. Ссылки на все статьи и примеры цикла я публикую здесь.