Pregunta

Estoy intentando generar respuestas específicas de ajax desde mis controladores usando el método Request::ajax(), que funciona bien.El único problema es que la forma en que lo tengo configurado ahora no es una solución muy atractiva.

Mi controlador:

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;
}

}

Entonces, ahora mismo, para cada método que defino dentro de mis controladores necesito agregar el fragmento de código que verifica una solicitud AJAX y devuelve una vista única si la declaración devuelve verdadero.

Esto lleva a mi pregunta que probablemente esté más relacionada con PHP que con el marco;

¿Hay alguna manera de ejecutar mi verificación AJAX en cada llamada al método, sin tener que colocarla dentro del método?¿O hay alguna otra solución para mantener mi código SECO?

¡Gracias de antemano!

PD:Esta es mi primera publicación sobre stackoverflow, así que no dudes en corregirme si cometí algún error.

¿Fue útil?

Solución

Cree un nuevo diseño básico llamado 'layouts/ajax' (o cualquier nombre que desee).

    <?php echo $content ?>

En su controlador Base, anule esto setupLayout() función.

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

Cambia tu getIndex() función a esto.

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

Ahora las solicitudes que no sean ajax se procesarán usando layout configurado en el controlador, donde las solicitudes ajax recibirán lo que esté configurado en $this->layout->content.

Nota :El controlador descuidará la configuración del diseño en setupLayout(), si el método llamado devuelve un valor veraz.Entonces este método no funcionará para funciones como las siguientes.

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

Otros consejos

Podrías cambiar la propiedad de diseño, en el constructor, si es una solicitud AJAX:

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

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

Si no funciona, intente configurarlo a nulo en su lugar.

¿Por qué devolverías una vista a través de AJAX?¿Lo estás usando para crear un spa?Si es así hay mejores maneras.Generalmente estoy en contra de regresar HTML a través de AJAX.

La ruta que iría en su posición es probablemente lo contrario de cómo lo está haciendo.Haga que la vista no importa qué, si la solicitud es AJAX, pase los datos adicionales y haga que JS rinda los datos en la página.Eso esencialmente es la forma en que la mayoría de los marcos de MVC de JavaScript funcionan.

Perdón Si estoy perdiendo totalmente el punto aquí, simplemente asumiendo su objetivo final con la información que proporcionó.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top