Вопрос

Я пытаюсь сгенерировать специфические ответы Ajax от моих контроллеров, используя метод запроса :: ajax (), который работает нормально.Единственная проблема в том, что в том, что у меня его настроено, сейчас не очень красивое решение.

Мой контроллер:

class HomeController extends BaseController {

protected $layout = 'layouts/main';

public function __construct()
{
    $this->beforeFilter('auth');
}

public function getIndex()
{
    $view = View::make('content.home.index');
    if(Request::ajax()) return $view; //For ajax calls we only want to return the content to be placed inside our container, without the layout
    $this->layout->menu = 'content.menu';
    $this->layout->content = $view;
}

}
.

Так что прямо сейчас, для каждого метода я определяю внутри моих контроллеров, мне нужно добавить фрагмент кода, который проверяет запрос AJAX и возвращает один вид, если оператор возвращает true.

Это приводит к моим вопросам, который, вероятно, больше, связанный с PHP, чем в рамках;

Есть ли способ выполнения моей проверки AJAX на каждом вызове метода, не оформляя его внутри метода?Или есть ли какое-то другое решение, чтобы соблюдать мой код сухой?

Спасибо заранее!

PS: Это мой первый пост в Stackoverflow, поэтому не стесняйтесь исправить меня, если я сделаю какие-либо ошибки

Это было полезно?

Решение

Создайте новый макет Barebone с именем «Макеты / AJAX» (или любое имя, которое вам нравится).

    <?php echo $content ?>
.

В вашем базовом контроллере переопределите эту функцию setupLayout().

protected function setupLayout()
{
    if ( ! is_null($this->layout))
    {
        $layout = Request::ajax() ? 'layouts/ajax' : $this->layout;
        $this->layout = View::make($layout);            
    }
}
.

Измените функцию getIndex() к этому.

public function getIndex()
{
    $view = View::make('content.home.index');
    $this->layout->menu = 'content.menu';
    $this->layout->content = $view;
}
.

Теперь не-AJAX запросы будут отображаться с использованием layout, установленного в контроллере, где в качестве запросов AJAX получат все, что набор для $this->layout->content.

Примечание. Контроллер пренебрегает настройкой макета в setupLayout(), если называемый метод возвращает правдоподобное значение.Таким образом, этот метод не будет работать для функций, таких как ниже.

public function getIndex()
{
    return View::make('content.home.index');
}
.

Другие советы

Вы можете просто изменить свойство макета, в конструкторе, если это запрос AJAX:

public function __construct()
{
    $this->beforeFilter('auth');

    if(Request::ajax()) {
        $this->layout = '';
    }
}
.

Если это не работает, попробуйте настроить его на нулевое вместо.

Почему вы вернете представление через Ajax?Вы используете его, чтобы создать спа?Если так, есть лучшие способы.Я обычно против возврата HTML через AJAX.

Маршрут, который я пошел в свою позицию, вероятно, напротив того, как вы это делаете.Визуализируйте представление, независимо от того, что, если запрос ajax, пропустите дополнительные данные и имейте JS рендеринг данных на странице.Это, по сути, как большинство функций Frameworks MVC JavaScript MVC.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top