Eloquent
Eloquent is an object-relational mapper (ORM) supported by default in Laravel framework to make it enjoyable when interacting with your database. For more info, you may like to read Eloquent ORM (opens in a new tab) first.
Migrations
Migrations, like version control for your database, allow your team to define and share the application's database schema definitions. With database migrations, you no longer have to tell teammates to manually update required changes in their local database schema after pulling certain commits from source control.
Migrations classes are under src/Database/Migrations
directory.
packages/metafox/blog/src/: Package source root
Database/
Migrations/
2021_02_04_034457_CreateBlogTables.php : Migrations for blog schema
2021_02_05_034457_CreateCategoryTables.php : Migrations for category schema
Each Migrations class is child of Illuminate\Database\Migrations\Migration
class, and contains 2 up
and down
methods. Let's see the Migration CreateBlogTables
class below
<?php
use MetaFox\Platform\Support\DbTableHelper;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class () extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
if (!Schema::hasTable('blogs')) {
Schema::create('blogs', function (Blueprint $table) {
$table->bigIncrements('id');
// other columns
});
}
// setup other table
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
DbTableHelper::dropStreamTables('blog');
}
};
MetaFox platform is shipped with DbTableHelper, to support creating platform schemas easily and quickly.
For more info, please read Laravel migrations (opens in a new tab)
Seeders
Each package includes the ability to seed your database with default data using Seeder classes.
All package Seeder classes are stored in the src/Database/Seeders
directory. By default, a DatabaseSeeder
class is defined for you. With this class, you may use the call
method to run other Seeder classes. It will allow you to control the seeding order.
<?php
namespace MetaFox\Blog\Database\Seeders;
use Illuminate\Database\Seeder;
class PackageSeeder extends Seeder {
public function run()
{
// seed data to database
}
}
Factories
Please read Define Laravel Model Factories (opens in a new tab)
Observers
If your app is listening for many events on a given Model, you may use Observer to group all of your listeners into a single class. Observer classes have method names reflecting on the Eloquent events you wish to listen to. Each of these methods receives the affected Model as their only one argument.
<?php
// file name packages/metafox/blog/src/Observers/BlogObserver.php
namespace MetaFox\Blog\Observers;
use Exception;
use MetaFox\Blog\Models\Blog;
/**
* Class BlogObserver.
*/
class BlogObserver
{
/**
* Invoked when a model is creating
*
* @param Model $model
*/
public function creating(Model $model)
{
}
/**
* Invoked when a model created
*
* @param Model $model
*/
public function created(Model $model)
{
}
/**
* Invoked when a model is updating
*
* @param Model $model
*/
public function updating(Model $model)
{
}
/**
*Invoked when a model is updated
*
* @param Model $model
*/
public function updated(Model $model)
{
}
/**
* Invoked when a model is deleting
*
* @param Model $model
*/
public function deleting(Model $model)
{
}
/**
* Invoked when a model deleted
*
* @param Model $model
*/
public function deleted(Model $model): void
{
}
}
For performance optimization, MetaFox does not support automatically discovering Observers, you must register Observers
within the package ServiceProvider class. Below is the sample BlogServiceProvider
class
<?php
namespace MetaFox\Blog\Providers;
use MetaFox\Platform\Support\EloquentModelObserver;
use Illuminate\Support\ServiceProvider;
use MetaFox\Blog\Models\Blog;
use MetaFox\Blog\Observers\BlogObserver;
class BlogServiceProvider extends ServiceProvider
{
/**
* Boot the application events.
*
* @return void
*/
public function boot()
{
Blog::observe([EloquentModelObserver::class, BlogObserver::class]);
}
}
For more info about Observers, please visit Laravel Model Observers (opens in a new tab)
For Events list, please read Appendix - Event list
Repository
The main idea to use Repository Pattern in a Laravel is to create a bridge between models and controllers.