LARAVE 4:コントローラからのAjax要求への対応
質問
私は、request :: 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;
}
}
.
SO whereは、私のコントローラ内で定義するすべての方法で、Ajax要求をチェックするコードスニペットを追加し、ステートメントがtrueを返す場合は単一のビューを返す必要があります。
これは私の質問につながり、それは枠組みよりも多くのPHPです。
実際にメソッド内に配置せずに、すべてのメソッド呼び出しについて私のAjaxチェックを実行する方法はありますか?または私のコードを乾燥させるための他のいくつかの解決策はありますか?
事前にありがとう!
PS:これはスタックオーバーフローの私の最初の投稿であるので、間違いを作ったら私を訂正してください
解決
「レイアウト/ ajax」(または好きな名前)という名前の新しいBareboneレイアウトを作成します。
<?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要求は、Controllerのlayout
を使用してレンダリングされます。ここで、Ajax要求は$this->layout->content
に設定されているものを受信します。
注:呼び出されたメソッドが真実値を返す場合、ControllerはsetupLayout()
のレイアウト設定を無視します。そのため、この方法は以下のような機能では機能しません。
public function getIndex()
{
return View::make('content.home.index');
}
. 他のヒント
Ajaxリクエストの場合は、コンストラクターでレイアウトプロパティを変更するだけです。
public function __construct()
{
$this->beforeFilter('auth');
if(Request::ajax()) {
$this->layout = '';
}
}
.
うまくいかない場合は、代わりにnullに設定してください。
なぜあなたはAjaxでビューを返しますか?あなたはそれを使ってスパを作成していますか?もしそうなら、より良い方法があります。私は一般的にAjaxを介してHTMLを返すことに反対しています。
私があなたの立場に入る経路はおそらくあなたがそれをどのようにしているかの反対です。要求がAjaxの場合は、追加のデータを渡してJSがページ上のデータをレンダリングさせてください。それは基本的にほとんどのJavaScript MVCフレームワーク機能です。
私がここでポイントを完全に行方不明の場合は、あなたが提供した情報であなたの最終目標を仮定しています。