آموزش لاراول – Laravel Routing

  • خانه
  • آموزش لاراول – Laravel Routing
Image تحقیقات

آموزش لاراول – Laravel Routing

با سلام و درود خدمت شما دوستان

تو این جلسه درباره مسیر دهی ها در فریم ورک محبوب لاراول صحبت می کنیم.درواقع یکی از ویژگی های جالب در لاراول همین ایجاد مسیردهی ها هست .

تو این جلسه به موارد زیر می پردازیم :

1-مسیر دهی و Routing در صفحات

2-فرستادن پارامتر

3- ایجاد نام برای مسیرها برای دسترسی سریع تر

4- گروه بندی (Group routing)

5- فیلتر گذاری (Filtering )

6-مدیریت خطاهای 404 (404 Errors)

 

Basic Pages Basic Routing

خب در ابتدا شروع میکنیم و 3 تا مسیر مشخص میکنیم برای 3 تا از صفحاتمون که نیاز داریم تو این جلسه (Home, About, Work). در واقع ما با مسیردهی ها ، ادرس هایی که کاربر در URl وارد می کند را مدیریت می کنیم .تمام مسیر ها با کلمه ی ROUTE شروع می شوند و ساختار تقریبا یک سانی دارند :

// app/routes.php
<?php

	// ===============================================
	// STATIC PAGES ==================================
	// ===============================================

	// show a static view for the home page (app/views/home.blade.php)
	Route::get('/', function()
	{
		return View::make('home');
	});

	// about page (app/views/about.blade.php)
	Route::get('about', function()
	{
		return View::make('about');
	});

	// work page (app/views/work.blade.php)
	Route::get('work', array('as' => 'work', function()
	{
		return View::make('work');
	}));

مسیر اول که با (/)مشخص شده درواقع روت یا صفحه اصلی سایت مارو مشخص میکنه  و با استفاده از کد :

return View::make('home');

گفتیم که  View ای به نام home  را به کاربر نمایش بده .

بقیه ساختار مسیر ها مشابه هم هستند و در آخرین مسیر ما با استفاده از ‘as’ => ‘work’ ، یک نام به نام work به اون مسیر دادیم که در ادامه بتونیم از هرجایی صداش بزنیم.مثلا در View ها با کد زیر می توانیم به این مسیر دسترسی داشته باشیم :

{{ URL::route('work') }

به اون دو ادرس دیگرمون که براش نامی انتخاب نکردیم ، اگر قرار باشه دسترسی داشته باشیم به صورت زیر میتونیم دسترسی داشته باشیم :

{{ URL::to('/') }}
{{ URL::to('about') }}

اینم از بررسی و نحوه دسترسی به ROUTE هایی که نام دارند و یا نامی ندارند.

پس تا اینحا ما ادرس های زیر را مدیریت کردیم :

  • yoursite.com
  • yoursite.com/about
  • yoursite.com/work

 

Blog Pages with Categories Route Parameters

حالا میخوایم یه ادرس دیگه ای اضافه کنیم و همچنین یک پارامتر به این ادرس اضافه کنیم و مثلا بگیم که اگه کاربر دسته بندی (category) را هم وارد کرده بود که پست های اون دسته بندی رو نشون بده وگرنه تمام پست هارا به ما نشان بده .

// app/routes.php
<?php

...

	// ===============================================
	// BLOG PAGES ====================================
	// ===============================================

	// blogroll to show all blog posts
	Route::get('blog/{category?}', function($category = null)
	{
		// get all the blog stuff from database
		// if a category was passed, use that
		// if no category, get all posts
		if ($category)
			$posts = Post::where('category', '=', $category);
		else
			$posts = Post::all();

		// show the view with blog posts (app/views/blog.blade.php)
		return View::make('blog')
			->with('posts', $posts);
	});

همان طور که در آدرس Blog مشاهده می کنیم ما اومدیم از  {category?} استفاده کردیم و به لاراول فهموندیم که این یک پارامتر هست که وارد می شود و در ادامه در function , عبارت $category = null را وارد کردیم و گفتیم که اگر کاربر مقدار متغیر دسته بندی را وارد نکرده بود ، مقدارش پیش فرض NULL را در آن قرار بده.

و در ادامه ی کدها بررسی کردیم که آیا متغیر دسته بندی مقدار NULL دارد یا کاربر مقدارش را جایگزین کرده و اگر جایگزین کرده پست های آن دسته را نمایش بده در غیر این صورت تمام پست ها را نشان بده  .

در اخر کدها هم یه View به نام blog صدا زدیم و پست ها را با متغیر $Post به اون View ارسال کردیم تا پردازش هایی که لازم داریم رو در View با اون پست ها ایجاد نماییم .

 

 

Admin Section Group Routing, Route Prefixing, and Auth Filters

خب حالا در ادامه ی مثال بلاگمون ، ممکنه ما نیاز داشته باشیم تا یک بخش ادمین هم بزاریم وبه وسیله اون بخش بتونیم پست قرار دهیم. به نظر من تمام صفحات بخش ادمین رو با admin / شروع نماییم بهتر است مثلا admin/dashboard/ (صفحه دشبورد بخش ادمین) و یا admin/posts/(صفحه پست ها) و…

همان طور که مشاهده کردین این صفحات همشون اولش /admin را دارند .laravel برای ما امکان گروه بندی ادرس ها رو قرار داده تا به وسیله ی اون برای ادرس های عضو گروه  یک prefixes مثل همین admin/ و یا یک فیلتر خاص اعمال کنید به جای اینکه برای تک تک Route ها این کارو انجام بدیم .

برای مطالعه بیشتر به این بخش سایت لاراول مراجعه نمایید

// app/routes.php
<?php

...

	// ===============================================
	// ADMIN SECTION =================================
	// ===============================================
	Route::group(array('prefix' => 'admin'), function()
	{
		// main page for the admin section (app/views/admin/dashboard.blade.php)
		Route::get('/', function()
		{
			return View::make('admin.dashboard');
		});

		// subpage for the posts found at /admin/posts (app/views/admin/posts.blade.php)
		Route::get('posts', function()
		{
			return View::make('admin.posts');
		});

		// subpage to create a post found at /admin/posts/create (app/views/admin/posts-create.blade.php)
		Route::get('posts/create', function()
		{
			return View::make('admin.posts-create');
		});
	});

در کدهای بالا ما مسیرهای داخل admin را ایجاد کردیم و برای اینکار از گروه بندی کمک گرفتیم و یک Prefix هم بهش اختصاص دادیم .

 خب حالا میخوام علاوه بر prefix یک فیلتر هم اضافه کنم تا قبل از اجرای صفحات ، چک کند آیا کاربر لاگین کرده است یا خیر . اگر لاگین نکرده بود ، کاربر را به صفحه لاگین انقال دهد.(به کلمه Before,Auth دقت فرمایید)

 برای یادآوری عرض کنم که فیلتر ها در لاراول به صورت پیشفرض در شاخه app/filters.php قرار دارند. 
// app/routes.php
<?php

...

	// ===============================================
	// LOGIN SECTION =================================
	// ===============================================
	// show the login page
	Route::get('login', function()
	{
		// show the login page (app/views/login.blade.php)
		return View::make('login');
	});

	// ===============================================
	// ADMIN SECTION =================================
	// ===============================================
	Route::group(array('prefix' => 'admin', 'before' => 'auth'), function()
	{
		// main page for the admin section (app/views/admin/dashboard.blade.php)
		Route::get('/', function()
		{
			return View::make('admin.dashboard');
		});

		...

	});

Login Form POST Routing

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

// app/routes.php
<?php

...

	// ===============================================
	// LOGIN SECTION =================================
	// ===============================================
	// show the login page
	Route::get('login', function()
	{
		// show the login page (app/views/login.blade.php)
		return View::make('login');
	});

	// process the login
	Route::post('login', function()
	{
		// validate
		// process login
		// if successful, redirect
		return Redirect::intended();
	});

	// ===============================================
	// ADMIN SECTION =================================
	// ===============================================

		...

	}));

 

Creating Blog Posts

 الان دیگه تقریبا با مدیریت مسیردهی  های Post و Get کارمون تموم شده فقط بزارین یه قسمت دیگه هم اضافه کنیم به بخش مدیریت برای اضافه کردن پست .آدرس این بخش رو من  admin/posts/create در نظر دارم ولی چون داخل گروه گذاشتیم و prefix به همشون دادیم دیگه لازم نیست admin/  رو اضافه کنیم و برای مسیر دهی از  posts/create استفاده می کنیم.

// app/routes.php
<?php

...

	// ===============================================
	// ADMIN SECTION =================================
	// ===============================================
	Route::group(array('prefix' => 'admin', 'before' => 'auth'), function()
	{

		...

		// subpage to create a post found at /admin/posts/create (app/views/admin/posts-create.blade.php)
		Route::get('posts/create', function()
		{
			return View::make('admin.posts-create');
		});

		// process the create blog post form
		Route::post('posts/create', function()
		{
			// add the post to the database
			// $post = new Post;
			// $post->title = Input::get('title');
			// more stuff here
			// $post->save();

			// create a success message
			Session::flash('message', 'Successfully created post!');

			// redirect
			return Redirect::to('admin/posts/create');
		});
	});

 خب اینم از کدهای Routeing برای بخش پست.در این جلسه به چگونه ذخیره کردن پست ها مون داخل دیتابیس نمیپردازیم.و انشالله در جلسات بعدی آموزش لاراول حتما اونو با هم کار میکنیم.

من فقط در میان کدهای بالا ، قسمت های مربوط به ذخیره پست رو کامنت کردم .

404 Errors

در انتهای این جلسه دلم نیومد این بخش رو ندازم چون خیلی راحت هست.و همان طور که از عنوان متوجه شدین میخوام کار با ارور های 404 رو بهتون بگم. فقط کافیه مسیر زیر رو در انتهای مسیرهای فایل Route.php اضافه نماییم و ادرس View مورد نظرتون رو مشخص کنید تا در صورتی که صفحه ای با خطای 404 مواجه شد اون View نمایش یابد.

اطلاعات بیشتر درباره خطای 404 لاراول

// app/routes.php
<?php

...

	// ===============================================
	// 404 ===========================================
	// ===============================================

	App::missing(function($exception)
	{

		// shows an error page (app/views/error.blade.php)
		// returns a page not found error
		return Response::view('error', array(), 404);
	});

در مثال بالا من یه View ساختم به نام error.blade.php و نام اون رو (error) در تابع صدا زدم تا در مواقع لازم نشان داده شود.شما میتونیم با هر نامی که دوست داشتین اونو بسازید فقط اخرش .blade.php یاتون نرده.

کل کدهای فایل Route.php رو براتون قرار میدم تا بتونه کمکتون کنه .

// app/routes.php
<?php

	// ===============================================
	// STATIC PAGES ==================================
	// ===============================================

	// show a static view for the home page (app/views/home.blade.php)
	Route::get('/', function()
	{
		return View::make('home');
	});

	// about page (app/views/about.blade.php)
	Route::get('about', function()
	{
		return View::make('about');
	});

	// work page (app/views/work.blade.php)
	Route::get('work', array('as' => 'work', function()
	{
		return View::make('work');
	}));

	// ===============================================
	// BLOG PAGES ====================================
	// ===============================================

	// blogroll to show all blog posts
	Route::get('blog/{category?}', function($category = null)
	{
		// get all the blog stuff from database
		// if a category was passed, use that
		// if no category, get all posts
		if ($category)
			$posts = Post::where('category', '=', $category);
		else
			$posts = Post::all();

		// show the view with blog posts (app/views/blog.blade.php)
		return View::make('blog')
			->with('posts', $posts);
	});

	// ===============================================
	// ADMIN SECTION =================================
	// ===============================================
	Route::group(array('prefix' => 'admin'), function()
	{
		// main page for the admin section (app/views/admin/dashboard.blade.php)
		Route::get('/', function()
		{
			return View::make('admin.dashboard');
		});

		// subpage for the posts found at /admin/posts (app/views/admin/posts.blade.php)
		Route::get('posts', function()
		{
			return View::make('admin.posts');
		});

		// subpage to create a post found at /admin/posts/create (app/views/admin/posts-create.blade.php)
		Route::get('posts/create', function()
		{
			return View::make('admin.posts-create');
		});

		// process the create blog post form
		Route::post('posts/create', function()
		{
			// add the post to the database
			// $post = new Post;
			// $post->title = Input::get('title');
			// more stuff here
			// $post->save();

			// create a success message
			Session::flash('message', 'Successfully created post!');

			// redirect
			return Redirect::to('admin/posts/create');
		});
	});

	// ===============================================
	// 404 ===========================================
	// ===============================================

	App::missing(function($exception)
	{

		// shows an error page (app/views/error.blade.php)
		// returns a page not found error
		return Response::view('error', array(), 404);
	});

 

امیدوارم از این آموزش خوشتون اومده باشه.

جلسه بعد میبینمتون.

موفق و پیروز باشید.