2013-05-15 4 views
1

Недавно я начал использовать Codeigniter после структурной проблемы в одном из моих приложений Ajax. (Вы можете прочитать об этом, если хотите, в my previous question)CodeIgniter - Замените избыточное преобразование JSON

У меня довольно короткий вопрос. В настоящее время я делаю много запросов Ajax для разных контроллеров. Я открываю контроллеры, как это:

public function __construct() 
{ 
    parent::__construct(); 

    $this->output->set_content_type('application/json'); 
} 

И в конце каждой функции я следующее:

$this->returnValue['result'] = "ReturnedInfo"; 
$this->returnValue = json_encode($this->returnValue); 
$this->output->set_output($this->returnValue); 

код довольно ясен сам по себе, но я не хочу повторять себя. В руководстве по кодированию указано, что необходимо сделать следующее:

$this->output 
    ->set_content_type('application/json') 
    ->set_output(json_encode(array('foo' => 'bar'))); 

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

Поскольку все мои контроллеры возвращают JSON, есть ли способ установить это глобально в файле конфигурации, возможно, или любым другим способом?

TL; DR У меня есть тот же кусок кода в каждом контроллере/функции. Поскольку тип вывода всегда один и тот же, а не результат, есть ли способ автоматизировать этот процесс через каждый контроллер/функцию?

ответ

3

Создайте Ajax_Controller, который содержит MY_Controller, который распространяется на CI_Controller. Контроллер Ajax затем наследуется от обоих контроллеров.

class Ajax_Controller extends MY_Controller 
{ 
    public function __construct() 
    { 
     parent::__construct(); 

     if(!$this->input->is_ajax_request()) return show_error('Invalid Request'); 
    } 

    public function jsonOutput($json) 
    { 
     //some data checking here.... 

     return $this->output 
      ->set_content_type('application/json') 
      ->set_header("HTTP/1.1 200 OK") 
      ->set_output($json); 
    } 
} 

-

class User extends Ajax_Controller 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
    } 

    public function userMethod() 
    { 
     $json = json_encode(array(
      '' => '' 
     )); 
     $this->jsonOutput($json); 
    } 
} 
+1

Удивительно, спасибо! Полностью забыл все о наследовании, ха-ха. – Nick

+0

Не беспокойтесь, это может также помочь вам взглянуть на ваш другой код по-разному. – Philip

1

Расширьте свои контроллеры от собственного базового класса, а не CI_Controller и поставить повторно используемую функцию (ы) и код конструктора там. Что-то вроде:

class BaseController extends CI_Controller { 
    protected function index() { 
    $this->returnValue['result'] = "ReturnedInfo"; 
    $this->returnValue = json_encode($this->returnValue); 
    $this->output->set_output($this->returnValue); 
    } 
} 

class Specific extends BaseController { 
    public function index() { 
    //do controller-specific stuff 

    parent::index(); 
    } 
} 

Я отрисую это дальше, если у меня есть группы контроллеров с общим кодом; например, если у меня была группа контроллеров, требующих входа пользователя в систему, я создаю AuthenticatedController, который расширяет BaseController и добавляет проверки сеанса и т. д.

+0

Спасибо, что нашли время, чтобы помочь мне. Этот ответ тоже хорош, но пример Филиппа был для меня более понятным, и он был немного быстрее. – Nick