2 votes

Enregistrer les templates de lame dans la base de données plutôt que dans un fichier

Je veux enregistrer mes modèles blade dans la base de données, car l'en-tête et le pied de page de chaque page peut être personnalisé pour l'utilisateur. Je veux laisser mes utilisateurs créer la mise en page eux-mêmes et ensuite, pour chaque demande d'un utilisateur donné, je veux servir la page en utilisant la mise en page spécifiée par cet utilisateur.

Les variables nécessaires qui sont transmises par le contrôleur leur sont fournies dans la documentation.

Remarque : Je fais confiance à mes utilisateurs. Ils sont tous parties prenantes du projet et sont des programmeurs, donc l'exécution de code côté serveur est acceptable.

1voto

J'ai réalisé que je pouvais améliorer la sécurité et la mise en cache si je les laisse insérer le contenu statique uniquement. La seule chose que je dois changer est le contenu principal, donc je peux simplement les laisser définir un token où le contenu doit être placé. Comme dans la réponse ci-dessus de @huzaib-shafi, j'ai fait ce qui suit...

//Dans le contrôleur
$content = View::make('final',compact('data'));
$token = "", $content, $templateInDatabase);
$view = str_replace_first("<%token%>", $token, $view);
$view = str_replace_first("<%scripts%>", $scripts, $view);

return $view;

Cela les oblige à utiliser bootstrap dans leur modèle, car j'utilise les styles bootstrap dans mes modèles blade, mais c'est acceptable dans mon cas.

0voto

Huzaib Shafi Points 325

J'ai posé et répondu à une question similaire il y a quelques jours. Pour autant que je sache, Blade ne traite pas le contenu de la vue à partir des colonnes de la base de données. Bien que vous puissiez utiliser la méthode compileString() de View. Mais vous devriez jeter un œil aux questions suivantes.

Étendre le modèle Blade à partir de la chaîne stockée en base de données

Laisser les utilisateurs créer des mises en page Blade personnalisées / stocker en base de données

0voto

Dev Points 131

Bien que ce soit un ancien article mais au cas où quelqu'un tombe dessus comme moi. J'ai obtenu quelque chose de similaire en utilisant le framework Laravel, en enregistrant la vue dans la base de données de telle sorte que, chaque fois que j'ai besoin d'afficher la vue, je la récupère de la DB, et je la charge dans un fichier en utilisant la fonction php file_put_contents() et je la rends avec la méthode view(). Par exemple;

$blade = DB::table('pages')->where('name', 'index')->first();
file_put_contents('template.blade.php', $blade->view);

//Notez que si j'ai aussi besoin de passer des données à la vue, je peux le faire comme ceci
//$data = ['page_title' => 'Testing Blade Compilation using views Saved in DB'];
// return view(template, $data);

return view('template');

Encore une fois, dans mon cas pour une sécurité accrue, j'ai créé des modèles de base avec le schéma de templating blade & j'ai injecté des inputs créés par l'utilisateur dans le modèle après avoir assaini l'entrée générée en utilisant HTMLPurifier et en rendant la vue. Par exemple

$view = view('base.template')->render();
//de manière similaire à ce qui précède, je peux charger des données dans la vue comme ceci
//$data = ['page_title' => 'Testing Blade Compilation using views Saved in DB'];
//$view = view('base.template', $data)->render();

$purifier = new HTMLPurifier(HTMLPurifier_Config::createDefault());
$with_purified_input = $purifier->purify($user_generated_input);
str_replace('view_variable', $with_purified_input, $view);

return $view;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X