# Laravel Notes
  ⚡️ Tags:
  
    📍Framework
  
 # Split the routes
1./ Create new files to store the routes: app\routes\main.php
2./ At file routes.php, include the seperated routes
require app_path() . '/routes/main.php';
# Register new Module
1./ Add piece of codes at file composer.json
"autoload": {
    "psr-4": {
        "Khank\\": "app/modules/"
    }
}
2./ Run the command:
composer dump-autoload 
3./ Define a class at app/modules/Test.php
<?php
namespace Khank;
class Test {
    static function info() {
        echo 'hello';
    }
}
- Usage:
echo \Khank\Test::info(); // hello
# Artisan to Develop
# List
List all of commands availabel
./artisan list
# Essential Command
After creating new class Controller / Model / Command, lang files ... except views pages, then need run these commands:
composer dump-autoload && ./artisan dump-autoload && ./artisan optimize && ./artisan cache:clear
# Migration and Db Seeding
./artisan migrate
./artisan db:seed --class=InitSeeder
# Maintain website
php artisan down --message="Hello, 503"
# HMVC For Laravel
A good article to build this thing (opens new window)
Focus on booting in ServiceProvide
/**
* Perform post-registration booting of services.
*/
public function boot()
{
    $directories = array_map('basename', File::directories(__DIR__));
    foreach ($directories as $moduleName) {
        $this->_registerModule($moduleName);
    }
}
private function _registerModule($moduleName) {
    $modulePath = __DIR__ . "/$moduleName/";
    // boot route
    if (File::exists($modulePath . "routes.php")) {
        $this->loadRoutesFrom($modulePath . "routes.php");
    }
    // boot migration
    if (File::exists($modulePath . "Migrations")) {
        $this->loadMigrationsFrom($modulePath . "Migrations");
    }
    // boot languages
    if (File::exists($modulePath . "Languages")) {
        $this->loadTranslationsFrom($modulePath . "Languages", $moduleName);
    }
    // boot views
    if (File::exists($modulePath . "Views")) {
        $this->loadViewsFrom($modulePath . "Views", $moduleName);
    }
}
# Eloquent Tricks
# Customize time column
Instead of using default column name
class User extends Model
{
    const CREATED_AT = 'created_time';
    const UPDATED_AT = 'udpated_time';
    const DELETED_AT = 'removed_time';
}
# Check object is persistence
$user->exists; /// boolean 
# Check object is changed
$user->isDirty(); /// boolean
$user->isDirty('email'); 
$user->isDirty(['email', 'name']); 
/// get what 
$user->getDirty(); /// array
# Get original data
$user->getOriginal(); /// array
$user->getOriginal('email');
# Clone a instance
$user = User::first();
$clonedUser = $user->replicate();
# Refresh (grab from Database)
$user->name= 'Nguyen';
$user->address->city = "HCM City";
/// data of user is back to original. 
$user->refresh();
# Skip events
$user = User::withoutEvents(function () {
    return factory(User::class)->create(); 
});
# Save self & relations
$user->name = 'Nguyen';
$user->address->city = "HCM City";
/// will save relations & self attributes
$user->push();
# Force delete
$user->forceDelete();
# Soft delete
A good article (opens new window)
# Define extra attribute
protected $appends = ['full_name'];
public function getFullNameAttribute()
{
    return $this->first_name . ' ' . $this->last_name;
}
# And Query
// normal way 
User::where('first_name', 'DepTrai')
    ->where('age', 25)
    ->get();
// special way
User::whereFirstNameAndAge('DepTrai', 25)->get();
# Tricks
# Laravel Path
public_path(); // Path of public/
base_path(); // Path of application root
storage_path(); // Path of storage/
app_path(); // Path of app/
# Send data to view
// normal way 
return view('admin.article.edit', [
	'article' => $article,
	'categories' => $categories,
	'editor' => $editor,
]);
// shorter way: use `compact` function
return view('admin.article.edit', compact(
	'article',
	'categories',
	'editor'
));
# Remove public in URL
 - 1/ Rename /server.phpto/index.php
- 2/ Copy /public/.htaccessto/.htaccess
- 3/ Update config  asset_urlat/config/app.php