Отдельный контроллер AJAX против текущего контроллера?
У меня есть вопрос больше относительно стиля и организации, чем что-либо еще. Я часто чувствую, что у меня есть одна страница (контроллер), которая требует нескольких вызовов ajax. Вместо того, чтобы создавать отдельный контроллер только для вызовов AJAX, потому что это будет означать больше контроллеров, я просто делаю следующее:
class Management extends MY_Controller
{
public function __construct()
{
parent::__construct();
$this->protect->protect();
if ($this->uri->segment(2, 0) !== 0 && !$this->input->is_ajax_request()) {
exit('No direct script access allowed');
}
}
public function index()
{
$this->load->model('management_model');
$data['row_config'] = $this->management_model->getConfigRows();
$data['row_users'] = $this->management_model->getUsers();
$data['roles'] = $this->management_model->getRoles();
$this->tpl->head();
$this->load->view('management/scripts');
$this->tpl->body();
if ($this->messages->hasMessages()) {
$this->output->append_output($this->messages->display());
}
$this->load->view('management/manage', $data);
$this->load->view('management/current_users', $data);
$this->load->view('management/modals', $data);
$this->tpl->footer();
}
public function get_user_details()
{
$user = new \Auth\ASUser($_POST['userId']);
echo json_encode($user->getAll());
}
public function delete_user()
{
$user = new \Auth\ASUser($_POST['userId']);
$user->deleteUser(true);
}
Поскольку индекс является единственной страницей, на которой мне действительно нужно визуализировать правильное представление, а остальные являются вызовами ajax, я просто проверяю сегмент URI, чтобы увидеть, существует ли что-то отличное от индекса, а затем проверяю, является ли это запросом ajax.
Это плохая практика? Должен ли я разделить вызовы AJAX и контроллер представления?
2 ответа
Ваш вопрос спрашивает мнение, которое противоречит СОП Stack Overflow. Но я все равно выскажу свое мнение.
Это плохая практика? Я так не думаю. Тем не менее, зачем делать контроллер больше, чем нужно? Если ваш Ajax обрабатывает все функции CRUD для какой-либо страницы, то контроллер может быть довольно большим. Возможно, вам лучше обслужить отдельный контроллер.
Вызов Ajax - это отдельный запрос к серверу - по сути, такой же, как и направление браузера на отдельную страницу на какой-либо другой вкладке браузера. Почему бы не сделать этот запрос на контроллер, который предназначен для Ajax? Можно утверждать, что такой контроллер производит лучше "Разделение проблем". Это хорошая практика.
Существует один способ убедиться, что этот контроллер используется только по запросу ajax-вызова. Пара строк кода в контроллере сделает определение.
class Some_ajax_handler extends CI_Controller
{
public function __construct()
{
if(!is_ajax()){
show_404();
}
parent :: __construct();
//if needed, do the rest of your construct here
}
public function get_user_details()
{
$user = new \Auth\ASUser($_POST['userId']);
echo json_encode($user->getAll());
}
}
Призыв к show_404();
заканчивается призывом к exit()
так что тебе не нужен return;
заявление или else
блок в контроллере. Вы можете быть уверены, что любой метод, который вызывается на этом контроллере, действительно является ajax-запросом.
С другой стороны, если представление контроллера использует Ajax для получения содержимого для ввода select или какого-либо другого простого вызова GET, то создание отдельного контроллера кажется излишним.
Кстати, есть библиотека CI, упрощающая вызовы Ajax ЗДЕСЬ, которые могут вас заинтересовать.
Единственная критика, которую я предлагаю, касается не ajax, а вашего использования new
что противоречит "способу Codeigniter" для загрузки и использования других классов (библиотек). Но я думаю, что это другая тема.
Честно говоря, я не думаю, что есть шаблон, где вы должны добавить свои функции AJAX, особенно в Codeigniter, который слабо связан для большей части своей структуры.
На мой взгляд, вы должны спросить себя ниже, чтобы найти, где вы должны делать свои Ajax-звонки.
- Связаны ли возвращенные данные от вызова ajax с контроллером, которым я уже являюсь?
- Буду ли я когда-нибудь снова использовать тот же метод / функциональность в другом контроллере или где-то еще?
- Нужен ли мне уже определенный конструктор контроллера, который, я думаю, должен сделать вызов ajax?
- Я рассчитываю на СУХОЙ принцип разработки программного обеспечения?
- Является ли мой код гибким, многоразовым и т. Д.?
У каждого проекта своя философия и рабочий процесс. Шаблон проектирования и структура данных, которые вы решите использовать, решат большинство ваших вопросов в стиле кодирования.