olssonm / ampersand
Plug and play flat file markdown blog for your Laravel-projects
Installs: 1 758
Dependents: 0
Suggesters: 0
Security: 0
Stars: 26
Watchers: 2
Forks: 0
Open Issues: 0
Requires
- laravel/framework: ^9|^10|^11
- spatie/sheets: ^1.10
Requires (Dev)
- orchestra/testbench: >=6.15
- phpstan/phpstan: ^2.0
- phpunit/phpunit: <11
- squizlabs/php_codesniffer: ^3.5
This package is auto-updated.
Last update: 2024-12-15 09:47:02 UTC
README
Ampersand
Plug-and-play flat file markdown blog tool for your Laravel-project. Create an article or blog-section on your site without the hassle of setting up tables, models or your own flat file-system.
Built upon spatie/sheets to handle the markdown-files and YAML-front matter parsing.
Note: This package is built for quick and easy setup and use – don't expect a fully featured CMS.
🛠 Install and configure
Require package:
$ composer require olssonm/ampersand
Publish config-files and views:
$ php artisan vendor:publish --provider="Olssonm\Ampersand\AmpersandServiceProvider"
In config/ampersand.php
you can now customize the settings to your liking. Views are available at resources/views/vendor/ampersand
✏️ Writing posts
Filename format
All posts should be stores in your posts_path
-directory with the filename format of 2021-03-30.my-post.md
, i.e. {date:Y-m-d}.{slug}.md
.
The slug is what determins at what URL your post will be available at.
Artisan command
You can quickly create a new post via the artisan command:
php artisan ampersand:new
YAML front matter
Posts can contain any number of attributes via YAML-front matter:
---
title: This is a new post
date: '2020-01-01 20:00:01'
cover: https://amazingimages.com/my-cover.jpg
---
My post in **Markdown**
🖥 Displaying posts
Two views are shipped with this package; an index-view and a show-view (used for single posts). They are located in /resources/vendor/views/ampersand
after installation and are fully customizable.
In index.blade.php
a collection of post-objects is available via the $posts
-variable. It behaves much as a standard Eloquent-collection.
@foreach ($posts as $post) <h2>{{ $post->title }}</h2> <div> {!! $post->contents !!} </div> @endforeach
Pagination-links are also available:
{{ $posts->links() }}
The Post-object contains all your front matter attributes as well as slug
, date
and contents
.
{{ $post->slug }} // my-post {{ $post->date->format('Y-m-d') }} // 2021-03-30 {{ $post->contents }} // <p>My post in <strong>markdown</strong></p> {{ $post->cover }} // https://amazingimages.com/my-cover.jpg
Retrieve posts in your application
You can retrieve posts and filter them as a collection anywhere in your application using the Post-model:
use Olssonm\Ampersand\Models\Post; // Reject posts where is_draft is true or has a date in the future $posts = Post::all()->reject(function($item) { return $item->is_draft || $post->date->lessThan(now()); });
The posts are sorted by descending date per default, so to get the latest post:
// Get first post $post = Post::all()->first();
🚦 Routes
The package routes are ampersand.index
and ampersand.show
:
{{ route('ampersand.index') }} // http://mysite.test/blog @foreach ($posts as $post) // The show-route accepts either a Olssonm\Ampersand\Models\Post-object // or a string; the post's slug {{ route('ampersand.show', $post) }} // http://mysite.test/blog/post-slug {{ route('ampersand.show', 'post-slug') }} // http://mysite.test/blog/post-slug @endforeach
Defining your own routes
The default routes are registered with the ampersand-name and the default web-middleware group.
If you by any reason want to override this (for example if you want to have your articles behind a login or maybe you don't use the standard web-middleware group), you may set register_routes
to false
in ampersand.php, and then register them yourself:
// /routes/web.php use Olssonm\Ampersand\Http\Controllers\PostController; Route::group(['middleware' => 'can:read', function() { Route::get('/articles', [PostController::class, 'index'])->name('article.index'); Route::get('/articles/{post}', [PostController::class, 'show'])->name('article.show'); }]); // A link to the blog index in some view {{ route('article.index') }} // http://mysite.test/articles
See it in action
Sites in the wild that uses Ampersand
Do you use Ampersand and want your site featured here? Submit a PR!
License
The MIT License (MIT). Please see the LICENSE.md for more information.
© 2021 Marcus Olsson.