اكتشف إطار PHP Laravel


الدرس: الاعدادات والجلسات


الصفحة السابقة
في هذا الفصل ، سنرى تهيئة وإدارة الجلسات بمثال بسيط لإرسال ملفات الصور وحفظها في مجلد من نموذج.

الاعدادات و الجلسات (CONFIGURATION AND SESSIONS)


الإعدادات
كل شيء عن اعدادات Laravel يمكن العثور عليه في المجلد config :
framework Laravel MVC
مجلد الاعدادات
لقد أتيحت لنا بالفعل فرصة للعمل على ملف اعداد البريد الإلكتروني. تحتوي ملفات الاعدادات بالفعل على صفيف به مفاتيح وقيم. على سبيل المثال للعرض

<?php
'paths' => [
    realpath(base_path('resources/views'))
],
لدينا المفتاح "paths" و القيمة "realpath(base_path('resources/views'))" . لاسترداد قيمة ما عليك سوى استخدام مفتاحها مع الواجهة Config والأسلوب get :

<?php
Config::get('view.paths');
نستخدم اسم الملف ( view) واسم المفتاح ( paths) مفصولين بنقطة.
يوجد أيضًا مساعد لتبسيط بناء الجملة:

<?php
config('view.paths');
يمكننا تحديد قيمة بالمثل:

<?php
Config::set('view.paths', [base_path().'/mes_vues']);
إذا قمت بهذا بالفعل mes_vues ، فبدلاً من البحث عنها في المجلد ، resources/views  سيتم البحث عنها في المجلد mes_vues .
يمكنك أيضًا تعيين قيمة باستخدام المساعد عن طريق تمرير صفيف كمُدخل:

<?php
config('view.paths' => [base_path().'/mes_vues']);
يمكنك بوضوح إنشاء ملفات الاعدادات الخاصة بك. على سبيل المثال في هذا الفصل ، سنحتاج إلى استخدام الاعدادات. نظرًا لأن تطبيقنا يجب أن يحفظ ملفات الصور في مجلد ، يجب أن نحدد موقع واسم هذا المجلد الوجهة. لذلك سننشئ ملفًا images.php :
framework Laravel MVC
ملف اعدادات الصورة
في هذا الملف سوف نحدد مسار المجلد:

<?php
return ['path' => 'uploads'];
طالما نقوم أيضًا بإنشاء المجلد المقابل:
framework Laravel MVC
المجلد للصور
الجلسات sessions
تسمح واجهة  Laravel بإدارة مبسطة للجلسات . Session يمكنك بالتالي إنشاء متغير جلسة:

<?php
Session::put('clef', 'valeur');
هناك أيضًا مساعد ، لذلك نحصل على نفس النتيجة مع:

<?php
session(['clef' => 'valeur']);
يمكنك أيضًا استرداد قيمة من مفتاحها:

<?php
$valeur = Session::get('clef');
الذي يعطي مع المساعد:

<?php
$valeur = session('clef');
من المفيد غالبًا (سيكون هذا هو الحال بالنسبة لمثالنا) معرفة ما إذا كان هناك مفتاح معين موجود في الجلسة:

<?php
if (Session::has('error'))
أو مع المساعد:

<?php
if (session()->has('error'))
تبقى هذه المعلومات لنفس العميل من خلال طلباتهم. يعتني Laravel بهذه المعلومات ، فنحن نقول له فقط زوجًا ذا قيمة رئيسية وهو يعتني بكل شيء. هذا هو ما سنراه في هذا الفصل.
هذه ليست سوى الطرق الأساسية للجلسات المفيدة لمثالنا ، وسوف تجد جميع المعلومات الإضافية في الوثائق.

طلب النموذج


سنظل بحاجة إلى طلب نموذج للتحقق من صحته. كما رأينا سابقا ، نستخدم أمر Artisan لإنشائه:

php artisan make:request ImagesRequest
Request created successfully.
نجد الملف مرتبًا:
framework Laravel MVC
طلب نموذج للصور
وبالتالي نكمل الكود:

<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;

class ImagesRequest extends Request {

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return  bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return  array
     */
    public function rules()
    {
        return ['image' => 'required|image'];
    }

}
قاعدتان فقط للمجال image  :
  • الحقل إلزامي ( required) ،
  • يجب أن تكون صورة ( image) .
الآن التحقق من صحة البيانات لدينا جاهز.

الطرق والتحكم


سنحتاج إلى طريقين:

<?php
Route::get('photo', 'PhotoController@getForm');
Route::post('photo', 'PhotoController@postForm');
يسمى جهاز التحكم لدينا PhotoController، وهنا هو الكود:

<?php

namespace App\Http\Controllers;

use App\Http\Requests\ImagesRequest;

class PhotoController extends Controller 
{

    public function getForm()
    {
        return view('photo');
    }

    public function postForm(ImagesRequest $request)
    {
        $image = $request->file('image');

        if($image->isValid())
        {
            $chemin = config('images.path');

            $extension = $image->getClientOriginalExtension();

            do {
                $nom = str_random(10) . '.' . $extension;
            } while(file_exists($chemin . '/' . $nom));

            if($image->move($chemin, $nom)) {
                return view('photo_ok');
            }
        }

        return redirect('photo')
            ->with('error','Désolé mais votre image ne peut pas être envoyée !');
    }

}
لذلك على مستوى عنوان url :
  • لذلك على مستوى عنوان url :
  • http://monsite.fr/photo  مع الفعل get  لطلب النموذج ،
  • http://monsite.fr/photo  مع الفعل post  لتقديم النموذج وإرسال ملف الصورة المرتبطة.
فيما يتعلق بمعالجة التقديم ، لاحظت أننا نستعيد مسار مجلد التسجيل الذي قدمناه في الاعدادات:

<?php
$chemin = config('images.path');
لاستعادة الملف المرسل ، استخدمت الطلب والأسلوب file :

<?php
$image = $request->file('image');
لاستعادة الامتداد الأصلي ، نستخدم الطريقة getClientOriginalExtension  التي تعد واحدة من الطرق Symfony\Component\HttpFoundation\File,  مثل الطريقة isValid  التي تسمح لنا بالتحقق من صلاحية الملف.
نقوم بإنشاء اسم عشوائي باستخدام المساعد str_random  عن طريق تحديد 10 أحرف ونتحقق من أن الاسم لم يتم أخذه بالفعل (والذي سيكون حظًا سيئًا جدًا!).
أخيرًا ، نحفظ الصورة بالطريقة move . إذا سارت الامور بشكل جيد نُرجع العرض  photo_ok . وإلا ، فإننا نعيد توجيه ( redirect) إلى عنوان url photo مع توفير في الجلسة( with) متغير  error  بقيمة "عذرًا ، لا يمكن إرسال صورتك!".

العرض


سوف نستخدم القالب من الفصول السابقة ( resources/views/template.blade.php) :

<!DOCTYPE html>
<html lang="fr">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Mon joli site</title>
        {!! Html::style('https://netdna.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css') !!}
        {!! Html::style('https://netdna.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css') !!}
        <!--[if lt IE 9]>
            { { Html::style('https://oss.maxcdn.com/libs/html5shiv/3.7.2/html5shiv.js') }}
            { { Html::style('https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js') }}
        <![endif]-->
        <style> textarea { resize: none; } </style>
    </head>
    <body>
        @yield('contenu')
    </body>
</html>
فيما يلي طريقة العرض للنموذج ( resources/views/photo.blade.php) :

@extends('template')

@section('contenu')
    <br>
    <div class="col-sm-offset-4 col-sm-4">
        <div class="panel panel-info">
            <div class="panel-heading">Envoi d'une photo</div>
            <div class="panel-body"> 
                @if(session()->has('error'))
                    <div class="alert alert-danger">{!! session('error') !!}</div>
                @endif
                {!! Form::open(['url' => 'photo', 'files' => true]) !!}
                    <div class="form-group {!! $errors->has('image') ? 'has-error' : '' !!}">
                        {!! Form::file('image', ['class' => 'form-control']) !!}
                        {!! $errors->first('image', '<small class="help-block">:message</small>') !!}
                    </div>
                    {!! Form::submit('Envoyer !', ['class' => 'btn btn-info pull-right']) !!}
                {!! Form::close() !!}
            </div>
        </div>
    </div>
@endsection
مع هذا الجانب:
framework Laravel MVC
النموذج
يطرح هذا العرض إمكانية Blade لم نواجهها بعد ، وهي استخدام الشروط:

@if(session()->has('error'))
    <div class="alert alert-danger">{ { session('error') }}</div>
@endif
نحن هنا نختبر @if وجود مفتاح "error" في الجلسة. إذا كان هذا المفتاح موجودًا ، فسيظهر شريط تنبيه مع النص الموجود في الجلسة ، ويتم استرداده بواسطة المساعد session . لاحظ أيضًا كيف يتم إنشاء النموذج:

Form::open(['url' => 'photo', 'files' => true])
ستؤدي إضافة السمة files بالقيمة true إلى ظهور نوع mime اللازم لربط ملف أثناء الإرسال:

enctype="multipart/form-data"
في حالة حدوث خطأ في التحقق من الصحة ، يتم عرض الرسالة وتُحول حد الحقل إلى اللون الأحمر:
framework Laravel MVC
خطأ في التحقق
في حالة وجود مشكلة في حفظ الملف ، يتم إرجاع رسالة عبر الجلسة وعرضها في شريط التنبيه:
framework Laravel MVC
خطأ في تخزين الملفات
وإليك طريقة تأكيد الإرجاع ( app/views/photo_ok.blade.php) :

@extends('template')

@section('contenu')
    <br>
    <div class="col-sm-offset-3 col-sm-6">
        <div class="panel panel-info">
            <div class="panel-heading">Envoi d'une photo</div>
            <div class="panel-body"> 
                Merci. Votre photo à bien été reçue et enregistrée.
            </div>
        </div>
    </div>
@endsection
مع هذا الجانب:
framework Laravel MVC
عرض التأكيد
ونجد عادةً الملف مرتبًا في المجلد المتوقع:
framework Laravel MVC
الملف في المجلد المتوقع
هنا هو مخطط التشغيل:
framework Laravel MVC
مخطط التشغيل

في الخلاصة


  • تسهِّل ملفات الاعدادات تخزين مجموعات قيمة المفاتيح وتتم إدارتها بواسطة الجهة الأمامية Config  أو المساعد config .
  • تخزن الجلسات معلومات حول عميل ويمكن معالجتها بسهولة من الواجهات Session  أو مع المساعد session .