موقع روابط إنترنيت بإستعمال phpixie framework الجزء الثالت

فهاد الجزء الثالت من موقع روابط إنترنيت بإستعمال phpixie framework غادي نكملو الملفات الخاصين بإضافة مستخدم فقاعدة البيانات وأيضا الملف لي غادي يمكن من تسجيل دخول وخروج مستخدم .

نظرة سريعة بالفيديو


1- الملف auth.php


فالمجلد assets/config كتزيد ملف جديد سميه auth.php هادا الملف لي غادي نعرفو فيه كيفاش المستخدم غادي يتكونيكطا فكنحددو بلي غادي نستعملو session باش نعقلو على المستخدم ملي يتكونيكطا وغادي يمكن للمستخدم يتكونيكطا بإستعمال كلمة المرور وهادشي la configuration ديال ل Framework يمكنلك تطلع عليها فالموقع الرسمي ديالهم ف https://phpixie.com/quickstart.html الكود ديال الملف هو :

                                    
                                        <?php

return [
    'domains' => [
        'default' => [

            // use the ORM user repository for users
            'repository' => 'framework.orm.user',

            // Here we define the ways that the users can login
            'providers'  => [

                // We need sessions to remember the user after login
                'session' => [
                    'type' => 'http.session'
                ],

                // Allow logging in with password
                'password' => [
                    'type' => 'login.password',

                    // after login persis the user in the session
                    'persistProviders' => ['session']
                ]
            ]
        ]
    ]
];
                                    
                                

2- الملف User.php


فالمجلد bundles/src/ORM كتزيد ملف جديد سميه User.php هادا الملف لي غادي يكون هو ل User Model ولي كي implementer واحد لinterface سميتها LoginUser وفيه fonction passwordHash لي كنسترجعو بها كلمة المرور المشفرة لي مسجلة فالجدول Users الكود ديال الملف هو :

                                    
                                        <?php
// /bundles/app/src/ORM/User.php
namespace Project\App\ORM;

use Project\App\ORM\Model\Entity;
/** This interface allows authorization using a password */
use PHPixie\AuthLogin\Repository\User as LoginUser;

/**
 * User Entity
 */
class User extends Entity implements LoginUser
{
    /**
     * Returns the user's password hash.
     * In our case it's just his 'passwordHash' field.
     * @return string|null
     */
    public function passwordHash()
    {
        return $this->getField('passwordHash');
    }
}
                                    
                                

3- الملف UserRepository.php


دائما فالمجلد bundles/src/ORM كتزيد مجلد جديد سميه User فيه زيد ملف جديد سميه UserRepository.php هادا الملف لي غادي يكون هو ل User Controller ولي كي implementer واحد لinterface سميتها LoginUserRepository وفيه fonction getById لي كنسترجعو بها مستخدم بالإعتماد على لid ديالو وfonction getByLogin لي كنسترجعو بها مستخدم بالإعتماد على لemail ديالو الكود ديال الملف هو :

                                      
                                        <?php
namespace Project\App\ORM\User;

use Project\App\ORM\Model\Repository;
use Project\App\ORM\User;
/** This interface allows authorization using a password */
use PHPixie\AuthLogin\Repository as LoginUserRepository;

/**
 * User Repository
 */
class UserRepository extends Repository implements LoginUserRepository
{
    /**
     * Finds a user by his id
     * @param mixed $id
     * @return User|null
     */
    public function getById($id)
    {
        return $this->query()
            ->in($id)
            ->findOne();
    }
    /**
     * Searches for a user by something that is considered his login.
     * In our case it is his email, but you can also search by multiple fields
     * to allow login with both email and username, etc.
     * @param mixed $login
     * @return User|null
     */
    public function getByLogin($login)
    {
        return $this->query()
            ->where('email', $login)
            ->findOne();
    }
}
                                      
                                    

4- الملف Auth.php الجزء الأول


فالمجلد bundles/app/src/HTTP كتزيد ملف جديد سميه Auth.php هاد ل controller فيه ل les fonctions لي غادي يمكنو من التعامل مع المستخدم فأولا كاين defaultAction لي كتحقق من form لي ترسلت من الملف login.php ولي غادي نزيدوه من بعد فيلا كانت لفورم register كنتحققو بلي valid منبعد كنخدمو بل fonction processRegister ولي يلا لقات الإمايل مستخدم من قبل كترجع رسالة خطأ مكانش كتسجل المستخدم كانت الفورم login كنتحققو بلي valid منبعد كنخدمو بل fonction processLogin ولي كتحقق واش فعلا كاين المستخدم مسجل كان كترجع true مكانش كترجع رسالة خطأ ثم كاين loginForm لي كتحقق بلي كل الحقول عامرة ثم كاين processLogin لي كيفما قلنا كتحقق واش فعلا كاين المستخدم مسجل كان كترجع true مكانش كترجع رسالة خطأ الكود ديال هاد الجزء الأول من الملف Auth.php هو:

                                        
                                            <?php

namespace Project\App\HTTP;

use PHPixie\AuthLogin\Providers\Password;
use PHPixie\HTTP\Request;
use PHPixie\Validate\Form;
use Project\App\ORM\User\UserRepository;
use PHPixie\App\ORM\User;

/**
 * Handles user sign in and registration
 */
class Auth extends Processor
{
    /**
     * Sign in page
     * @param Request $request HTTP request
     * @return mixed
     */
    public function defaultAction($request)
    {
        $components = $this->components();
        // Initialize the template, login and registration forms
        $template = $components->template()->get('app:login');
        $loginForm = $this->loginForm();
        $template->loginForm = $loginForm;
        $registerForm = $this->registerForm();
        $template->registerForm = $registerForm;
        // If the form was not submitted just render the page
        if($request->method() !== 'POST') {
            return $template;
        }
        $data = $request->data();
        // If we are processing registration
        if($data->get('register')) {
            $registerForm->submit($data->get());
            // If the form is valid and the user was registered then redirect to the frontpage
            if ($registerForm->isValid() && $this->processRegister($registerForm)) {
                $http = $this->builder->components()->http();
                $httpResponses = $http->responses();
                return $httpResponses->redirect('/');
            }
        } else {
            // Otherwise process login
            $loginForm->submit($data->get());
            // If the login form is valid and the user successfully logged in then redirect to the frontpage
            if($loginForm->isValid() && $this->processLogin($loginForm)) {
                $components = $this->components();
                $id = $request->attributes()->get('id');
                $user = $components->orm()->query('user')
                    ->where('id',$_SESSION['defaultUserId'])
                    ->findOne();
                $_SESSION['defaultUserId'] = $user->id;
                $_SESSION['username'] = $user->name;
                $http = $this->builder->components()->http();
                $httpResponses = $http->responses();
                return $httpResponses->redirect('/');
            }
        }
        // If there was no redirect just render the form
        return $template;
    }
    /**
     * Build the login form
     * @return Form
     */
    protected function loginForm()
    {
        $validate = $this->components()->validate();
        $validator = $validate->validator();
        // We use a document validator (it's the one you'll be using the most)
        $document = $validator->rule()->addDocument();
        // Both fields are required
        $document->valueField('email')
            ->required("Email est obligatoire.");
        $document->valueField('password')
            ->required("Passe est obligatoire.");
        // Wrap the validator inside a form
        return $validate->form($validator);
    }
    /**
     * Process login
     *
     * @param Form $loginForm
     * @return bool If the user was successfully logged in
     */
    protected function processLogin($loginForm)
    {
        // Try to sign in the user
        $user = $this->passwordProvider()->login(
            $loginForm->email,
            $loginForm->password
        );
        // If the sign in was not successful add an error to the form and return false
        if($user === null) {
            $loginForm->result()->addMessageError("Email ou mot de passe est incorrect");
            return false;
        }
        return true;
    }
                                        
                                    

كلمات مفاتيح :