Laravel4:Respondendo a solicitações AJAX do controlador
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
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.