messerli90/laravel-ghost

Fluent Laravel wrapper for the Ghost Content API

0.1.0 2021-04-05 22:09 UTC

This package is auto-updated.

Last update: 2024-04-07 03:10:04 UTC


README

Laravel Ghost Banner

Laravel wrapper for the Ghost blogging API

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

A fluent wrapper for the Ghost Content API

Example

$post = Ghost::posts()->with('authors')->fromSlug('welcome');

$tags = Ghost::tags()->all();

Installation

You can install the package via composer:

composer require messerli90/laravel-ghost

You can publish the config file with:

php artisan vendor:publish --provider="Messerli90\Ghost\GhostServiceProvider" --tag="ghost-config"

This is the contents of the published config file:

return [
    /**
     * The API version of your Ghost blog
     *
     * Read about Ghost API Versioning in their docs:
     * https://ghost.org/docs/faq/api-versioning/
     */
    'ghost_api_version' => env("GHOST_API_VERSION", 4),

    /**
     * Your admin domain can be different to your main domain.
     * All Ghost(Pro) blogs have a `.ghost.io` domain
     * as their admin domain and require https.
     */
    'admin_domain' => env('GHOST_ADMIN_DOMAIN', "https://{admin_domain}"),

    /**
     * The Content API URL and key can be obtained by creating a new
     * Custom Integration under the Integrations screen in Ghost Admin.
     */
    'key' => env('GHOST_API_KEY', ''),

    /**
     * Optionally, cache records when they are returned.
     */
    'cache' => [
        /**
         * Cache returned records
         * Set to false if you want to handle caching yourself
         */
        'cache_records' => false,

        /**
         * Prefix key used to save to cache
         * Ex. ghost_posts
         */
        'cache_prefix' => 'ghost_',

        /**
         * How long until cache expires
         * Accepts int in seconds, or DateTime instance
         */
        'ttl' => 60 * 60,
    ]
];

Usage

// Using the facade
Ghost::posts()->all();

// or
$ghost = new Ghost($content_key, $domain, string $version);
$ghost->posts()->all();

The API for posts, authors, tags, and pages is similiar and can be used with the following methods:

// All resources returned as an array
Ghost::posts()->all();
Ghost::authors()->all();
Ghost::tags()->all();
Ghost::pages()->all();

// Retrieve a single resource by slug
Ghost::posts()->bySlug('welcome');

// Retrieve a single resource by id
Ghost::posts()->find('605360bbce93e1003bd6ddd6');

// Get full response from Ghost Content API including meta & pagination
Ghost::posts()->paginate();
$response = Ghost::posts()->paginate(15);

$posts = $response['posts'];
$meta = $response['meta'];

Build your request

Ghost::posts()
    ->with('authors', 'tags')
    ->fields('title', 'slug', 'html')
    ->limit(20)
    ->page(2)
    ->orderBy('title')
    ->get();

Caching

It is recommended you cache your returned resources when serving from your Laravel app.

For example, a possible BlogController@index could look like:

public function index()
{
    $posts = Cache::rememberForever('posts',
        fn() => Ghost::posts()->with('authors', 'tags')->all()
    );
    return view('blog.index', compact('posts'));
}

Automatic Resource Caching (Experimental & not in stable release)

Automatically cache returned records for a defined time.

Includes ghost:cache artisan command that can be scheduled to periodically repopulate cache with new posts.

Testing

composer test

Roadmap

  • Caching
  • Ghost Content Filter

Changelog

Please see CHANGELOG for more information on what has changed recently.

Contributing

Please see CONTRIBUTING for details.

Security Vulnerabilities

Please review our security policy on how to report security vulnerabilities.

Credits

License

The MIT License (MIT). Please see License File for more information.