Pergunta

Estou tentando gerar respostas específicas de ajax de meus controladores usando o método Request::ajax(), que está funcionando perfeitamente.O único problema é que a maneira como estou configurado agora não é realmente uma solução bonita.

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

}

Então, agora, para cada método que defino em meus controladores, preciso adicionar o trecho de código que verifica uma solicitação AJAX e retorna uma única visualização se a instrução retornar verdadeiro.

Isso leva à minha pergunta que provavelmente está mais relacionada ao PHP do que ao framework;

Existe uma maneira de executar minha verificação AJAX em cada chamada de método, sem realmente colocá-la dentro do método?Ou existe alguma outra solução para manter meu código SECO?

Desde já, obrigado!

PS:Este é meu primeiro post sobre stackoverflow, então sinta-se à vontade para me corrigir se eu cometer algum erro

Foi útil?

Solução

Crie um novo layout básico chamado 'layouts/ajax' (ou qualquer nome que você desejar).

    <?php echo $content ?>

No seu controlador Base, substitua isso setupLayout() função.

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

Mude o seu getIndex() função para isso.

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

Agora as solicitações não-ajax serão renderizadas usando layout definido no controlador, onde as solicitações ajax receberão tudo o que estiver definido como $this->layout->content.

Observação :O controlador negligenciará a configuração do layout em setupLayout(), se o método chamado retornar um valor verdadeiro.Portanto, este método não funcionará para funções como abaixo.

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

Outras dicas

Você poderia simplesmente alterar a propriedade layout, no construtor, se for uma solicitação ajax:

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

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

Se não funcionar, tente configurá-lo como NULL.

Por que você retornaria uma VIEW via ajax?Você está usando-o para criar um SPA?Nesse caso, existem maneiras melhores.Geralmente sou contra o retorno de HTML via AJAX.

O caminho que eu seguiria na sua posição é provavelmente o oposto de como você está fazendo.Renderize a visualização não importa o que aconteça, se a solicitação for ajax, passe os dados extras de volta e faça com que o JS renderize os dados na página.É essencialmente assim que a maioria das estruturas Javascript MVC funcionam.

Desculpe se estou perdendo totalmente o foco aqui, apenas assumindo seu objetivo final com as informações que você forneceu.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top