دسته بندی :
تاریخ انتشار : ۱۴ اردیبهشت ۱۳۹۴
گردآوری و تالیف : حسام موسوی

کارمو با طراحی گرافیکی شروع کردم و حدود 2 سال طراحی گرافیکی میکردم بعد به طراحی وب علاقه پیدا کردم و همراه طراحی وب عاشق کدنویسی شدم به PHP | sass | css | Jquery | javaScript تسلط کامل دارم . در بین فریم ورک های PHP اول با CodeIgniter کار کردم اما به laravel علاقه مند شدم و دارم بطور حرفه ای دنبالش میکنم . امید من اینکه بتونم کاربرهای ایرانی رو به دنیای بیرون متصل کنم تا بتونن از فناوری های تازه آگاهی داشته باشن

با توجه به این که تعداد آموزش های فارسی لاراول در ایران خیلی کمه و تو دنیا لاراول مورد توجه خیلی از توسعه دهنده ها قرار گرفته ، به این صورت که لاراول در سال 2014 فریم ورک سال معرفی شده و کاربران زیاد سعی در یادگیری و استفاده از این فریم ورک php دارن . ما با خودمون فکر کردیم که یه آموزش برای ساخت یه وبلاگ ساده با استفاده از لاراول براتون آماده کنیم البته اگه چیزی در مورد لاراول نمیدونید تو پست های آینده در مورد این فریم ورک عالی صحبت میکنیم و اونو بطور کامل بهتون معرفی خواهیم کرد . با ما باشید . 

خب در این مقاله ما قصد داریم یه وبلاگ ساده با استفاده از laravel 5 ایجاد کنیم . وبلاگی که خواهان ایجاد اون هستیم دارای ویژگی های زیر می باشد : 

  • نمایش پست با لینک ادامه مطلب در صفحه اصلی.
  • قابلیت سرچ در پست های وبسایت توسط کاربر . 
  • نمایش یک پست کامل به همراه بخش نظرات .
  • مدیر توانایی درج ، حذف ، آپدیت و ویرایش پست ها و نظرات رو داشته باشه . 
  • مدیر توانایی جواب دادن نظرات در پنل مدیریت رو داره باشه .   

قدم اول : نصب و راه اندازی سریع laravel 5 

ما فرض رو بر این میزاریم که شما کاملا با نصب و راه اندازی laravel 5 آشنایی دارید و مشغول به کار با اونید اگه اینطوره نیاز به بخش زیر ندارید . در غیر این صورت میتونید بخش زیر رو دنبال کنید .

  • دستورالعمل نصب laravel 5 رو میتونید در این صفحه پیدا کنید : اینجا 
  • ساخت یه دیتابیس با استفاده از تریمنال mysql 
┌─[usm4n@usm4n-desktop]―[~]
└─•mysql -u root -p
Enter password: 
mysql> create database laravel;
Query OK, 1 row affected (0.00 sec)

 پیکربندی پایگاه داده اتون در بخش /config/database.php :

'mysql' => array(
    'driver'    => 'mysql',
    'host'      => 'localhost',
    'database'  => 'laravel',
    'username'  => 'root',
    'password'  => 'very_secret_password',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
),

ایجاد جداول مختلف با استفاده از Migrations : 

در این بخش ، ما جدول های پایگاه داده مورد استفاده در وبلاگمونو با استفاده از Migrations ایجاد میکنم . برنامه ما از جدول Posts و comments برای ارسال پست روی وبلاگ و بخش نظرات استفاده میکنه . (البته اگه اطلاع زیادی در مورد Migrations ندارید میتونید از این پست استفاده کنید تا باهاش آشنا بشین )

نکته سریع : ما از دستورات artisan migrate:make create_tablename_table و artisan migrate به ترتیب برای ایجاد Migrations و اجرایی اون Migrations  استفاده میکنیم . 

کلاس Migrations برای جدول Posts : 

<?php

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

class CreatePostsTable extends Migration
{

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->string('read_more');
            $table->text('content');
            $table->unsignedInteger('comment_count');
            $table->timestamps();
            $table->engine = 'MyISAM';
        });
        DB::statement('ALTER TABLE posts ADD FULLTEXT search(title, content)');
    }


    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('posts', function (Blueprint $table) {
            $table->dropIndex('search');
            $table->drop();
        });
    }

}

این کلاس در بخش /database/Migrations/ قرار میگیره . 

توجه داشته باشید که من با استفاده کردن از  $table->engine = 'MyISAM' و با اضافه کردن شاخص مرکب به ستون های title, content این قابلیتو ایجاد کردم که کاربر وقتی سرچ میکنه مطلب مورد نظرش هم تو متن و هم تو عنوان پست جستجو بشه . 

کلاس Migrations برای جدول comments

<?php

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

class CreateCommentsTable extends Migration
{

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('comments', function (Blueprint $table) {
            $table->increments('id');
            $table->unsignedInteger('post_id');
            $table->string('commenter');
            $table->string('email');
            $table->text('comment');
            $table->boolean('approved');
            $table->timestamps();
        });
    }

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

}

ما با ایجاد فیلد post_id این قابلتو برای خودمون ایجاد میکنیم که بتونیم بین دوتا جدول ارتباط ایجاد کنیم و با استفاده از Eloquent ORM به هدفه خودمون برسیم . و همینطور از فیلد approved برای تایید نظرات کاربرا توسط مدیر استفاده میکنیم که آیا نظر قابل مشاهده تو سایت هست یا خیر . البته یه جدول دیگه هم با اسم users و با استفاده از Migrations باید بسازین برای احراز هویت مدیر یا کاربراتون . که این جدول از قبل وقتی که پروژه laravel 5 رو نصب و راه اندازی کردین تو پروژه اتون قرار داده شده .

ایجاد Models با استفاده از Eloquent ORM : 

Eloquent ORM همراه با خود فریم ورک لاراول وجود داره و میتونه به سادگی و خیلی زیبا با استفاده از ActiveRecord با جداول پایگاه دادتون کار کنه و عملیات های مورد نظرتونو به بهترین وجه انجام بده . هر جدول که در پایگاه دادتون وجود داره دارای یه Model جدا در پروژتون می باشد که این باعث تعامل بهتر با جداول میشه . 

ما از اسم های ساده تری برای جدول ها بعنوان نام Eloqent Model استفاده میکنم . تا خوانایی کد ها بالا بره. این قرار داد کمک میکنه تا Eloquent بتونه به صورت جدول با  Model ارتباط برقرار کنه . برای مثال اگه اسم  Eloqent Model ما Post باشه ما از اسم جدول posts استفاده میکنیم . 

در زیر کد های بخش Post و Comment رو قرار میدیم : 

<?php
// file: app/Post.php
class Post extends Model {
 
    public function comments()
    {
        return $this->hasMany('Comment');
    }
 
}
// file: app/Comment.php
class Comment extends Model {
 
    public function post()
    {
        return $this->belongsTo('Post');
    }
}

نکته : کد های که تو کلاس این دو مدل استفاده شدن رو بعدا بهتون توضیح میدم که چیه فقط فعلا بدونین که اینا رو هم باید وارد کنید . 

وارد کردن اطلاعات به جداول دیتابیس با استفاده از Seeding : 

ما از یه کلاس به اسم PostCommentSeeder برای پر کردن جدول های posts و comments استفاده میکنیم . 

نکته سریع : برای اجرای Seed از کد php artisan db:seed در ترمینالمون استفاده کنید و اگه بازم اطلاعاتی در مورد Seeding ندارید تو پست های آینده بطور کامل توضیح میدیم که چیه و چیکار میکنه . 

کد PostCommentSeeder : 

 <?php

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
use App\post;
use App\Comment; 

class PostCommentSeeder extends Seeder {
 
    public function run()
    {
        $content = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
                    Praesent vel ligula scelerisque, vehicula dui eu, fermentum velit. 
                    Phasellus ac ornare eros, quis malesuada augue. Nunc ac nibh at mauris dapibus fermentum. 
                    In in aliquet nisi, ut scelerisque arcu. Integer tempor, nunc ac lacinia cursus, 
                    mauris justo volutpat elit, 
                    eget accumsan nulla nisi ut nisi. Etiam non convallis ligula. Nulla urna augue, 
                    dignissim ac semper in, ornare ac mauris. Duis nec felis mauris.';
        for( $i = 1 ; $i <= 20 ; $i++ )
        {
            $post = new Post;
            $post->title = "Post no $i";
            $post->read_more = substr($content, 0, 120);
            $post->content = $content;
            $post->save();
 
            $maxComments = mt_rand(3,15);
            for( $j = 1 ; $j <= $maxComments; $j++)
            {
                $comment = new Comment;
                $comment->commenter = 'xyz';
                $comment->comment = substr($content, 0, 120);
                $comment->email = 'xyz@xmail.com';
                $comment->approved = 1;
                $post->comments()->save($comment);
                $post->increment('comment_count');
            }   
        }
    }
}

for اول برای بوجود آوردن پست های مختلف بدونه نیاز به تنظیمات خاصیه . و حلفه داخلی هم مربوط به ایجاد کامنت برای اون پست در حال ساخت میشه . که کامنت های مختلفی رو برای پستها قرار میده . همچنین در حلقه داخلی بعد از به وجود امدن کامنت فیلد comment_count مربوط به پست اون کامنت رو یه واحد افزایش میده . 

استفاده از فرمان "artisan tinker" در ترمینال 

laravel با استفاده از این دستور یه ارتباط تعاملی آسان رو از طریق خط فرمان ترمینال با پروژه ایجاد میکنه که شما میتونید دستورات مختلف و جالبی رو تو خط فرمانتون استفاده کنید که اجازه بدید چند تا از این دستورات رو براتون مثال بزنم : 

┌─[usm4n@usm4n-desktop]―[~]
└─•artisan tinker
>

پیدا کردن یه آیدی با استفاده از find()

>$post = Post::find(2);
>$post->setHidden(['content','read_more','updated_at']);
>echo $post;
{"id":"2","title":"Post no 2","comment_count":"7","created_at":"2014-01-06 09:43:44"}

محدود کردن بازیابی رکورد ها با استفاده از take() و skip()  

>$post = Post::skip(5)->take(2)->get();
>foreach($post as $value) echo "post id:$value->id ";
post id:6 post id:7

استفاده از select() و first()

>$post = Post::select('id','title')->first();
>echo $post;
{"id":"1","title":"Post no 1"}

استفاده از where() با select()

>$post = Post::select('id','title')->where('id','=',10)->first();
>echo $post;
{"id":"10","title":"Post no 10"}

گرفتن خصوصیات یه فیلد کامنت از یه پست 

>$post = Post::find(4);
>echo $post->comments[0]->commenter;
xyz

خوب از شما ممنونم که تا اینجای این آموزش با ما بودید اگه نظر یا پیشنهاد برای بهتر شدن این سری آموزش دارید حتما با ما تو بخش نظرات در میون بزارید . 

امیدوارم مورد قبول شما قرار گرفته باشه انشالله هر چه زودتر بخش دوم رو هم قرار میدیم . 

برچسب : , ,

دیدگاه های مخاطبین

ثبت دیدگاه شما
  • sajad

    سلام ممنون بابت آموزش اما تمام لینک های صفحه مشکل دارن از جمله توضیح در مورد : Migrations

    • admin

      سلام چه مشکلی

  • sati

    سلام
    من یه سوال داشتم :
    قسمت اول اموزش کدها رو به صورت موازی پیش اومدم
    اما توی براوزر نمیدونم چه ادرسی رو وارد کنم که همان ایمیجی که شما روی سایت گذاشتین روی براوزر به نمایش در بیاد . ممنون میشم اگه راهنماییم کنین

    • admin

      فایل های استایل رو باید داشته باشین که به این صورت در بیاد
      این اموزش متنیه فایل های استایل در دسترس نیستن

  • نیما تهرانی

    با سلام
    اگه ممکنه تو همین آموزش یا یه آموزش جدا راهنمایی کنید که چطوری یک منوی داینامیک رو در مسترپیج سایت نشون بدیم که بصورت اتومات در همه صفحات نمایش پیدا کنه و نیاز به کنترلی برای اجرا نداشته باشه...

    یعنی قسمتی مشترک در تمام صفحات حالا میخواد منو باشه یا یک متغیر

    با تشکر

    • admin

      تو دوره ها در این باره صحبت کردم برای این کار میتونید از view composer یا view share استفاده کنید .
      https://laravel.com/docs/5.2/views#view-composers
      و
      https://laravel.com/docs/5.2/views#sharing-data-with-all-views

  • علی

    سلام
    برای ایجاد migration هائی که بالا توضیح دادید چه کار کنم ؟
    کد ها رو کپی کنم و یا از دستور php artisan make:migration استفاده کنم و سپس کدهای خودم را بر اساس کدهای شما ویرایش کنم ؟

    با تشکر ازشما

    • admin

      میتونید با دستور make:migrtion اول migration خودتون رو بسازید و بعد دستورات رو قرار بدین

  • سید محمد

    سلام
    صفحات ویو برای این آموزش موجود نیست؟
    همچنین شما آیا از بوت استرب برای استایل های قالب این آموزش استفاده کردید؟

    • admin

      موجود هست ولی فرصت نکردیم پست مربوط به ویو ها رو بزاریم انشالله در یک پست دیگه
      خیر از Foundation برای استایل دهی استفاده شده

  • amirhp

    سلام. کدهایی که قرار داده‌اید ناقصه، یعنی با کپی کردن همین‌ها اجرا نمیشه. مثل کدهای جداول. میشه لطفا این قسمت رو درست کنید؟

    • admin

      ممنون از اطلاع رسانیتون مشکل رفع شد .

  • سعیده

    با سلام و تشکر از شما من توی نصب composer مشکل دارم . تو مرحله آخر وقتی install رو می زنم این ارور رو می ده Some settings on your machine make Composer unable to work properly. Make sure that you fix the issues listed below and run this script again: The openssl extension is missing, which means that secure HTTPS transfers are impossible. If possible you should enable it or recompile php with --with-openssl

    • admin

      سلام . شما extension=php_openssl.dll فعال نیست برای فعلا کردنش لطفا به بخش php.ini برین و اگه این مقدارو پیدا کنید تو اون فایل و اگه سمیکالون رو به روش قرار داشت اون سمیکالون رو بردارید تا فعال بشه . فکر کنم با این کار مشکل حل بشه

  • محمدرضا

    باسلام لطفا این خط رو بیشتر توضیح بدید: DB::statement('ALTER TABLE posts ADD FULLTEXT search(title, content)'); به جدول پست یک فیلد اضافه میکنه از نوع fulltext؟؟ آخه syntax alter که اینجوری نیست!

    • admin

      سلام . ببینید این کد به جدول ستونی اضافه نمیکنه یک شاخص اضافه میکنه به اسم search که بعد بتونین برای جستجو در عنوان و متن پستتون ازش استفاده کنید

  • داوود

    سلام، ممنونم ازت. بسیار عالی بود.

  • soheyla

    خیلی ممنون خیلی خوبه که این کارو میکنین در down migrate برای posts table کد (table->dropIndex('search$ چه کاری میکنه

    • admin

      dropIndex برای حذف شاخص از جدولمونه !

  • علی محمدی

    خیلی ممنون به خاطر وقتی که گذاشتین و این آموزش رو تهیه کردین. منتظر بقیه آموزش هستیم.

    • admin

      ممنون از همراهیتون حتما تا چند روز آینده ادامه این سری رو قرار میدیم .

  • یوسف

    خیلی خوب کاری کردی لاراول رو یاد دادی.جاش خالی بود ادامه بده اموزش رو

پیشنهاد میکنیم این مطالب رو هم مطالعه کنید :