Download the PHP package enadstack/blogify without Composer

On this page you can find all versions of the php package enadstack/blogify. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.

FAQ

After the download, you have to make one include require_once('vendor/autoload.php');. After that you have to import the classes with use statements.

Example:
If you use only one package a project is not needed. But if you use more then one package, without a project it is not possible to import the classes with use statements.

In general, it is recommended to use always a project to download your libraries. In an application normally there is more than one library needed.
Some PHP packages are not free to download and because of that hosted in private repositories. In this case some credentials are needed to access such packages. Please use the auth.json textarea to insert credentials, if a package is coming from a private repository. You can look here for more information.

  • Some hosting areas are not accessible by a terminal or SSH. Then it is not possible to use Composer.
  • To use Composer is sometimes complicated. Especially for beginners.
  • Composer needs much resources. Sometimes they are not available on a simple webspace.
  • If you are using private repositories you don't need to share your credentials. You can set up everything on our site and then you provide a simple download link to your team member.
  • Simplify your Composer build process. Use our own command line tool to download the vendor folder as binary. This makes your build process faster and you don't need to expose your credentials for private repositories.
Please rate this library. Is it a good library?

Informations about the package blogify

Blogify

A headless content engine for Laravel SaaS products. Articles, taxonomy, media and SEO, for both platform-level and per-tenant content, with first-class RTL/Arabic support.

It ships no design. No views, no routes, no controllers, no admin panel — your app owns rendering.


The problem it solves

The same engine has to serve three shapes without forking:

Shape Who owns a post
A single site with a blog nobody — every post is "the site's"
A platform writing its own SEO content the platform
Each tenant writing their own that doctor, lawyer, or clinic

Blogify models this with one nullable polymorphic owner. NULL means platform-level. Anything else — a Tenant, a User, a Clinic — owns its own blog.

The owner columns exist in every mode, so a single-tenant site can become multi-tenant later without a new migration.


Tenancy

Three modes

mode scoping owner columns
single none always NULL
shared one database, a global scope per owner populated
isolated none — the tenant database already isolates still populated

isolated is for database-per-tenant setups. Publish the migrations into the tenant path:

Resolvers

Blogify takes no dependency on any tenancy package. Pick the resolver that matches how your app already works:

Resolver Use when
NullOwnerResolver single-tenant, or database-per-tenant
ContainerOwnerResolver a middleware binds the tenant: app()->instance('currentTenant', $tenant)
AuthOwnerResolver the owner hangs off the user: $user->tenant, $user->lawyer
CallbackOwnerResolver anything else — see below
StanclOwnerResolver stancl/tenancy
SpatieOwnerResolver spatie/laravel-multitenancy

The last two are guarded by class_exists and degrade to platform-level when the package is absent, so they are safe to reference either way.

For resolution logic none of them express — a public site that resolves by HTTP host, say — register a callback in a service provider:

The callback lives on the class rather than in the config file because a closure in config breaks php artisan config:cache.

Reading across owners

In shared mode every query is scoped to the resolved owner, strictly — a tenant's blog shows only their own posts, never the platform's. Escape hatches are explicit:

Anything running outside a request — a queued job, a scheduled command — has no owner context, so it must use allOwners() or it will silently see only platform rows. blogify:publish-scheduled already does.


Content

Posts and translations

Locale-independent facts live on the post; everything else lives in a translation row.

Translations are rows, not JSON columns. A slug in a JSON column cannot be uniquely indexed and cannot be looked up through an index; one row per locale gives each language its own indexed slug, its own meta fields, and its own publish flag — so the Arabic can go live while the English is still being written.

Slugs keep their script

Str::slug forces ASCII, which mangles Arabic into unreadable transliteration and drops Hebrew and CJK entirely:

Blogify preserves Unicode letters instead, while still folding accents on Latin input:

Slugs are unique per owner and locale, so two tenants can both publish about-us.

Taxonomy

One blogify_terms table serves every taxonomy, discriminated by a taxonomy column. Adding one is a config change, not a migration.

Terms are owned like posts are, so the platform can define shared categories (owner_key = '*') while each tenant adds their own.

Media

A lean blogify_media table behind a MediaAdapter contract.

Alt text and captions are JSON rather than translation rows — unlike slugs they are never uniquely indexed or looked up, so a separate table would buy nothing.


SEO

Everything returns arrays. Rendering is yours.

hreflang alternates come straight from the sibling translation rows — the payoff from storing translations as rows.

Renaming a slug does not have to 404

Every retired slug is recorded, so the old URL can redirect instead of breaking every inbound link:

Finding a post

A single-table indexed lookup with no join, because owner_key is denormalised onto the translations table.


Configuration worth knowing about

database.key_type — decide before you migrate

Blogify's own tables can be keyed with bigints, ULIDs or UUIDs, to match the rest of your schema. This is read by the migrations, so it has to be set before php artisan migrate and cannot be changed afterwards without a manual migration. blogify:install asks.

Owner and author columns are always string(40) regardless, so a ULID-keyed tenant and a bigint-keyed user can both own content in the same table.

require_owner

In shared mode, throws rather than silently writing platform content when the resolver returns null. Useful for catching a missing middleware early. Leave it off if the platform also publishes.

Everything else

Table names, model classes, locales, RTL languages, post types, taxonomies, reading speed and the sitemap chunk size are all configurable. The published config explains each one.


Commands

Command Purpose
blogify:install Publish and configure config/blogify.php. Fully scriptable via options.
blogify:publish-scheduled Promote scheduled posts whose date has arrived. Auto-scheduled via blogify.schedule.publish_cron.
blogify:sitemap Write a sitemap for platform-level content.

Per-tenant sitemaps need your URL scheme, which the package cannot know — build those from Blogify::sitemap($owner, $urlBuilder).

Events

PostPublished, PostUnpublished, PostDeleted (with $forced distinguishing a soft delete), TermCreated.


Routing note

Blogify registers no routes. If you add your own, mind the ordering — a catch-all like this will swallow /blog:

Register your blog routes before any such group.

Publish tags

blogify-config, blogify-migrations, blogify-migrations-tenant, blogify-translations

Requirements

PHP 8.2+, Laravel 11/12/13.

Testing

License

MIT.


All versions of blogify with dependencies

PHP Build Version
Package Version
Requires php Version ^8.2
illuminate/contracts Version ^11.0|^12.0|^13.0
illuminate/database Version ^11.0|^12.0|^13.0
illuminate/events Version ^11.0|^12.0|^13.0
illuminate/support Version ^11.0|^12.0|^13.0
Composer command for our command line client (download client) This client runs in each environment. You don't need a specific PHP version etc. The first 20 API calls are free. Standard composer command

The package enadstack/blogify contains the following files

Loading the files please wait ...