Question

J'essaie de générer des réponses spécifiques à ajax à partir de mes contrôleurs en utilisant la méthode Request::ajax(), qui fonctionne très bien.Le seul problème est que la façon dont je l'ai configuré actuellement n'est pas vraiment une solution intéressante.

Mon contrôleur :

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

}

Donc, pour le moment, pour chaque méthode que je définis dans mes contrôleurs, je dois ajouter l'extrait de code qui vérifie une requête AJAX et renvoie une vue unique si l'instruction renvoie vrai.

Cela m'amène à ma question qui est probablement plus liée à PHP qu'au framework ;

Existe-t-il un moyen d'exécuter ma vérification AJAX à chaque appel de méthode, sans la placer réellement dans la méthode ?Ou existe-t-il une autre solution pour garder mon code SEC ?

Merci d'avance!

PS :Ceci est mon premier article sur stackoverflow, alors n'hésitez pas à me corriger si j'ai fait des erreurs

Était-ce utile?

La solution

Créez une nouvelle mise en page barebone nommée « layouts/ajax » (ou tout autre nom de votre choix).

    <?php echo $content ?>

Dans votre contrôleur de base, remplacez ceci setupLayout() fonction.

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

Change ton getIndex() fonction à cela.

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

Désormais, les requêtes non-ajax seront rendues en utilisant layout défini dans le contrôleur, alors que les requêtes ajax recevront tout ce qui est défini sur $this->layout->content.

Note :Le contrôleur négligera la configuration de la disposition dans setupLayout(), si la méthode appelée renvoie une valeur véridique.Cette méthode ne fonctionnera donc pas pour les fonctions comme ci-dessous.

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

Autres conseils

Vous pouvez simplement modifier la propriété de la mise en page, dans le constructeur, s'il s'agit d'une demande AJAX:

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

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

Si cela ne fonctionne pas, essayez de le régler à NULL à la place.

Pourquoi retourneriez-vous une vue via Ajax?Utilisez-vous pour créer un spa?Si oui, il y a de meilleurs moyens.Je suis généralement contre le retour de HTML via Ajax.

L'itinéraire que j'irais dans votre position est probablement en face de la façon dont vous le faites.Rendez la vue Peu importe quoi, si la demande est AJAX, transmettez les données supplémentaires et demandez à JS les données sur la page.C'est essentiellement à quel point la plupart des cadres JavaScript MVC fonctionnent.

Désolé si je manque totalement le point ici, il suffit d'une hypothèse de votre objectif de fin avec les informations que vous avez fournies.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top