blog احترافي ب laravel 5.4 الجزء الأول

فهاد المشروع الجديد غادي نشوفو كيفاش نقادو واحد الblog احترافي بإستعمال laravel 5.4 فل blog غادي يمكن الأدمن من إضافة des posts ولي غادي يكون عندو الصلاحية ديال التعديل والحدف ديالهم وأيضا غادي يكون بإمكان المستخدمين العاديين مشاهدة المقالات والتعليق عليها بالإضافة للعديد من المزايا الأخرى لي غادي نشوفوها فالأجزاء الكاملة ديال ل blog ديالنا.

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


1- إنشاء قاعدة البيانات


أول شيء غادي تديرو هو تثبيت composer لي غادي يمكنك من تثبيت laravel يمكنلك  تحملو من الموقع الرسمي من هنا من بعد غادي تفتح cmd غادي نكتب الأمر:
cd c:\xampp\htdocs يلا كنتي خدام ب xampp
كنتي خدام ب wamp غادي نكتب الأمر:
cd c:\wamp\www من بعد غادي تديرالأمر
composer create-project --prefer-dist laravel/laravel blog-pro
الإسم ديال المشروع هو blog-pro  من بعد ما يتزاد المجلد ف wamp/www أو xampp/htdocs غادي تزيد قاعدة بيانات ف phpmyadmin وتسميها blog فيها les tables suivantes categories,posts,post_tag,users,profiles,tags الكود ديالهم هو :

                                    
                                        --
-- Structure de la table `categories`
--

CREATE TABLE `categories` (
  `id` int(10) UNSIGNED NOT NULL,
  `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Structure de la table `posts`
--

CREATE TABLE `posts` (
  `id` int(10) UNSIGNED NOT NULL,
  `title` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `body` text COLLATE utf8mb4_unicode_ci NOT NULL,
  `image` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `slug` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `deleted_at` timestamp NULL DEFAULT NULL,
  `category_id` int(10) UNSIGNED NOT NULL,
  `user_id` int(10) UNSIGNED NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Structure de la table `post_tag`
--

CREATE TABLE `post_tag` (
  `id` int(10) UNSIGNED NOT NULL,
  `post_id` int(10) UNSIGNED NOT NULL,
  `tag_id` int(10) UNSIGNED NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Structure de la table `profiles`
--

CREATE TABLE `profiles` (
  `id` int(10) UNSIGNED NOT NULL,
  `user_id` int(11) NOT NULL,
  `image` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'avatar.png',
  `facebook` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'facebook.com',
  `youtube` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'youtube.com',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Structure de la table `tags`
--

CREATE TABLE `tags` (
  `id` int(10) UNSIGNED NOT NULL,
  `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Structure de la table `users`
--

CREATE TABLE `users` (
  `id` int(10) UNSIGNED NOT NULL,
  `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `email` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `password` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `is_admin` tinyint(1) NOT NULL DEFAULT '0',
  `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Index pour la table `categories`
--
ALTER TABLE `categories`
  ADD PRIMARY KEY (`id`);
--
-- Index pour la table `posts`
--
ALTER TABLE `posts`
  ADD PRIMARY KEY (`id`),
  ADD KEY `posts_category_id_index` (`category_id`),
  ADD KEY `posts_user_id_index` (`user_id`);

--
-- Index pour la table `post_tag`
--
ALTER TABLE `post_tag`
  ADD PRIMARY KEY (`id`),
  ADD KEY `post_tag_post_id_index` (`post_id`),
  ADD KEY `post_tag_tag_id_index` (`tag_id`);

--
-- Index pour la table `profiles`
--
ALTER TABLE `profiles`
  ADD PRIMARY KEY (`id`);

--
-- Index pour la table `tags`
--
ALTER TABLE `tags`
  ADD PRIMARY KEY (`id`);

--
-- Index pour la table `users`
--
ALTER TABLE `users`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `users_email_unique` (`email`);

--
-- AUTO_INCREMENT pour la table `categories`
--
ALTER TABLE `categories`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;

--
-- AUTO_INCREMENT pour la table `posts`
--
ALTER TABLE `posts`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;

--
-- AUTO_INCREMENT pour la table `post_tag`
--
ALTER TABLE `post_tag`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;
--
-- AUTO_INCREMENT pour la table `profiles`
--
ALTER TABLE `profiles`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;
--
-- AUTO_INCREMENT pour la table `tags`
--
ALTER TABLE `tags`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;
--
-- AUTO_INCREMENT pour la table `users`
--
ALTER TABLE `users`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;
                                    
                                

2- الإتصال بقاعدة البيانات


من بعد فالملف env. لي فالمجلد الرئيسي ديال المشروع كنظيف عليه التغييرات لي غادي يمكنو باش نتصل بقاعدة البيانات الكود لي تغير هو :

                                    
                                        DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=blog
DB_USERNAME=root
DB_PASSWORD=''
                                    
                                

3- الملف UsersController.php


كنمشي ل app/Http/Controllers كنزيد ملف جديد كنسميه UsersController.php لي غادي تكون فيه fonction index لي كتوجه الأدمن للملف الرئيسي ديال المستخدمين ولي غادي يكون فالمجلد أدمين لي غادي نزيدوه من بعد fonction create لي كتوجه المستخدم لملف التسجيل لي غادي نزيدوه من بعد منبعد كاين fonction store لي كتحقق من أن الحقول لي ترسلو من الملف register.blade.php مملوئين ثم كنسجل مستخدم جديد فقاعدة البيانات منبعد كاين  edit لي كتوجه المستخدم للملف profile ولي كيمكن من تعديل ل profile ديالو من بعد كاين destroy لي كتمكن الأدمن من حدف مستخدم اختارو بإستعمال ل id ديالو منبعد كاين login  لي فقط كتوجه المستخدم للملف الخاص بتسجيل الدخول ثم كاين auth لي كتحقق من أن الحقول لي ترسلو من الملف login.blade.php مملوئين منبعد كتدير محاولة دخول بالإمايل وكلمة المرور لي دخل المستخدم يلا تمت بنجاح كترجعو للصفحة الرئيسية متمتش كتعرض رسالة خطأ من بعد كاين logout لي فقط كتمكن المستخدم باش يديكونيكطا من بعد كاين addAdmin لي كتمكن الأدمن من إضافة أدمين آخر منبعد كاين removeAdmin لي كتمكن الأدمن من حدف أدمين آخرالكود ديال الملف هو :


                                      
                                        <?php

namespace App\Http\Controllers;
use App\User;
use Illuminate\Http\Request;
use Auth;
use App\Profile;
class UsersController extends Controller
{
    public function __construct(){
        //$this->middleware('admin');
    }
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
        return view('admin.users.index')->with(['users'=>User::all()]);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
        return view('users.register');
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
        $this->validate($request,[
            'name'=>'required',
            'email'=>'required|email',
            'password'=>'required'
        ]);
        $user = new User();
        $user->name = $request->name;
        $user->email = $request->email;
        $user->password = bcrypt($request->password);
        $user->save();
        Profile::create([
            'user_id'=>$user->id
        ]);
        return redirect()->route('index')->with(['success'=>'Compte crée']);
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
        return view('users.profile');
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
        $user = User::find($id);
        $user->profile->delete();
        $user->delete();
        return redirect()->route('users.index')->with(['success'=>'Utilisateur supprimé avec succés']);
    }
    public function login(){
        return view('users.login');
    }
    public function auth(Request $request){
        $this->validate($request,[
            'email'=>'required|email',
            'password'=>'required'
        ]);
        if(Auth::attempt(['email'=>$request->email,'password'=>$request->password])){
              return redirect()->route('index')->with(['success'=>'Vous êtes connectés']);
        }else{
              return redirect()->route('index')->with(['fail'=>'Email ou mot de passe est incorrect']);
        }
    }
    public function logout(){
        Auth::logout();
        return redirect()->route('index')->with(['info'=>'Vous êtes déconnecté']);
    }
    public function addAdmin($id){
        $user = User::find($id);
        $user->is_admin = 1;
        $user->update();
        return redirect()->route('users.index')->with(['info'=>$user->name.' désigné admin']);
    }
    public function removeAdmin($id){
        $user = User::find($id);
        $user->is_admin = 0;
        $user->update();
        return redirect()->route('users.index')->with(['info'=>$user->name.' retiré de la liste des admins']);
    }
}

                                      
                                    

4- الملف User.php


من بعد فالمجلد app كنزيد ملف كنسميه User.php هادا لي غادي يمكني باش ندير les relations ما بين جدول المستخدمين والجداول الأخرى فكاين fonction posts لي كتقولنا بلي المستخدم عندو post ولا بزاف ديال les posts منبعد كاين profile لي كتقولنا بلي كل مستخدم عندو profile واحد الكود ديال الملف هو :

                                        
                                            <?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];
    public function posts(){
        return $this->hasMany('App\Post');
    }
    public function profile(){
        return $this->hasOne('App\Profile');
    }
}

                                        
                                    

5- الملف register.blade.php


منبعد ف views كنزيد مجلد جديد كنسميه users فيه زيد ملف جديد سميه register.blade.php هادا الملف لي غادي يمكن المستخدم من التسجيل من بعد ما كيدخل المعلومات ديالو فل form ثم كترسل للfonction store لي ف UsersController الكود ديال الملف هو :

                                        
                                            @extends('layouts.app-layout')

@section('styles')

@endsection

@section('header')
  @include('includes.header')
@endsection

@section('content')
    <div class="row">
        <div class="col-md-6 col-md-offset-3">
            <h1 class="text-primary">
                Inscription
            </h1>  
            <form action="{{route('users.store')}}" method="post" class="form-vertical">
            {{csrf_field()}}
                <div class="form-group">
                    <label for="title">Nom & Prénom*</label>
                    <input type="text" class="form-control" name="name" id="name" placeholder="Nom & Prénom">
                </div>
               <div class="form-group">
                    <label for="title">Email*</label>
                    <input type="text" class="form-control" name="email" id="email" placeholder="Email">
                </div>
                <div class="form-group">
                    <label for="title">Mot de passe*</label>
                    <input type="password" class="form-control" name="password" id="password" placeholder="Passe">
                </div>
                <div class="form-group">
                    <button class="btn btn-success" type="submit" name="submit">Inscription</button>
                </div>
            </form>  
        </div>
    </div>
@endsection

@section('footer')
  @include('includes.footer')
@endsection

@section('scripts')

@endsection

                                        
                                    

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