Artisan & ORM

Dagens föreläsning

Genomgång av vad Artisan är för något och hur det fungerar. Genomgång av hur man gör egna kommandon för olika typer av uppgifter.

ORM: Vad är det för något, varför skall man använda det, hur fungerar det i Laravel?

  • Artisan
  • Konsollen som miljö
  • Konsollkommandon
  • ORM: När hur varför?
  • Eloquent ORM i Laravel

Artisan

https://laravel.com/docs/5.5/artisan

Artisan är Laravels system för att enkelt och smidigt kunna använda och utveckla egna konsollkommandon.

På förra lektionen så använde vi några kommandon inom make och Laravel innehåller kommandon för att skapa grundplåtar för det ni vill göra.

Samma gäller såklart för konsollkommandon.

Varför konsollen?

När ni nu är så vana vid att göra olika typer av hemsidor, varför skulle ni vilja använda konsollen?

Det enkla svaret är att konsollen har andra möjligheter än vad PHP via http har. Via http har ni tex bara 30 sekunder på er att göra det ni vill göra innan ert script time:ar ut. Konsollen har ingen sådan begränsning.

Konsollen tillåter också utskrifter allteftersom arbetet pågår medan allting skrivs ut på en gång i webbläsaren. Detta gör konsollen väl anpassad för den typ av uppgifter som tar lite längre tid och som ni kanske inte nödvändigtvis vill utsätta era besökare för.

Artisan för mig

// Listar installerade konsollkommandon
php artisan

// Skapar ett eget kommando som heter ImportCustomers
php artisan make:command ImportCustomers

Som ni ser så finns det alltså ett make-kommando för att skapa egna konsollkommandon.

Laravel skapar då en fil med allt ni behöver för att komma igång.

Argument till kommandon

Det går även att göra kommandon som tar argument. Detta görs genom att helt enkelt redigera signaturen.

// customer_id som argument för att bara importera en kund
protected $signature = 'import:customers {customer_id}';

// Göra argumentet frivilligt
protected $signature = 'import:customers {customer_id?}';

// Ge argumentet ett standardvärde, också frivilligt
protected $signature = 'import:customers {customer_id=1}';

// Argumentet skall behandlas som en array
protected $signature = 'import:customers {customer_id*}';

// För att få tag på customer_id i mitt kommando
$customerId = $this->argument('customer_id');

Utskrifter på skärmen

Utskrifter görs via metoderna line, info, comment, question och error. Info och error är de vanligaste output-metoderna.

// Skriv ut något på skärmen
$this->info("Meddelande på skärmen");
$this->error("Detta är ett felmeddelande");

Jobba med filer

https://laravel.com/docs/5.5/filesystem

Vi behöver bara Storage::put just nu för den kommande övningen.

// Lagra en fil
Storage::put('minwebbsida.html', $contents);

Filerna lagras automatiskt i /storage/app

Övning tillsammans

Vi skall nu skriva om en av våra tidigare uppgifter till ett kommando, närmare bestämt uppgift 1 från lektion 2.

Vi skall inte göra om hela uppgiften utan bara den biten som hämtar hem data från en webbsida och sparar det i en fil.

Kommandot skall ta två argument, nämligen url och file_name

// Skapa kommandot
php artisan make:command GetWebPage

// Signaturen
protected $signature = 'get:webpage {url} {file_name}';

ORM

ORM står för Object Relational Mapping och syftar i vårt fall på ett system för att översätta data från en databas till objekt i vår kod.

ORM är tänkt att underlätta arbetet med databasen och låta oss skriva objektorienterad kod utan att direkt behöva skriva SQL-uttryck.

ORM:et innehåller funktionalitet för att ställa frågor till databasen på ett förenklat sätt och tillåter oss sedan att bara arbeta med objekten utan att behöva oroa oss för vad som händer bakom kulisserna.

Active Record

https://en.wikipedia.org/wiki/Active_record_pattern

Laravels ORM-implementation är en variant av Active Record. Active Record är en relativt enkel modell där varje rad i en tabell motsvaras av ett objekt i kod.

Det innebär alltså att när ni jobbar med tex en Customer-modell så motsvarar ett Customer-objekt en rad i er databas.

Customer-objektet innehåller då alla metoder ni behöver för att spara, radera osv.

Eloquent ORM

https://laravel.com/docs/5.5/eloquent

Eloquent är Laravels Active Record-implementation. Vi kommer att använda Eloquent i olika sammanhang i resten av kursen.

// Skapa en Customer-modell
php artisan make:model Customer

Konventioner

Eloquent innehåller en mängd olika konventioner eller antaganden om hur ni döper saker i er databas. Nu kan alltså vara ett bra tillfälle att gå igenom tabellnamn och dylikt för att följa konventionerna.

Eloquent antar tex att om ni har en modell som heter Customer så heter den motsvarande databastabellen customers. Alla dessa konventioner går att justera men det är överlag bra att försöka följa dem om ni inte har en bra anledning att gå mot strömmen.

Konventioner

class Customer extends Model {
    // Länka modellen till en annan tabell
    protected $table = 'my_customers';

    // Primary key-kolumnen antas vara id
    protected $primaryKey = 'id';
    
    // Primary key-kolumnen antas vara auto-inkrementerande
    public $incrementing = true;

    // Laravel sköter timestamps åt dig om du inte säger nej
    public $timestamps = false;
}

Hur hämtar jag det jag vill?

https://laravel.com/docs/5.5/queries

Eloquent använder sig av Laravels query builder för att hämta data från databasen. Frågorna ställs direkt på modellen.

// Hämta kund baserat på id, 1 i exemplet
Customer::find(1);

// Where -  ger en lista
Customer::where("id", "=", 1);

// Alla kunder
Customer::all();

// Med lite olika grejer på
$customers = Customer::where('is_active', 1)
    ->orderBy('firstname', 'asc')
    // Ta de första tio resultaten
    ->take(10)
    // Exekvera anropet    
    ->get();

Hur manipulerar jag datan?

// Hämta kund baserat på id, 1 i exemplet
$customer = Customer::find(1);

// Alla kolumner är automatiskt attribut på objektet
$customer->is_active = 0;

// Anropa save för att spara, spelar ingen roll 
// om det är ny eller befintlig kund.
$customer->save();

// Ni kan fylla på flera attribut samtidigt
$customer->fill(["firstname" => "Marcus", "lastname" => "Dalgren"]);
$customer->save();

// Radera kund
$customer->delete();

Vitlistning och svartlistning

Eloquent innehåller funktionalitet för att skydda kolumnerna i databasen. Detta görs via vitlistning och svartlistning.

Vitlistning innebär att ni anger vilka kolumner som det är ok att massfylla med data.

Svartlistning innebär att ni anger vilka kolumner som är förbjudna.

Svartlistning innebär ofta mindre kod till att börja med men vitlistning ger mer kontroll och är en bättre garant för att ni inte råkar lägga till data som det inte var tänkt skulle hänga med.

Vitlistning och svartlistning

// Som standard är inga kolumner vitlistade
protected $fillable = [];

// Och alla kolumner är svartlistade
protected $guarded = ['*'];

// Om ni vill ta bort svartlistningen
protected $guarded = [];

// Om ni istället vill vitlista kolumner
protected $fillable = ["firstname", "lastname"];

Artisan & ORM

By marcusdalgren

Artisan & ORM

  • 259