Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

J'essaye de faire un redirect vers la route de la page d'accueil de l'Admin si la request n'est pas dans le in_array

<?php

protected function orderBy($request)
{
    if ($request->get('orderby') !== null) {
        if (!in_array($request->get('orderby'), ['h1', 'updated_at']) OR !in_array($request->get('order'), ['asc', 'desc'])) {
            redirect()->route('admin_home');    // marche pas
        }

        $this->orderBy = $request->get('orderby');
        $this->order = $request->get('order');

    } else {
        $this->orderBy = 'id';
        $this->order = 'desc';
    }

    return $this;
}

Ce que je veux

Je veux rediriger vers la homepage de mon admin si la request n'est pas dans le in_array

Ce que j'obtiens

Les orderby et order ne sont pas pris en compte...
Pourquoi ?
Merci beaucoup.

18 réponses


AlexJM
Réponse acceptée

Sinon tu mets un deuxième paramètre à ta méthode genre :

protected function orderBy($request, &$redirect)

et si tu veux rediriger tu mets $redirect = true, sinon false, et dans la méthode de ton controlleur:

public function index(Request $request)
{
    $this->status = 1;
    $redirect = false;
    $this->orderBy($request, $redirect)->runArticles($request, route('admin_article_index'));
    if($redirect) return redirect()->...;
    return $this->returnView($request, 'index');
}

Salut,

Tu as debug les variables rennvoyées par ton formulaire voir si les infos dont tu as besoin sont bien définies ?

dd($request->all());
stephweb
Auteur

Yes. $request est bien pris en compte. C'est le redirect() qu'il ne veut pas prendre en compte.
Merci.

Salut,

Je ne te demande pas si $request est bien pris en compte mais si les valeurs correpsondent bien à celles que tu essayes de match.

if (!in_array($request->get('orderby'), ['h1', 'updated_at']) || !in_array($request->get('order'), ['asc', 'desc'])) {
   redirect()->route('admin_home');
}
stephweb
Auteur

a ok.
Il y a bien 'orderby' et 'order' qui sont passés en GET.
Si je leur passe comme valeur, les valeurs autorisés dans le array, le orderby et order marchent bien.
Par contre si l'utilisateur modifie l'URL (par example pour 'orderby' mettre autre chose que 'h1' et 'updated_at'), je voudrai le rediriger vers la route 'admin_home'.
Mais le redirect ne marche pas. (par contre si je met un header location au lieu de la function redirect de Laravel ça marche bien, mais le but avec un framework est d'utiliser ses functions).
Merci.

Ta route est bien nommée ?

stephweb
Auteur

Oui, et heursement.
Merci.

Il passe bien dans ta condition au moins ?

stephweb
Auteur

Yes, c est vraiment le redirect qui pose problème.
Et à cet endroit la, je ne peut pas mettre de return devant le redirect.
Merci.

Pourquoi ne peux-tu pas mettre de return ?

stephweb
Auteur

Car cette methode orderBy je l'appelle dans une autre methode où je ne peut pas mettre de return orderBy()...
Donc faut que je trouve comment avec Laravel on peut faire un redirect sans mettre de return.
merci

Euh ... en gros tu veux rediriger SANS quitter la page courante ? Y'a pas comme un problème ? :'D
Tu peux envoyer les ressources dont tu as besoin dans la redirection (tu as lu la doc ???) :

$data = ['resource_1' => $resource_1, 'resource_2' => $resource_2/*, ...*/];

return redirect('route_name')->with('data' => $data);

https://laravel.com/docs/5.1/responses#redirecting-with-flashed-session-data

Une réponse en JSON serait plus appropriée

return response()->json([]);
stephweb
Auteur

MErci à tous pour vos réponse.
En fait si je ne peut pas mettre de return à ma function orderBy, c'est parceque j'appelle cette function comme ceci :

<?php
    /**
     * Afficher la liste des articles publiés
     *
     * @param Request $request
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     */
    public function index(Request $request)
    {
        $this->status = Article::STATUS_PUBLISHED;

        $this->orderBy($request)->runArticles($request, route('admin_article_index'));

        return $this->returnView($request, 'index');
    }

Et je ne peut donc pas mettre de :

return orderBy();

Si au lieu du redirect, je met un header location suivi d'un exit, ça fonctionne.

Je n'ai RIEN compris à ce que tu racontes. Tu peux expliquer ton architecture stp ?

stephweb
Auteur

Voici un extrait de mon ArticleController :

<?php

/**
 * Afficher la liste des articles publiés
 *
 * @param Request $request
 * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
 */
public function index(Request $request)
{
    $this->status = 1;

    $this->orderBy($request)->runArticles($request, route('admin_article_index'));

    return $this->returnView($request, 'index');
}

/**
 * Afficher la liste des articles en brouillons
 *
 * @param Request $request
 * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
 */
public function indexDrafts(Request $request)
{
    $this->status = 2;

    $this->orderBy($request)->runArticles($request, route('admin_article_index-drafts'));

    return $this->returnView($request, 'index-drafts');
}

/**
 * Afficher la liste des articles en corbeille
 *
 * @param Request $request
 * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
 */
public function indexTrash(Request $request)
{
    $this->status = 3;

    $this->orderBy($request)->runArticles($request, route('admin_article_index-trash'));

    return $this->returnView($request, 'index-trash');
}

/**
 * Ordre d'affichage lors du clic sur les liens du thead
 *
 * @param $request
 * @return $this
 */
private function orderBy($request)
{
    $varGet = RequestC::andIfIssetGet(['page', 'pp', 'q', 'category']);

    if ($request->get('orderby') !== null) {
        if (!in_array($request->get('orderby'), ['h1', 'updated_at']) OR !in_array($request->get('order'), ['asc', 'desc'])) {
            redirect()->route('admin_home');    // marche pas...
        }

        $this->orderBy = $request->get('orderby');
        $this->order = $request->get('order');

        if ($request->get('orderby') == 'h1' && $request->get('order') == 'asc') {
            $this->tableHrefH1 = 'orderby=h1&amp;order=desc'.$varGet;
            $this->tableClassH1 = 'orderby-icon';
        } elseif ($request->get('orderby') == 'h1' && $request->get('order') == 'desc') {
            $this->tableHrefH1 = 'orderby=h1&amp;order=asc'.$varGet;
            $this->tableClassH1 = 'orderby-icon-2';
        } elseif ($request->get('orderby') == 'updated_at' && $request->get('order') == 'desc') {
            $this->tableHrefLastEdit = 'orderby=updated_at&amp;order=asc'.$varGet;
            $this->tableClassLastEdit = 'orderby-icon-2';
        } elseif ($request->get('orderby') == 'updated_at' && $request->get('order') == 'asc') {
            $this->tableHrefLastEdit = 'orderby=updated_at&amp;order=desc'.$varGet;
            $this->tableClassLastEdit = 'orderby-icon';
        }
    } else {
        $this->orderBy = 'id';
        $this->order = 'desc';
        $this->tableHrefH1 = 'orderby=h1&amp;order=asc'.$varGet;
        $this->tableClassH1 = 'orderby-icon-n';
        $this->tableHrefLastEdit = 'orderby=updated_at&amp;order=desc'.$varGet;
        $this->tableClassLastEdit = 'orderby-icon-n-2';
    }

    return $this;
}

/**
 * Select et count articles. Possible aussi avec un searche WHERE LIKE h1
 *
 * @param $request
 * @param string $viewPath - Pour préciser path de la pagination
 * @return $this
 */
private function runArticles($request, $viewPath)
{
    // pagination - par page
    if ($request->get('pp') !== null && in_array($request->get('pp'), [5,10,30,50,100,500,'all'])) {
        $this->limit = ($request->get('pp') == 'all') ? null : $request->get('pp');   // == 1 pour "tous"
    } else {
        $this->limit = 10;
    }

    $this->articles = Article::where('status', $this->status)->orderBy($this->orderBy, $this->order)->paginate($this->limit);

    $this->count = Article::where('status', $this->status)->count();

    $this->articles->setPath($viewPath);

    return $this;
}

/**
 * Retourne la vue avec les variables à lui envoyer
 *
 * @param $request
 * @param string $viewPath
 * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
 */
private function returnView($request, $viewPath)
{
    return view('admin/article/'.$viewPath, [
        'articles' => $this->articles,
        'count' => $this->count,
        'tableHrefH1' => $this->tableHrefH1,
        'tableClassH1' => $this->tableClassH1,
        'tableHrefLastEdit' => $this->tableHrefLastEdit,
        'tableClassLastEdit' => $this->tableClassLastEdit,
                'getQ' => ($request->get('q') !== null) ? $request->get('q') : null,
        // --- /pour cumuler les liens ---
    ]);
}

En gros, j'ai une liste d'article publiés (status 1), une liste d'article en brouillons (status 2), une liste d'article en corbeille (status 3).
Merci

stephweb
Auteur

Oui c est vrai. du moins, + comme ceci :

public function index(Request $request)
{
    $this->status = 1;
    $this->redirect = false;
    $this->orderBy($request, $redirect)->runArticles($request, route('admin_article_index'));
    if($this->redirect) return redirect()->...;
    return $this->returnView($request, 'index');
}

Mais ajouter le header location me fait 2 lignes de code en moins. Donc je pense finalement laisser le header.
Merci à tous.

Non pas les $this->redirect, parce que c'est une variable locale pas pour la classe ;)

Tu peux mettre le header mais attention, parce que tu termineras pas la requête et il y a des choses qui risquent de ne pas se faire