Skip to content

Composers

View Composers, eller enbart Composers, kommer från ett system i Laravel med samma namn. Systemet tillåter en att att skicka med data till sina vyer (blade-mallar) och uträtta ett scope för vyn (och dess inkluderade under-vyer). Man kan göra detta med vilken mall som helst.

Tanken är att man ska hämta, bearbeta, skapa logik och i allmänhet göra datan redo för att visas i vyn. Detta gör att vy-filerna blir mer överskådliga och enklare att underhålla. Som tumregel kan man tänka att man aldrig vill skapa en ny variabel inuti en vy. Men det finns så klart undantag då man behöver göra det.

Konstruktion

Observera

Composers auto-laddas (autoload) och namngivningen måste därmed följa standarden PSR-4

Det går att skapa nya Composers med WP-CLI. Använd följande kommando:

wp dusk make:composer ExampleComposer
wp dusk make:composer ExampleComposer

Detta kommer att skapa en ny fil som heter ExampleComposer i app/View/Composers.

Om man inte använder WP-CLI så är det absolut minsta som krävs för att skapa en ny Composer följande:

php
// app/View/Composers/ExampleComposer.php

namespace App\View\Composers;

use Nobox\Dusk\View\Composer;

class ExampleComposer extends Composer
{}
// app/View/Composers/ExampleComposer.php

namespace App\View\Composers;

use Nobox\Dusk\View\Composer;

class ExampleComposer extends Composer
{}

Just nu gör Composern inget. Här kommer lite grundläggande funktionalitet:

php
class ExampleComposer extends Composer
{
  /**
   * Det här berättar för Composern att den ska bindas till vyn `example`
   * i mappen `partials`. Det går även att använda `*` för generella
   * matchningar av vyer.
   */
  protected static $views = [
    'partials.example',
    'partials.example-*',
  ];

  /**
   * Detta kommer skapa upp variabeln `$horizon` inuti den angivna vyn.
   */
  public function with()
  {
    return [
      'horizon' => 'Det bästa temat för WordPress!',
      'example' => 'Some data',
    ];
  }

  /**
   * Det här kommer att skiva över `horizon`-variabeln definierad ovan. Det
   * gäller även för alla `horizon` som definierats i exempelvis `partials.*`.
   */
  public function override()
  {
    return [
      'horizon' => 'Ett totalt awesome tema för WordPress!'
    ]
  }
}
class ExampleComposer extends Composer
{
  /**
   * Det här berättar för Composern att den ska bindas till vyn `example`
   * i mappen `partials`. Det går även att använda `*` för generella
   * matchningar av vyer.
   */
  protected static $views = [
    'partials.example',
    'partials.example-*',
  ];

  /**
   * Detta kommer skapa upp variabeln `$horizon` inuti den angivna vyn.
   */
  public function with()
  {
    return [
      'horizon' => 'Det bästa temat för WordPress!',
      'example' => 'Some data',
    ];
  }

  /**
   * Det här kommer att skiva över `horizon`-variabeln definierad ovan. Det
   * gäller även för alla `horizon` som definierats i exempelvis `partials.*`.
   */
  public function override()
  {
    return [
      'horizon' => 'Ett totalt awesome tema för WordPress!'
    ]
  }
}

Variablerna som definierats i exemplet ovan kommer vara tillgängliga i filen partials/example.blade.php och exempelvis filen partials/example-1.blade.php. Variabeln kommer inte bli tillgänglig i exempelvis page.blade.php.

Datakällor

Datan som kan hämtas i vyerna kan komma från WordPress, men också från andra Composers. Det går självklart även att göra manuella anrop mot databaser och API:er i Composern.

WordPress

Composern kommer köras i en kontext där exempelvis get_the_ID kommer fungera som förväntat och returnera id:et för sidan eller inlägget man är på.

Ärvd data

Data kan även komma från en annan Composer. Om vi utgår från exemplet ovan kan man göra följande:

php
class Example1 extends Composer
{
  protected static $views = [
    'example-one',
  ];

  public function with()
  {
    return [
      'edited_example' => str_replace(
        'data',
        'text',
        $this->data->get('example'),
      ),
    ];
  }
}
class Example1 extends Composer
{
  protected static $views = [
    'example-one',
  ];

  public function with()
  {
    return [
      'edited_example' => str_replace(
        'data',
        'text',
        $this->data->get('example'),
      ),
    ];
  }
}

Övrigt

Självklart går det även att hämta data genom att göra anrop mot API:er eller skapa egna SQL-anrop i Composern.

Automatisk vy val

Om man vill binda en Composer till en enda vy kan man istället för att använda $views-variabeln utnyttja Horizons automatiska vy-väljare. Exempelvis om man har vyn /resources/views/partials/page-header.blade.php och kommer den bli bunden till Composern /app/View/Composers/PageHeader.php per automatik.