موقع تواصل إجتماعي بإستعمال laravel الجزء الأول

imadbelasri Laravel
LA

فهاد المشروع الجديد لي هو موقع تواصل إجتماعي بإستعمال laravel غادي نشوفو كيفاش نقادو موقع تواصل على شكل فيسبوك ماشي فيسبوك كامل ولكن غادي نعرفو la base باستعمال laravel غادي يكون عند المستخدم الإمكانية ديال النشر إضافة أصدقاء وغيرها من الإمتيازات المشروع كيطلب معرفة مسبقة بأساسيات laravel.


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


1- تحميل المشروع

أول شيء غادي تديرو هو تثبيت composer لي غادي يمكنك من تثبيت laravel يمكنلك تبحث عليه فغوغل وتحملو من الموقع الرسمي من بعد غادي تفتح cmd غادي نكتب الأمر cd c:/wamp/www من بعد غادي تديرالأمر composer create-project --prefer-dist laravel/laravel laravel_social الإسم ديال المشروع هو laravel_social من بعد ما يتزاد المجلد فwamp/www غادي تزيد قاعدة بيانات ف phpmyadmin وتسميها chat_plus الكود ديالها هو :

                                                    
                                                        --
-- Structure de la table `friends`
--

CREATE TABLE IF NOT EXISTS `friends` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `friend_id` int(11) NOT NULL,
  `accepted` tinyint(1) NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=0 ;

--
-- Structure de la table `likes`
--

CREATE TABLE IF NOT EXISTS `likes` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `publication_id` int(11) NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `likes_user_id_index` (`user_id`),
  KEY `likes_post_id_index` (`publication_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=0 ;

--
-- Structure de la table `migrations`
--

CREATE TABLE IF NOT EXISTS `migrations` (
  `migration` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `batch` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Structure de la table `password_resets`
--

CREATE TABLE IF NOT EXISTS `password_resets` (
  `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `token` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `created_at` timestamp NOT NULL,
  KEY `password_resets_email_index` (`email`),
  KEY `password_resets_token_index` (`token`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Structure de la table `publications`
--

CREATE TABLE IF NOT EXISTS `publications` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `parent_id` int(11) DEFAULT NULL,
  `body` text COLLATE utf8_unicode_ci NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `publications_user_id_index` (`user_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=0 ;

--
-- Structure de la table `replies`
--

CREATE TABLE IF NOT EXISTS `replies` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `publication_id` int(11) NOT NULL,
  `body` text COLLATE utf8_unicode_ci NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `replies_user_id_index` (`user_id`),
  KEY `replies_publication_id_index` (`publication_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=0 ;

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

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `pseudo` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `password` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `nom` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `prenom` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `ville` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `pays` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `remember_token` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `users_pseudo_unique` (`pseudo`),
  UNIQUE KEY `users_email_unique` (`email`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=0 ;
                                                    
                                                

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

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

                                                        
                                                            DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=chat_plus
DB_USERNAME=root
DB_PASSWORD=
                                                        
                                                    

3- الملف HomeController.php

من بعد كانزيد ل Controller ديال الصفحة الرئيسية لي كيمكن من عرض المنشورات لي عندنا فقاعدة البيانات فكنمشي ل app/Http/Controllers كنزيد ملف جديد كنسميه HomeController.php لي غادي تكون فيه fonction index لي كتمكن من بعد مكتحقق واش المستخدم مكونيكطي من استرجاع كل المنشورات لي كاينين فقاعدة البيانات وكتعطيهم للملف timeline لي غادي نزيدوه من بعد مكانش مكونيكطي كتوجهو للملف index ولي حتى هو غادي نزيدوه من بعد الكود ديال الملف هو :

                                                        
                                                            <?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Auth;
use App\Http\Requests;
use App\Publication;
class HomeController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        if(Auth::check()){
            $pubs = Publication::orderBy('created_at','desc')->paginate(10);
            return view('timeline',compact('pubs'));            
        }
        return view('index');
    }
}

                                                        
                                                    

4- الملف Publication.php

من بعد ف app كنزيد ملف كنسميه Publication.php هادا لي غادي يمكني باش ندير les relations ما بين جدول المنشورات والجداول الأخرى فعندنا ()user لي كتقول بان كل منشور كيرجع للمستخدم وكاين ()replies لي كتقول بان كل منشور عندو بزاف ديال التعليقات وكاين () likes لي كتقول بان كل منشور عندو بزاف ديال الإعجابات الكود ديال الملف هو :

                                                        
                                                            <?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Publication extends Model
{
    //
    public $fillable = ['body'];
    public function user(){
        return $this->belongsTo('App\User');
    }
    public function replies(){
        return $this->hasMany('App\Reply');
    }
    public function likes(){
        return $this->hasMany('App\Like');
    }
}

                                                        
                                                    

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

فالمجلد views كنزيد ملف جديد كنسميه timeline.blade.php وفيه غادي تكون الفورم لي كتمكن من إضافة منشور ثم كيتحقق من أن ل pubs لي جاونا من لHomeController.php كاينين فكنخدم ب foreach وكنعرض كل publication مرفوقة بالإسم ديال المستخدم والتاريخ ثم كنخدم بreplies لي عندي فل model Publication.php وكنجبد التعاليق ديال كل منشور عندي وفالأخير كاين ل form لي كيمكن من إضافة تعليق الكود ديال الملف هو :

                                                        
                                                            @extends ('layouts.includes.main-index')
@section('content')
    <div class="row">
        <div class="col-md-8 col-md-offset-3">
            <div class="row">
                <div class="col-md-10">
                    <div class="panel panel-default">
                        <form action="{{route('post.add')}}" method="post" class="form-vertical">
                            <div class="form-group">
                                <textarea rows="2" name="status" class="form-control{{$errors->has('status') ? ' bordered' : ''}}" placeholder="Publier"></textarea>
                                    @if($errors->has('status'))
                                    <span style="color:red">{{$errors->first('status')}}</span>
                                    @endif
                            </div>
                            <div class="form-group">
                                <input type="submit" name="submit" class="btn btn-success" value="Publier">
                            </div>
                            <input type="hidden" name="_token" value="{{Session::token()}}"/>
                        </form>
                    </div>
                </div>
            </div>
            <div class="row">
                @if($pubs->count() != 0)
                <div class="col-md-10">
                    <div class="panel panel-default">
                    @foreach($pubs as $pub)
                    <div class="media">
                        <a href="{{route('users.profile',['username'=>$pub->user->pseudo])}}" class="pull-left">
                            <div class="media-object">
                                <img src="{{$pub->user->getImage()}}" class="thumbnail" alt="$pub->user->pseudo">
                            </div>
                        </a>
                        <div class="media-body">
                            <h4 class="media-heading"><a href="{{route('users.profile',['username'=>$pub->user->pseudo])}}">{{$pub->user->pseudo}}</a></h4>
                            <p>{{$pub->body}}</p>
                            <p>
                                <span class="text-success">{{$pub->created_at->diffForHumans()}} |</span>
                                <span><a href="{{route('post.like',['id'=>$pub->id])}}">like</a> |</span>
                                <span class="text-danger">{{$pub->likes->count()}} likes</span>
                            </p>
                            @foreach($pub->replies as $reply)
                            <div class="media">
                                <a href="{{route('users.profile',['username'=>$reply->user->pseudo])}}" class="pull-left">
                                    <div class="media-object">
                                        <img src="{{$reply->user->getImage()}}" class="thumbnail" alt="$reply->user->pseudo">
                                    </div>
                                </a>
                                <div class="media-body">
                                    <h4 class="media-heading"><a href="{{route('users.profile',['username'=>$pub->user->pseudo])}}">{{$reply->user->pseudo}}</a></h4>
                                    <p>{{$reply->body}}</p>
                                    <p>
                                    <span>{{$reply->created_at->diffForHumans()}}</span>
                                    </p>
                                </div>
                            </div>
                            @endforeach
                            <div>
                                <form action="{{route('post.reply',['postId'=>$pub->id])}}" method="post" class="form-vertical">
                                    <div class="form-group">
                                        <textarea rows="1" name="reponse-{{$pub->id}}" class="form-control{{$errors->has('reponse') ? ' bordered' : ''}}" placeholder="Répondre"></textarea>
                                            @if($errors->has("reponse-{$pub->id}"))
                                            <span style="color:red">{{$errors->first("reponse-{$pub->id}")}}</span>
                                            @endif
                                    </div>
                                    <div class="form-group">
                                        <input type="submit" name="submit" class="btn btn-default" value="Répondre">
                                    </div>
                                    <input type="hidden" name="_token" value="{{Session::token()}}"/>
                                </form>
                            </div>
                        </div>
                    </div>
                    <hr>
                    @endforeach
                    </div>
                    </div>
                @else
                    <p class="alert alert-info">Aucune Publication</p>
                @endif
            </div>
        </div>
    </div>
@endsection
@section('script')
@endsection