首页 > 解决方案 > 如何从输入请求中返回多个视图变量?

问题描述

我正在构建一个 Web 应用程序,我想编辑一个用户配置文件:Utilisateur在我的例子中是模型。AUtilisateur可以是 a Etudiant、 aEnseignant或 a Partenaire。我在模型中指定了这一点。

Utilisateur'稳定的:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUtilisateursTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('utilisateurs', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('nom');
            $table->string('prenom');
            $table->string('username')->unique();
            $table->string('email')->unique();
            $table->string('password');
            $table->string('fonction');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('utilisateurs');
    }
}

Etudiant'稳定的:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateEtudiantsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('etudiants', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->integer('utilisateur_id')->unique();
            $table->integer('matricule');
            $table->string('grade');
            $table->string('filiere');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('etudiants');
    }
}

这是我在文件中注册用户(Utilisateur Etudiant此处)的方式register.blade.php

    <form action="{{ route('createstudent') }}" method="post" oninput="username_etu.value = prenom_etu.value.toLowerCase() +'.'+ nom_etu.value.toLowerCase()" >
      @csrf
      <div class="register">
         <input type="text" Name="nom_etu" placeholder="Nom" required>
         <input type="text" Name="prenom_etu" placeholder="Prénom(s)" required>
         <input type="text" Name="username_etu" placeholder="Nom d'utilisateur" required>
         <input type="email" Name="mail_etu" placeholder="Email" required>
         <input id="matricule" type="text" Name="matricule" placeholder="Numéro matricule" required>

        <!-- Génération automatique du password -->
        <?php
        $random = str_shuffle('abcdefghjklmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ234567890!$%^&!$%^&');
        $password = substr($random, 0, 10); //Password generated
                                ?>
        <!-- Champ du password caché -->
        <input type="hidden" name="password_etu" placeholder="" value=<?php echo $password ?> /> <br>

        <select name="grade" id="grade" required>
        <option value=""><i>Cycle</i></option>
        <option value="licence" id="licence">Licence</option>
        <option value="master" id="master">Master</option>
        </select>
        <select name="filiere" id="filiere" required>
        <option value=""><i>Filière d'études</i></option>
        <option value="GL" id="GL">Génie Logiciel</option>
        <option value="SI" id="SI" class="SI">Sécurité Informatique</option>
        <option value="SIRI" id="SIRI">Systèmes d'Information et Réseaux Informatiques</option>
        </select>
        <div class="send-button">
        <input type="submit" id="submitEtudiant" value="Enregistrer">
        </div>
    </div>
   </form>

我已将密码设置为生成随机值的隐藏字段。然后这些信息将发送到注册用户的电子邮件。

RegisterController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests\registerValidation;
use App\Utilisateur;
use App\Etudiant;
use App\Enseignant;
use App\Partenaire;
use Illuminate\Support\Facades\Mail;
use App\Mail\sendUserCredentials;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

class RegisterController extends Controller
{
    // REGISTERING A STUDENT (ETUDIANT)
    public function createStudent(Request $request){

        $validator = Validator::make($request->all(),[
            'nom_etu' => 'required:utilisateurs,nom',
            'prenom_etu' => 'required:utilisateurs,prenom',
            'username_etu' => 'required|unique:utilisateurs,username',
            'mail_etu' => 'email|required|unique:utilisateurs,email',
            'matricule' => 'integer|required|unique:etudiants,matricule',
            'grade' => 'required:etudiants,grade',
            'filiere' => 'required:etudiants,filiere',
        ]);

        if ($validator->fails()) {
            // echo "Errors encountered";
        return response()->json(['error'=>$validator->errors()->all()]);

        }
        //Fill the 'Utilisateur' table infos for a student
        $utilisateur = new Utilisateur;
        $utilisateur->fonction = 'etudiant';// Telling the user being registered is a 'etudiant'
        $utilisateur->nom = $request->input('nom_etu');
        $utilisateur->prenom = $request->input('prenom_etu');
        $utilisateur->username = $request->input('username_etu');
        $utilisateur->email = $request->input('mail_etu');
        $pass_etu = $request->input('password_etu');
        $utilisateur->password = bcrypt($pass_etu);
        $utilisateur->save();

        //Fill the specific attributes for the student registered
        $etudiant = new Etudiant;
        $etudiant->utilisateur_id = $utilisateur->id; // Link via the ids attributes the 'Utilisateur' id to the 'Etudiant' utilisateur_id;
        $etudiant->matricule = $request->input('matricule');
        $etudiant->grade = $request->input('grade');
        $etudiant->filiere = $request->input('filiere');
        $etudiant->save();

        //Once the user is created we'll send him in his mail his credentials to have access to the platform
        $data = [
            'lastname' => $utilisateur->nom, 
            'firstname' => $utilisateur->prenom,
            'usrname' => $utilisateur->username,
            'pass' => $pass_etu

        ];

        Mail::send('emails.userIds',$data, function($message) use ($utilisateur){

            $message->to($utilisateur->email, $utilisateur->username)->subject('Hi, vos identifiants pour la plateforme de gestion des projets de fin d\'études à IFRI');
        });

        $successMessage = "Utilisateur bien enregistré";


        return redirect('/register')->with($successMessage);
    }
}
        $pass_etu = $request->input('password_etu');
        $utilisateur->password = bcrypt($pass_etu);

由于密码应该在数据库中加密,我已经这样做了,但仍然会使用他的用户名将随机生成的(可读)密码发送给注册用户。

问题

所有这些工作正常。我让用户注册并将他的凭据发送到他的邮件地址。我的问题是编辑。Utilisateur无论用户的个人资料是(,,,Etudiant),Enseignant我都可以很好地取回有关用户的数据Partenaire

UtilisateurController@edit函数

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        $utilisateur = Utilisateur::findOrFail($id);
        $etudiant = Etudiant::where('utilisateur_id','=', $utilisateur->id)->get();
        $enseignant = Enseignant::where('utilisateur_id','=', $utilisateur->id)->get();
        $partenaire = Partenaire::where('utilisateur_id','=', $utilisateur->id)->get();
        return view('utilisateurs.utilisateurEdit', compact('utilisateur','etudiant','enseignant','partenaire'));
    }

UtilisateurEdit.blade.php

<!-- Editing user -->
    <form method="PUT" action=" {{route('utilisateur.update',$utilisateur->id)}} ">
        @csrf
        <input type="text" name="nom" placeholder="Nom" value=" {{$utilisateur->nom}} " required> <br>
        <input type="text" name="prenom" placeholder="Prénom(s)" value=" {{$utilisateur->prenom}} " required> <br>
        <input type="text" name="username" placeholder="Nom d'utilisateur" value=" {{$utilisateur->username}} " required> <br>
        <input type="email" name="email" placeholder="Email" value=" {{$utilisateur->email}} " required>
        <input type="text" name="password" placeholder="Mot de passse" value=" {{$utilisateur->password}} " required>
        @if($utilisateur->fonction == 'etudiant')
            <!-- IF THE USER IS AN 'ETUDIANT' -->
            @foreach($etudiant as $apprenant)
            <input type="text" name="matricule" placeholder="Numéro matricule" value=" {{$apprenant->matricule}} " required>
            <select name="grade" id="grade" required>
                <option value=""><i>Cycle</i></option>
                <option id="licence" value="licence" {{$apprenant->grade == "licence"? "selected":"" }} >Licence</option>
                <option id="master" value="master" {{$apprenant->grade == "master"? "selected":"" }}>Master</option>
            </select> <br>
            <select name="filiere" id="filiere" required>
                <option value=""><i>Filière d'études</i></option>
                <option id="GL" value="GL" {{$apprenant->filiere == "GL"? "selected":"" }} >Génie Logiciel</option>
                <option id="SI" class="SI" value="SI" {{$apprenant->filiere == "SI"? "selected":"" }}>Sécurité Informatique</option>
                <option id="SIRI" value="SIRI" {{$apprenant->filiere == "SIRI"? "selected":"" }}>Systèmes d'Information et Réseaux Informatiques</option>
            </select> <br>
            @endforeach
        @endif
   </form>

这将毫无问题地显示用户的记录属性。我的问题是我想显示密码但可读的密码:该$pass_etu = $request->input('password_etu');密码在他的邮件中发送给用户,以便他可以根据需要修改它。我不想使用密码重置。有没有办法将该变量作为全局变量并将其显示在我的视图中?

编辑

我知道出于某些安全目的,我不能尝试在应用程序内检索密码(作为可读密码)。我已经弄清楚了如何在未公开凭据和用户会话安全的情况下完成我想要的工作。

但是我想回到那个问题。如何从输入请求中返回多个视图变量? 实际上有没有办法从特定表单中获取输入数据,例如在视图中,并使该数据在所有其他视图中可用?根据文档,我们可以使用 AppServiceProvider 或视图 Composers将数据共享给所有视图。但我认为(我可能错了..)这是一些我们希望在某些视图中共享的“预设”数据。是否有可能从用户那里实际获取传入的请求数据并将其共享给所有人视图(数据库记录除外)。我不需要那个..但也许这种情况会以某种方式发生。如果您对如何做到这一点有任何想法,那么它的价值,很高兴分享它

标签: phplaravelinputviewrequest

解决方案


老实说,我会完全避免这种情况。

您永远不应以纯文本形式显示用户密码。使用 Laravel 您无法(默认情况下),它在将值存储在数据库中时会通过单向哈希。这意味着它不能返回到“可读”格式。

如果您确实想要这样做,您需要覆盖 Laravel 的身份验证方式,而不是散列密码,您需要加密密码。

真的不建议加密密码。如果有人得到密钥,他们可以解密所有用户的密码。这也意味着您有能力解密和查看用户密码——这是您不应该做的。

我还建议避免亲自向用户发送包含密码的电子邮件。


推荐阅读