آموزش کامل ساخت وبلاگ با لاراول 5
قبل از اینکه به سراغ آموزش ساخت وبلاگ به کمک فریم ورک لاراول برویم، ابتدا قصد دارم این فریم ورک را به طور خلاصه و مفید خدمت شما عزیزان معرفی کنم و بعد از آن آموزش را شروع خواهیم کرد.
معرفی لاراول
لاراول Laravel فریم ورک توسعه و طراحی سایت اینترنتی می باشد که در زمان و هزینه شما صرفه جویی می نماید و توسعه وبسایت را بسیار ساده می سازد. Laravel در زمان پیدایش خود جامعه کاربری PHP را تحت تاثیر خود قرار داد و برای خود جایگاه ویژه ای در بین فریم ورک های PHP باز نمود و آن نیز به دلیل سادگی و سرعت بالای توسعه وب سایت توسط این فریم ورک می باشد.
در حقیقت توسط Laravel می توانید برنامه های وب را با سریعترین و با کیفیت ترین راه پیاده سازی نمایید. با توجه بخش های بسیاری در وب تکرای می باشند و نیازی به پیاده سازی مجدد ندارند لاراول Laravel به شما امکان تمرکز بیشتر بر قسمت هایی از نرم افزار را می دهد که هم اکنون وجود ندارد و جزو بخش های جدید می باشد و این فریم ورک به شما امکان استفاده از میانبرها برای پیاده سازی بخش های تکراری برنامه وب را می دهد که با استفاده از آنها و اضافه نمودن کدهای جدید می توانید به راحتی برنامه مورد نیاز خود را پیاده سازی نمایید.
سیاست لاراول Laravel
لاراول قصد دارد به برنامه نویسان این امکان را دهد تا در محیطی متمایز و ساده و بدون نیاز به درگیر شدن در کدهای پیش پا افتاده و ساده به توسعه بخش های مهم وب سایت خود بیندیشند و بدین وسیله سرعت و بازده پیاده سازی یک برنامه تحت وب را بالا می برد.
فریم ورک چیست؟
لاراول Laravel یکی از جدیدترین فریم ها برای توسعه وب سایت می باشد اما خود فریم ورک به چه معنا می باشد. فریم ورک بستری می باشد که به شما امکان استفاده از کدهای از پیش ساخته شده را می دهد و هدف اصلی فریم ورک ها آسان نمودن برنامه نویسی و دوری از کد نویسی های تکراری می باشد.
ویژگی های لاراول Laravel
- سیستم روتینگ ساده : با استفاده از سیستم روتینگ بسیار ساده می توانید کلیه درخواست را در برنامه به سادگی پاسخ دهید.
- مدیریت داده ها : انتقال و مدیریت داده ها در این سیستم بسیار آسان می باشد و با دیتابیس های MySQL, Postgres, SQL Server, و SQLit سازگاری کامل دارد.
- قالب زیبا : می توانید از کدهای پایه PHP استفاده نمایید و یا از قالب های کد فریم ورک بهره ببرید که کار را بسیار ساده تر می نماید.
- آماده برای آینده : این فریم ورک برای توسعه در آینده بهینه سازی شده و با JSON و سایر ابزارها سازگاری کامل دارد.
- پایه مستحکم : لاراول توسط کامپوننت های مختلف Symfony پیاده سازی شده است که به برنامه شما پایداری و ثبات بالایی می دهد.
- ایجاد شده توسط Composer : Composer یکی از ابزارهای بسیار جالب برای توسعه برنامه ها می باشد که می توانید از ابزارهای قدرتمند آن بهره بگیرید.
- اجتماع بزرگ : امروزه جامعه کاربری بسیار بزرگی از لاراول استفاده می نمایند و پشتیبانی و فایل های آموزشی بسیاری برای آن وجود دارد.
ساخت وبلاگ با لاراول :
با توجه به اینکه تعداد آموزش های فارسی لاراول در ایران خیلی کم می باشد و لاراول در دنیا مورد توجه خیلی از توسعه دهنده ها قرار گرفته است و به این دلیل که این فریم ورک در سال ۲۰۱۴ معرفی شده و کاربران بسیاری تاکنون سعی در یادگیری و استفاده از این فریم ورک php دارند، من تصمیم گرفتم یک آموزش برای ساخت وبلاگ ساده با استفاده از لاراول برای شما عزیزان آماده کنم.
در این مقاله از داناپ قصد داریم با استفاده از laravel ۵ یک وبلاگ ساده ایجاد کنیم. این وبلاگ دارای ویژگی های زیر می باشد :
- نمایش پست با لینک ادامه مطلب در صفحه اصلی
- قابلیت جستجو در پست های وبسایت توسط کاربر
- نمایش یک پست کامل به همراه بخش نظرات
- توانایی درج، حذف، آپدیت و ویرایش پست ها و نظرات توسط مدیر سایت
- توانایی پاسخ دادن به نظرات در پنل مدیریت
قدم اول : نصب و راه اندازی سریع laravel ۵
ما فرض را بر این می گذاریم که شما کاملا با نصب و راه اندازی laravel ۵ آشنایی دارید و مشغول به کار با آن هستید. اگر اینطور است نیازی به بخش زیر ندارید. در غیر این صورت پیشنهاد می شود این بخش را با دقت دنبال کنید.
- دستورالعمل نصب laravel ۵
- ساخت یک دیتابیس با استفاده از تریمنال mysql
دستورالعمل نصب laravel ۵
برای نصب لاراول به :
- PHP 5.5.9 و یا ورژن جدیدتر
- Open SLL PHP Extension
- PDO PHP Extension
- Mbstring PHP Extension
- Tokenizer PHP Extension
نیاز دارید. اگر Xampp روی سیستم شما نصب باشد مشکلی نخواهید داشت. (اگر هنوز نصب نکردید می توانید اول برنامه Xampp و یا Wampp را نصب کنید و سپس ادامه آموزش را دنبال کنید). برای نصب لاراول در مرحله اول باید فایل نصب را از سایت لاراول دریافت کنید :
فایل نصب لاراول را از اینجا دانلود کنید
حالا Composer را اجرا کنید و بعد از آن کافیست چند بار Next بزنید تا با تنظیمات پیش فرض Composer با موفقیت نصب شود بعد از نصب Composer وارد Command Prompt شوید و سپس داخل Run بنویسید cmd بعد اینتر را بزنید. حالا دستور composer را تایپ کنید و اینتر بزنید.
شما Composr را با موفقیت نصب کردید. حالا داخل درایو C پوشه ای بسازید و اسم آن را Laravel بگذارید. سپس داخل CMD دستور زیر را تایپ کنید و اینتر بزنید :
1 |
C:\> Cd laravel |
حالا دستور زیر را به منظور ساختن یک پروژه به اسم blog داخل مسیر C:\laravel وارد کنید و اینتر بزنید :
1 |
composer create-project --prefer-dist laravel/laravel blog |
تبریک میگم شما اولین پروژه لاراول را ایجاد کردید. حالا آخرین دستور را هم وارد کنید تا سایتتان آماده اجرا شود. اول وارد پوشه blog شوید (اسم پوشه پروژه)
1 |
C:\laravel> Cd blog |
سپس دستور php artisan serve را وارد کنید.
حالا کافیست مرورگر خود را باز کنید و آدرس زیر را در آن وارد کنید :
1 |
Localhost:8000 |
ساخت یک دیتابیس با استفاده از تریمنال mysql
1 2 3 4 5 |
┌─[usm4n@usm4n-desktop]―[~] └─•mysql -u root -p Enter password: mysql> create database laravel; Query OK, 1 row affected (0.00 sec) |
1 2 3 4 5 6 7 8 9 10 |
'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 برای ارسال پست روی وبلاگ و بخش نظرات استفاده می کند.
نکته : ما از دستورات artisan migrate:make create_tablename_table و artisan migrate به ترتیب برای ایجاد Migrations و اجرای Migrations استفاده می کنیم .
کلاس Migrations برای جدول Posts :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
<?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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
<?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 ۵ رو نصب و راه اندازی کردید داخل پروژه شما قرار داده شده است.
ایجاد Models با استفاده از Eloquent ORM :
Eloquent ORM همراه با فریم ورک لاراول وجود دارد و می تواند به سادگی و خیلی زیبا با استفاده از ActiveRecord با جداول پایگاه داده شما کار کند و عملیات مورد نظر شما را به بهترین شکل انجام دهد. هر جدولی که در پایگاه داده وجود دارد دارای یک Model جداگانه در پروژه شما می باشد که این باعث تعامل بهتر با جداول می شود.
ما از اسم های ساده تری برای جدول ها بعنوان نام Eloqent Model استفاده می کنیم تا خوانایی کدها بالا برود. این قرار داد کمک می کند تا Eloquent بتواند به صورت جدول با Model ارتباط برقرار کند. برای مثال اگه اسم Eloqent Model ما Post باشد، از اسم جدول posts استفاده می کنیم .
در زیر کدهای بخش Post و Comment را قرار می دهیم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?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 در ترمینال استفاده کنید.
کد PostCommentSeeder :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<?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->approved = 1; $post->comments()->save($comment); $post->increment('comment_count'); } } } } |
for اول برای به وجود آوردن پست های مختلف بدون نیاز به تنظیمات خاصی است و حلفه داخلی هم مربوط به ایجاد کامنت برای آن پست در حال ساخت می شود که کامنت های مختلفی را برای پسته ا قرار می دهد. همچنین در حلقه داخلی بعد از به وجود آمدن کامنت فیلد comment_count مربوط به پست آن کامنت را یک واحد افزایش می دهد.
استفاده از فرمان “artisan tinker” در ترمینال
laravel با استفاده از این دستور یک ارتباط تعاملی آسان را از طریق خط فرمان ترمینال با پروژه ایجاد می کند که شما می توانید دستورات مختلف و جالبی را در خط فرمان استفاده کنید. اجازه دهید چند مورد از این دستورات را برایتان مثال بزنم :
1 2 3 |
┌─[usm4n@usm4n-desktop]―[~] └─•artisan tinker > |
1 2 3 4 |
>$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"} |
1 2 3 |
>$post = Post::skip(5)->take(2)->get(); >foreach($post as $value) echo "post id:$value->id "; post id:6 post id:7 |
1 2 3 |
>$post = Post::select('id','title')->first(); >echo $post; {"id":"1","title":"Post no 1"} |
1 2 3 |
>$post = Post::select('id','title')->where('id','=',10)->first(); >echo $post; {"id":"10","title":"Post no 10"} |
1 2 3 |
>$post = Post::find(4); >echo $post->comments[0]->commenter; xyz |
- ساخت کنترل ها
در لاراول ما کنترل ها را با گسترش کلاس Controller که در دایرکتوری (app/http/controllers) قرار دارد ایجاد می کنیم. همه کنترل های بوجود آمده در (app/http/controllers) قرار می گیرند.
نکته : لاراول هیچ محدودیتی در ساختار دایرکتوری خودش ندارد، توسعه دهندگان می توانند به هر شکلی که می خواهند دایرکتوری لاراول را مجددا تنظیم کنند.
یک مثال از کنترل ساده :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php namespace App\Http\Controllers; use ... //file: app/Http/controllers/IndexController.php class IndexController extends Controller { public function showIndex() { // generates response from index.blade.php return view('index'); } } //file: app/Http/routes.php //registering route to controller actions get('index','IndexController@showIndex'); //In general get('route.name','SomeController@someAction'); post('route.name','SomeController@someAction'); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php namespace App\Http\Controllers; use ... class IndexController extends Controller { public function getAction() { //get request handling } public function postAction() { //post request handling } } //registering route Route::controller('index','IndexController); |
برای ثبت مسیر برای هر عمل در کنترل یک پیشوند برای هر عمل قرار دادیم و با استفاده از Route::controller(‘index’,’IndexController) بطور خودکار مسیر دهی ها را با توجه به آن پیشوندها خود برنامه انجام می دهد.
چند نکته :
- بطور معمول هر action با یک view همراه است که این view کار نمایش دادن اطلاعات به کاربر را انجام می دهد.
- هنگامی که ما یک آرایه را با استفاده از return برمی گردانیم، این آرایه بطور خودکار با JSON کدگذاری و به ما نشان داده می شود.
- ما با استفاده از متد nest() می توانیم یک view را به یک متغیر نسبت دهیم.
- ساخت Controller ها برای برنامه
ما در قدم اول برای شروع کنترل BlogController را می سازیم که وظیفه رسیدگی به درخواست اول را دارد : نشان دادن صفحه اصلی / محتوای کلی وبسایت، قسمت جستجو و نمایش جستجو را بر عهده دارد. در قدم بعد به ترتیب مسئولیت رسیدگی به عملیات CRUD پست ها و نظرات را به PostsController و CommentsController می دهیم .
BlogController
کد زیر متعلق به کنترل BlogController است که در قسمت app/http/Controllers/BlogController.php قرار دارد :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
<?php namespace App\Http\Controllers; use App\Http\Requests; use App\post; use Illuminate\Http\Request; class BlogController extends Controller { /** * select 10 post * @return Home page */ public function getIndex() { $posts = post::orderBy('id', 'desc')->paginate(10); return view('home')->nest('content', 'index', compact('posts','title')) ->with('title','Home Page | Laravel 5 Blog'); } /** * @param request serch * @return result serch */ public function getSearch(Request $request) { $searchTerm = $request['s']; $posts = Post::whereRaw('match(title,content) against(? in boolean mode)', [$searchTerm]) ->paginate(10); $posts->appends(['s' => $searchTerm]); return view('home') ->nest('content', 'index', ($posts->isEmpty()) ? ['notFound' => true] : compact('posts')) ->with('title', 'Search: ' . $searchTerm);; } } |
زمانی که مسیر خود را با Route::controller() به صورت Route::controller(‘/’,’BlogController’) ثبت کنیم، getIndex() از مسیر نقشه برداری می کند. بعد از اینکه آدرس صفحه اصلی سایت را اجرا کردیم این action عمل می کند و محتوای مورد نظر را به شما نمایش می دهد. در داخل getIndex() با استفاده از مدل post پست های خود را بازیابی می کنیم. حالا این کار با استفاده از orderBy(‘id’, ‘desc’) که باعث مرتبط شدن پست ها بر اساس شماره id و همینطور برای اینکه تمام مطالب در یک صفحه نباشد از متد paginate()استفاده می کنیم و عدد ۱۰ را برای آن در نظر میگیریم تا در هر صفحه فقط ۱۰ عدد پست نمایش داده شود. بعد از بازیابی اطلاعات آن را داخل متغیر $posts قرار می دهیم تا در بخش view بتوانیم با استفاده از یک حلقه به راحتی محتوای هر پست را جدا کنیم و نمایش دهیم (قسمت view را در آینده توضیح خواهم داد). خب ما با استفاده از return و متد view() صفحه Home.blade.php را بازیابی و با متد nest()اطلاعات مورد نظر را برایش می فرستیم.
حالا با استفاده از getSearch() قابلیت جستجو در سایت را برای کاربران به وجود می آوریم. از مدل Post برای ارسال کوئری برای جستجو استفاده می کنیم و همچنین از متد whereRaw() برای پیدا کردن محتوای مورد نظرمان بر اساس شرایط و نوع جستجو متنی که مد نظرمان هست استفاده می کنیم و در آخر هم برای صفحه بندی نتایج جستجو از متد paginate() بهره می بریم. بقیه کدها هم برای ارسال و نمایش اطلاعات بازیابی شده استفاده می شوند.
The PostsController
کد زیر مربوط به کنترل PostsController می باشد :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
<?php namespace App\Http\Controllers; use App\Http\Requests; use App\Http\Requests\PostRequest; use App\Post; class PostController extends Controller { /* get functions */ public function listPost() { $posts = post::orderBy('id', 'desc')->paginate(10); return view('dash')->nest('content', 'posts.list', compact('posts')) ->with('title','Post listings'); } /** * @param post $post * @return $this */ public function showPost(post $post) { $comments = $post->comments()->where('approved', '=', 1)->get(); return view('home')->nest('content', 'posts.single', compact('post', 'comments')) ->with('title',$post->title); } public function newPost() { return view('dash')->nest('content', 'posts.new') ->with('title', 'New Post'); } public function editPost(post $post) { return view('dash')->nest('content', 'posts.edit', compact('post')) ->with('title', 'Edit Post'); } public function deletePost(post $post) { $post->delete(); return redirect()->route('post.list')->with('success', 'Post is deleted!'); } /** * @param PostRequest $request * post functions * @return \Illuminate\Http\RedirectResponse */ public function savePost(PostRequest $request) { $post = [ 'title' => $request['title'], 'content' => $request['content'], ]; $post = new Post($post); $post->comment_count = 0; $post->read_more = (strlen($post->content) > 120) ? substr($post->content, 0, 120) : $post->content; $post->save(); return redirect('admin/dash-board')->with('success', 'Post is saved!'); } public function updatePost(post $post,PostRequest $request) { $data = [ 'title' => $request['title'], 'content' => $request['content'], ]; $post->title = $data['title']; $post->content = $data['content']; $post->read_more = (strlen($post->content) > 120) ? substr($post->content, 0, 120) : $post->content; if (count($post->getDirty()) > 0) /* avoiding resubmission of same content */ { $post->save(); return redirect()->back()->with('success', 'Post is updated!'); } else return redirect()->back()->with('success', 'Nothing to update!'); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?php namespace App\Providers; use Illuminate\Routing\Router; use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; class RouteServiceProvider extends ServiceProvider { /** * This namespace is applied to the controller routes in your routes file. * * In addition, it is set as the URL generator's root namespace. * * @var string */ protected $namespace = 'App\Http\Controllers'; /** * Define your route model bindings, pattern filters, etc. * * @param \Illuminate\Routing\Router $router * @return void */ public function boot(Router $router) { parent::boot($router); $router->model('post','App\Post'); |
حالا زمانی که ما یک مسیر را بازدید کنیم که پارامتری دارد و آن پارامتر باید با مدلش ارتباط بر قرار کند، فقط با گذاشتن post $post در action به عنوان پارامتر و استفاده از آن در view کارمان را خیلی ساده و راحت می کنیم.
تنها action عمومی که در این کنترل قرار دارد showPost و ما با استفاده از آن برای نمایش یک پست تنها استفاده می کنیم. در داخل showPost() ما با استفاده از Route Model Bindings که در بالا گفتیم پست مورد نظرمان را بازیابی می کنیم و با استفاده از $post->comments() و متد where نظرات مرتبط به آن پست که توسط مدیر تایید شده اند را هم بازیابی می کنیم. این دو جدول با استفاده از Relationships که در قسمت اول کد اتصال دو جدول را در هر مدل نوشتیم به هم متصل شده اند. البته Relationships را در یک پست جداگانه به طور کامل توضیح می دهم اما فعلا دانستن چگونگی ارتباط این دو جدول برایتان کافیست و در آخر اطلاعات را به صفحه (app/views/posts/single.blade.php) می فرسیتم.
action های باقی مانده در این کنترل برای انجام عملیات CRUD در بخش مدیریت هستند. برای مثال ما از listPost برای نشان دادن لیست پست های موجود در سایت به صورت یک جدول استفاده می کنیم که همین جدول خود شامل مسیر هایی برای حذف و آپدیت می شود.
ما از عمل newPost برای نشان دادن یک فرم به ادمین استفاده می کنیم تا ادمین بتواند با پرکردن و ارسال آن یک پست جدید بوجود آورد. در داخل آن فرم برای ارسال مسیر savePost قرار دارد که کار ذخیره کردن آن پست ارسالی از طرف ادمین را انجام می دهد. البته بعد از ارسال فرم در savePost که دارای پارامتر PostRequest می باشد، اعتبار سنجی می شود و اگر مشکلی نداشت در دیتابیس ثبت می شود.
CommentsController
کد مربوط به کنترل CommentsController :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
<?php namespace App\Http\Controllers; use App\Http\Requests; use App\Http\Controllers\Controller; use App\Comment; use App\Post; use App\Http\Requests\CommentRequest; use Illuminate\Http\Request; class CommentController extends Controller { /* get functions */ public function listComment() { $comments = Comment::orderBy('id', 'desc')->paginate(20); return view('dash')->nest('content', 'comments.list', compact('comments')) ->with('title','Comment Listings'); } public function newComment(Post $post,CommentRequest $request ) { Comment::create($request->all()); /* redirect back to the form portion of the page */ return redirect()->back() ->with('success', 'Comment has been submitted and waiting for approval!'); } public function showComment(Comment $comment,Request $request) { if ($request->ajax()) return view('comments.show', compact('comment')); // handle non-ajax calls here //else{} } public function deleteComment(Comment $comment) { $post = $comment->post; $status = $comment->approved; $comment->delete(); ($status === 'yes') ? $post->decrement('comment_count') : ''; return redirect()->back()->with('success', 'Comment deleted!'); } /* post functions */ public function updateComment(Comment $comment,Request $request) { $comment->approved = $request['status']; $comment->save(); $comment->post->comment_count = Comment::where('post_id', '=', $comment->post->id) ->where('approved', '=', 1)->count(); $comment->post->save(); return redirect()->back()->with('success', 'Comment ' . (($comment->approved === 'yes') ? 'Approved' : 'Disapproved')); } } |
در کد بالا : listComment برای نمایش لیست کامنت ها به مدیر استفاده می شود و شامل جدولی است که در آن لینک اعمال CRUD برای هر کامنت وجود دارد. زمانی که یک دیدگاه جدید برای یک پست که داخل وبسایت قرار دارد بخواهد ثبت شود، از عمل newComment برای اعتبارسنجی محتوای آن کامنت و ثبت آن در دیتابیس استفاده می شود. newComment بعد از اعتبارسنجی و زمانی که در حال ثبت در دیتابیس می باشد، approved را برابر با ‘No’ قرار می دهیم تا قبل از تایید به نمایش در نیاید. بعد مدیر می تواند در پنل مدیریت با استفاده از updateComment آن کامنت را تایید کند. البته updateComment بعد از هر تغییر تعداد کامنت های تایید شده برای آن پست را می شمارد و در جدول پست مربوط به همان نظر در ستون comment_count ثبت می کند. deleteComment هم برای حذف کامنت مورد استفاده قرار می گیرد.
در آخر عمل showComment که کار آن نشان دادن یک دید کلی از مشخصات ارسال کننده کامنت و محتوای کامنت است، بصورت آژاکس این درخواست ارسال و نمایش داده می شود که در آینده بیشتر راجع به آن صحبت خواهم کرد.
Routing در لاراول
مسیریابی، نقش اساسی در عملکرد هسته هر فریم ورک MVC ایفا می کند. در حقیقت Route یه نگاشت بین موتور requests و response می گویند و اگر بخواهیم خیلی ساده آن را تعریف کنیم آدرس های URL ای که شما در مرورگرتان وارد می کنید با route مدیریت می شود و نقاط ورودی برنامه را تعریف می کند. داشتن یک routing انعطاف پذیر می تواند به شما کمک کند تا کنترل بهتر و کاربردی تر را در برنامه تان داشته باشید.
لاراول دارای یک مسیریابی قدرتمند است که بر اساس مسیریابی Symfony نوشته شده و کار با آن بسیار راحت است. همچنین رابط کاربری راحت و قابلیت های زیادی دارد که برنامه نویسی با آن را برای شما لذت بخش تر می کند.
تعریف Route ها
در لاراول Route های برنامه ما در مسیر app\http\routes.php تعریف می شوند. یک مثال ساده از فایل routes.php :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php // will be used to handle GET requests. Route::get('index',function() { echo 'this is index page'; }); Route::get('login',function() { echo 'GET login requests will be hndled here.'; }); // will be used to handle POST requests. Route::post('login', function() { echo 'POST login requests will be handled here.'; }); |
1 2 |
<?php Route::get('users', 'UsersController@getIndex'); |
در کد بالا زمانی که ما درخواستی بصورت /users داشته باشیم این درخواست بوسیله route به متد getIndex از کنترل UserController متصل می شود و داده ها را به نسبت کدی که در getIndex قرار دارد به کاربر نشان می دهد. همچنین می توانیم داده ها را بطور مستقیم بوسیله افعال http (با استفاده از Route::put و Route::delete) حذف یا اضافه کنیم.
پارامتر ها در Route
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php // parameter {id} will be passed to the closure. Route::any('post/{id}',function($id) { echo "post with id: $id"; }); // A model with given post id will be passed to closure for any HTTP request. Route::any('post/{post}',function($post) { echo "post with id: $post->id"; }); |
نکته : filter که در نسخه ۴ لاراول در route ها مورد استفاده قرار می گرفت در نسخه ۵ جای خود را به Middleware داده است.
می توانیم در هر route با تعریف کلید در آرایه ای که در زیر می بینید یک نام روتر دوم داشته باشیم :
1 2 3 4 5 6 7 8 9 |
<?php Route::get('admin',['as'=>'admin.home','middleware' => 'auth',function() { return 'is already called'; }]); //another example using controller action. Route::get('/post/list',['as' => 'post.list','uses' => 'PostController@listPost']); |
1 2 |
<?php route('post.list'); |
شما می توایند برای توضیحات کامل تر در مورد route ها به اسناد خود لاراول مراجعه کنید.
ساخت Route های مورد نیاز برای وبلاگ
در زیر مسیرهایی که برای برنامه مان استفاده می کنیم را می توانید ببینید :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
<?php //file: app/http/routes.php Route::controllers([ 'auth' => 'Auth\AuthController', 'password' => 'Auth\PasswordController', ]); /* User routes */ get('/post/{post}/show', ['as' => 'post.show', 'uses' => 'PostController@showPost']); post('/post/{post}/comment', ['as' => 'comment.new', 'uses' => 'CommentController@newComment']); /* Admin routes */ Route::group(['prefix' => 'admin', 'middleware' => 'auth'], function () { /*get routes*/ get('dash-board', function () { $username = Auth::user()->name; return view('dash')->with('content', "Hi $username, Welcome to Dashboard!") ->withUsername('username',$username) ->withTitle('title','DashBoard'); }); get('/post/list', ['as' => 'post.list', 'uses' => 'PostController@listPost']); get('/post/new', ['as' => 'post.new', 'uses' => 'PostController@newPost']); get('/post/{post}/edit', ['as' => 'post.edit', 'uses' => 'PostController@editPost']); get('/post/{post}/delete', ['as' => 'post.delete', 'uses' => 'PostController@deletePost']); get('/comment/list', ['as' => 'comment.list', 'uses' => 'CommentController@listComment']); get('/comment/{comment}/show', ['as' => 'comment.show', 'uses' => 'CommentController@showComment']); get('/comment/{comment}/delete', ['as' => 'comment.delete', 'uses' => 'CommentController@deleteComment']); /*post routes*/ post('/post/save', ['as' => 'post.save', 'uses' => 'PostController@savePost']); post('/post/{post}/update', ['as' => 'post.update', 'uses' => 'PostController@updatePost']); post('/comment/{comment}/update', ['as' => 'comment.update', 'uses' => 'CommentController@updateComment']); }); /* Home routes */ Route::controller('/', 'BlogController'); /* View Composer */ View::composer('sidebar', function ($view) { $view->recentPosts = App\post::orderBy('id', 'desc')->take(5)->get(); }); |
در کد بالا برای اعتبار سنجی مدیریت از کنترل auth استفاده می کنیم و همینطور در route های بعدی یعنی post.show و comment.new ما به مخاطب ها اجازه می دهیم تا پست ها را در صفحات تکی (single page) ببینند و اگر خواستند نظر خود را در مورد آن پست ارسال کنند. در route بعدی یک route:group می سازیم که تمام مسیر های مربوط به مدیریت در آن قرار می گیرد و یک پیشوند admin هم برای route هایی که در این گروه قرار دارند تعریف می کنیم تا هر route که درخواست شد قبل از آن admin بیابد. برای مثال زمانی که مسیر post.edit فراخوانی شود به url به این صورت بازگردانی می شود. (http://localhost/admin/post/۱۲/edit)
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.