Структура Коханы - Лучшие практики внедрения Ajax


Я разрабатываю приложение в рамках Kohana. Я хотел бы узнать о лучших практиках внедрения ajax в кохане. До сих пор я использую другой контроллер для ajax. Я думаю, что важными проблемами будут сведение к минимуму потребностей в ресурсах и проведение сессий.

Заранее благодарю

Author: Shameer, 2011-04-06

4 answers

Я использую это:

В Controller_Template:

    public function before()
    {
        $this->auto_render = ! $this->request->is_ajax(); 
        if($this->auto_render === TRUE)
        {
            parent::before();
        }
    }

И внутри моих действий:

      if ($this->request->is_ajax())    
        {
            ...         
            $this->response->headers('Content-type','application/json; charset='.Kohana::$charset);
            $this->response->body($jsonEncoded);
        }
 11
Author: Enrique, 2014-09-05 11:09:12

Как сказали ребята выше, вам не нужен отдельный контроллер для ваших действий ajax. Вы можете воспользоваться объектом запроса Kohana, чтобы определить тип запроса. Это может быть сделано следующим образом:

<?php

class Controller_Test extends Controller_Template {
    /**
     * @var     View    Template container
     */
    protected $template = 'template';
    /**
     * @var     View    Content to render
     */
    protected $content = 'some/content/view';
    // Inherited from parent class
    protected $auto_template_render = TRUE;
    public function before()
    {
        parent::before();
        if ($this->request->is_ajax() OR !$this->request->is_initial()) {
            $this->auto_template_render = FALSE;
        }    
    }

    public function after()
    {
        if ($this->auto_template_render == FALSE) {
            // We have ajax or internal request here
            $this->template = $this->content;            
        } else {
            // We have regular http request for a page
            $this->template = View::factory($this->template)
                ->set('content', $this->content);
        }
        // Call parent method
        parent::after();
    }
}

Хотя пример очень прост, его можно улучшить до того, что вы хотите заархивировать. В основном я закончил писать свой собственный Controller_Template, чтобы делать то, что мне нужно. Также вы можете рассмотреть возможность добавления параметра format в свои URL-адреса, чтобы URL-адреса .html возвращали обычный html-представление данных и URL-адреса .json сделали то же самое, но в формате json. Для получения дополнительной информации (и, возможно, идей) см. неофициальная вики-страница Kohana в Керкнессе

 5
Author: Xobb, 2011-04-13 12:49:58

На самом деле вам не нужен отдельный контроллер, вы также можете использовать Kohana_Controller_Template для обработки AJAX-запросов.

Вам решать, каким будет ответ в случае запроса AJAX (или подзапроса, обычно это одно и то же). Обычно у меня шаблон фактически отображается только в том случае, если запрос является начальным (а не ajax), в противном случае он отображается как $content var.

Кроме того, вы можете легко проверить, является ли запрос AJAX/подзапросом:

if ($request->is_ajax())
if ( ! $request->is_initial()) 
 1
Author: Kemo, 2011-04-06 09:37:17

Кроме того, при использовании Kohana_Controller_Template в качестве родителя/предка контроллера рекомендуется не забывать отключать автоматическую визуализацию при доступе через AJAX, чтобы предотвратить загрузку и визуализацию всего шаблона.

if ($request->is_ajax()) $this->auto_render = FALSE;
 1
Author: roomcays, 2011-04-07 21:49:22