Laravel Middleware de la variable de retour de contrôleur
Je suis la réalisation d'une vérification des permissions à un utilisateur de déterminer si elles peuvent afficher une page ou pas. Cela implique de passer de la demande par le biais de certains middleware premier.
Le problème que j'ai c'est que je suis en reproduisant les mêmes requête de base de données dans le middleware et le contrôleur avant de renvoyer les données à la vue elle-même.
Voici un exemple de l'installation;
-- routes.php
Route::get('pages/{id}', [
'as' => 'pages',
'middleware' => 'pageUser'
'uses' => 'PagesController@view'
]);
-- PageUserMiddleware.php (classe PageUserMiddleware)
public function handle($request, Closure $next)
{
//get the page
$pageId = $request->route('id');
//find the page with users
$page = Page::with('users')->where('id', $pageId)->first();
//check if the logged in user exists for the page
if(!$page->users()->wherePivot('user_id', Auth::user()->id)->exists()) {
//redirect them if they don't exist
return redirect()->route('redirectRoute');
}
return $next($request);
}
-- PagesController.php
public function view($id)
{
$page = Page::with('users')->where('id', $id)->first();
return view('pages.view', ['page' => $page]);
}
Comme vous pouvez le voir, le Page::with('users')->where('id', $id)->first()
est répété dans les deux le middleware et le contrôleur. J'ai besoin de passer les données par le biais de l'un à l'autre afin de ne pas dupliquer.
- J'allais vous demander quelque sorte la même, m'a fallu du temps pour trouver cette réponse. Voici ma question. Je vais l'ajouter ici, pour le SEO/localisation raisons, j'espère que c'est ok: Laravel 5.0 - Charger le modèle dans le middleware ET le contrôleur. Comment puis-je charger une instance de la Utilisateurs du modèle, de sorte que la même instance (une seule requête de base de données est disponible dans le Middleware et le Contrôleur? Parce que dans le middleware je veux vérifier si l'utilisateur est Autorisé et, dans le Contrôleur, j'aimerais présenter les informations sur l'Utilisateur ou de manipuler l'Utilisateur en quelque sorte.
Vous devez vous connecter pour publier un commentaire.
Je crois que la manière correcte de le faire (dans Laravel 5.x) est d'ajouter vos champs personnalisés pour les attributs de la propriété.
À partir des commentaires du code source, nous pouvons voir les attributs est utilisée pour les paramètres personnalisés:
De sorte que vous pourriez procéder comme suit;
Vous pouvez ensuite récupérées à l'attribut en appelant le:
Ou de demande d'objet dans laravel 5.5+
$request->attributes->add(['key => 'value'] );
n'a pas fonctionné pour moi, mais$request->attributes->set('key', 'value')
travaillé, j'ai pu récupérer les données à l'aide de$request->get('key')
,$request->request->add(['myAttribute' => 'myValue']);
pour être capable d'utiliser la magie de lecture abrégée$request->myAttribute
À la place de la coutume des paramètres de la requête, vous pouvez suivre l'inversion de modèle de contrôle et d'utiliser l'injection de dépendance.
Dans votre middleware, enregistrer votre
Page
exemple:app()->instance(Page::class, $page);
De déclarer ensuite que votre contrôleur a besoin d'un
Page
exemple:Laravel automatiquement la résolution de la dépendance et de l'instancier votre contrôleur avec le
Page
instance que vous avez lié à votre middleware.Dans laravel >= 5, vous pouvez utiliser
$request->merge
dans le middleware:Et dans le contrôleur:
Request::instance()
de manière statique, plutôt que d'utiliser$request
?Je suis sûr que si il était possible de transmettre des données à partir d'un middleware pour un contrôleur alors qu'il serait dans l'Laravel de la documentation.
Ont un coup d'oeil à cette et cette, ça pourrait aider.
En bref, vous pouvez entrer vos données sur l'objet de la requête qui est passé à la middleware. Le Laravel l'authentification de façade n'a que trop.
Donc, dans votre middleware, vous pouvez avoir:
Comme mentionné dans un des commentaires ci-dessus pour laravel 5.3.x
Ne fonctionne pas. Mais la définition de la variable comme ceci dans le middleware œuvres
J'ai pu récupérer les données à l'aide de ce dans mon contrôleur
Laravel 5.7
et
C'est très simple:
Ici est middleware code:
et voici contrôleur de code:
$la demande est la matrice de sorte que nous pouvons simplement ajouter de la valeur et de la clé vers le tableau et obtenir le $demande avec cette clé dans le contrôleur.
$request['id'] = $id;
Si votre site a des pages cms qui sont extraites de la base de données et vous voulez le montrer leurs titres dans l'en-tête et pied de page du bloc sur toutes les pages de laravel application puis l'utilisation du middleware. Écrire de code ci-dessous dans votre middleware:
Then goto votre header.blade.php et footer.blade.php et écrire le code ci-dessous pour ajouter des liens de pages cms:
Merci beaucoup à tous et profitez du code 🙂
je ne parle pas anglais, donc... désolé pour les éventuelles erreurs.
Vous pouvez utiliser le Cio de liaison pour cela. Dans votre middleware, vous pouvez le faire pour la liaison $page exemple:
Après, dans votre contrôleur, vous appelez cette instance:
L'App::instance de ne pas re-instance de la classe, au lieu de retourner l'instance previusly de liaison.
J'ai été en mesure d'ajouter des valeurs à la Demande-objet avec:
et les faire revenir à un point plus tard avec:
Cela est possible parce que laravels Demande s'étend symfonys Demande qui a l'attribut "$attributs" de type ParameterBag qui est destiné à contenir des paramètres personnalisés.
Je pense que cela devrait être la Meilleure Pratique pour transmettre des données ultérieures, de Middleware, de Contrôleurs ou de tout autre lieu où il est possible d'accéder à la Demande-objet.
Testé avec Laravel 5.6, mais probablement aussi de travailler avec d'autres versions.