همانطور که در اولین مطلب وبلاگم اشاره کردم بسیاری از مطالبی که در وبلاگم منتشر میکنم برای آرشیو کردن آن ها برای خودم است و امیدوارم برای برخی از دوستان هم کاربرد داشته باشه.
( لاراول ۵.۴ )
در این مطلب در رابطه با مواردی که در لاراول لازم میشه اشاره میکنم :
۱- ایجاد ارتباط بین فیلدهای جداول دیتابیس در migration :
وقتی فیلدی داریم که قصد داریم به عنوان کلید خارجی هم ازش استفاده کنیم، مثلا مقالاتی برای وبلاگ داریم که افرادی آنها را منتشر میکنند، پس برای هر مقاله فیلدی به نام user_id ذخیره میکنیم که شناسه کاربری که مقاله را منتشر کرده است در جدول مقالات ذخیره شود.
پس در migration مربوط به مقالات که نام مقاله و slug ، …. وجود داره یک فیلد به نام user_id وجود داره که به فیلد id موجود در جدول users اشاره میکنه. ( جدول users مشخصات کاربران را ذخیره میکند )
پس داخل فایل migration مربوط به مقالات به این صورت می نویسیم :
$table->integer('user_id')->unsigned(); $table->foreign('user_id')->references('id')->on('users');
۲ – گروه بندی مسیریابی Rout در فایل web.php
همانطور که میدونید برای اینکه مثلا لیست مقالات مربوط به وبسایت رو نمایش بدیم باید در فایل web.php که در فولدر rout است مسیردهی مورد نظر و کنترلر و تابع اون رو مشخص کنیم، برای مثال اگر قرار باشه با مسیر mekaeil.me/admin/articles لیست تمام مقالات را نمایش دهیم مسیردهی در فایل web.php به صورت زیر خواهد بود :
Route::get('/admin/articles', 'Admin\ArticlesController@list')->name('admin.article.list');
که در اینجا با فراخوانی آدرس /admin/articles بعد از نام دامنه، کنترلر ArticlesController که در مسیر Http > Controllers > Admin > ArticlesController وجود دارد فراخوانی میشود و تابع list موجود در این فایل مدیریت نمایش لیست مقالات و ارسال اطلاعات به view را انجام خواهد داد.
نکته اینجاست که ما اگر کلی مسیردهی داشته باشیم برای آدرس های مختلف باید به تعداد آنها مسیریابی را داخل فایل web.php ایجاد کنیم، برای راحتی کار و خلاصه شدن کار میتوانیم از حالت گروه بندی استفاده کنیم به صورت زیر :
Route::namespace('Admin')->prefix('admin')->group(function(){ $this->get('/articles', 'ArticlesController@list')->name('admin.article.list'); // Another rout here ... });
۳ – ایجاد کنترلرها و متدهای مربوط به آن ( CRUD )
هنگام ایجاد اپلیکیشن ها و برنامه ها، متدهای Create , Read, Update, Delete , Store در کنترلرهای مربوط به مدیریت برنامه استفاده میشود، برای ایجاد کنترلر و متدهای مربوط به آن، بعد از اینکه مدل مورد نظر را ایجاد کردیم میتوانیم با استفاده از دستور زیر به صورت Resource کنترلر موردنظر را ایجاد کنیم در حالتی که شامل متدهای مورد نظر هستند:
php artisan make:controller PhotoController -r
در حالت فوق متدهای show , edit و … مقداری به نام $id را به عنوان ورودی متد دریافت میکنند تا عملیات مورد نظر انجام شود :
حالا با تغییر دستور ترمینال به صورت زیر، میتوان با استفاده از rout model binding دسترسی و ارتباط میان کنترلرها و مدلها را برقرار کرد :
php artisan make:controller ArticleController -r --model=Article
۴ – insert داده های اولیه ( پیشفرض ) به جداول دیتابیس
من برای پروژه ای که داشتم باید هنگام راه اندازی پروژه یکسری داده ها به صورت پیشفرض به جداول دیتابیس اضافه میشد تا بتوانن هنگام برنامه نویسی هم از آنها استفاده کرد. برای مثال دسته بندی به نام “پیشفرض” به جداول دسته بندی ها اضافه کردم تا وقتی اگر یک مقاله ای آپلود و منتشر شد در صورتیکه دسته بندیی وجود نداشت و یا انتخاب نشد به صورت اتوماتیک این دسته بندی انتخاب شود و یا اگر یک دسته بندی حذف شد، تمام مقالات مربوط به آن دسته بندی به جای حذف به آن دسته بندی نسبت داده شوند.
برای ایجاد این داده های پیشفرض، من داخل فایل migration مربوط به جدول مورد نظر داده ها را اضافه کردم به صورت زیر :
public function up() { Schema::create('articlecats', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('slug')->nullable(); $table->timestamps(); }); // Insert Default Data DB::table('articlecats')->insert( array( 'id' => '1', 'name' => 'پیشفرض', 'slug' => 'default', 'created_at' => '1991-07-14', 'updated_at' => '1991-07-14' ) ); }
۵ – افزودن کاربر به دیتابیس به صورت دستی
گاهی وقت ها هنگام ایجاد پروژه در بخش هایی که هنوز به بخش سطوح دسترسی و احزارهویت کاربران نرسیدیم و لازم است یکسری دیتا را ایجاد کنیم، برای ایجاد این دیتاها از سمت برنامه باید کاربر لاگین کرده باشد و برای لاگین بودن کاربر باید کاربری وجود داشته باشد! پس به صورت دستی یا از سمت phpmyadmin کاربری را ایجاد میکنیم و یا با استفاده از کدنویسی و قراردادن در یکی از فانکشن های کنترلر کاربر را ایجاد میکنیم و سپس کد را حذف میکنیم، که من شخصا راه دوم رو با استفاده از کد زیر انجام میدم.
return User::create([ 'name' => 'Mekaeil Andisheh', 'level' => 'admin', 'email'=> 'example@example.com', 'password' => bcrypt('123456') ]);
۶ – دریافت رکوردهای یک جدول به صورت آرایه
برای برخی بخشها که اطلاعات کلی نمایش داده میشود برای مثال تنظیمات کلی یک بخش یا متنهای استاتیک یک صفحه میتوان راهکارهای مختلفی را پیش گرفت که بهترین این راهکارها ایجاد بخشی به نام settings است که مدل خود را داشته باشد و حتی بعدا بتوان تابعی را داخل Helper آن نوشت که به راحتی برای بخش های مختلف آن به آن دسترسی داشت.
برای اینکار میتوانید متن این لینک را مطالعه نمائید : Save laravel app settings in database
برای بخشی از یک پروژه که فقط یک بخش ساده داشت که حدود ۱۰ تا رکورد جاهای مختلف از دیتابیس فراخوانی بشه انجام اینکار هم زمانبر بود و هم چون نیازی بو توسعه بعدها نداشت انگیزه ای برای انجام کار به سبک فوق نبود. راهکاری که به نظرم آمد دریافت همه رکوردها و تبدیل به آرایه و ارسال به صفحه مورد نظر بود.
برای دریافت مقادیر از دستور زیر میتوان استفاده کرد.
$homeItems = Home::where('status', 1)->get();
که دیتاها به صورت زیر دریافت میشوند :
که با تغییر کد فوق به صورت زیر با استفاده از key مورد نظرم دیتاها را به صورت یک لیستی از آرایه دریافت میکنم.
$homeItems = Home::where('status', 1)->get()->keyBy('section');
که با این تغییر داده ها را به صورت زیر دریافت میکنم :
برای استفاده از این داده ها در جاهای مختلف قالب به صورت زیر عمل میکنم.
{{ $sections['section-1']['title'] }}
۷ – قراردادن url اصلی پروژه در قالب blade
وقتی که قالب اصلی پروژه را روی لاراول پیاده سازی میکنیم بعضی وقتها مثلا داخل فوتر یا یک جاهایی که لوگو قرار دارد میخواهیم که به صفحه اصلی لینک شود، میتوانیم به صورت کاستوم آدرس url پروژه را داخل href بذاریم اما شیوه درستتر این ست که Route قرار دهیم که با تغییر دامنه این بخش نیز تغییر پیدا کند.
$url = URL::to("/"); print_r($url); $url2 = url('/'); print_r($url2);
۸ – دریافت مقدار Route Name
در برخی قسمتهای برنامه لازم است Route فعلی صفحه جاری را چک کنیم، در صورتیکه به این کار نیاز شد با استفاده از دستور زیر میتوانید Route صفحه جاری را دریافت نمائید :
Route::currentRouteName()
در صورتیکه نیاز به دریافت نام اکشن شد میتوانیم به صورت زیر اقدام کنیم :
Route::getCurrentRoute()->getActionName();
در صورتیکه نیاز به دریافت url کامل شد به صورت زیر اقدام کنیم :
$url = $request->url();