• Stars
    star
    454
  • Rank 96,373 (Top 2 %)
  • Language
    PHP
  • License
    MIT License
  • Created over 7 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Rinvex Categorizable is a polymorphic Laravel package, for category management. You can categorize any eloquent model with ease, and utilize the power of Nested Sets, and the awesomeness of Sluggable, and Translatable models out of the box.

Rinvex Categories

Rinvex Categories is a polymorphic Laravel package, for category management. You can categorize any eloquent model with ease, and utilize the power of Nested Sets, and the awesomeness of Sluggable, and Translatable models out of the box.

Packagist Scrutinizer Code Quality Travis StyleCI License

Installation

  1. Install the package via composer:

    composer require rinvex/laravel-categories
  2. Publish resources (migrations and config files):

    php artisan rinvex:publish:categories
  3. Execute migrations via the following command:

    php artisan rinvex:migrate:categories
  4. Done!

Usage

To add categories support to your eloquent models simply use \Rinvex\Categories\Traits\Categorizable trait.

Manage your categories

Your categories are just normal eloquent models, so you can deal with it like so. Nothing special here!

Notes: since Rinvex Categories extends and utilizes other awesome packages, checkout the following documentations for further details:

Manage your categorizable model

The API is intutive and very straightforward, so let's give it a quick look:

// Get all categories
$allCategories = app('rinvex.categories.category')->all();

// Get instance of your model
$post = new \App\Models\Post::find(123);

// Get attached categories collection
$post->categories;

// Get attached categories query builder
$post->categories();

You can attach categories in various ways:

// Single category id
$post->attachCategories(1);

// Multiple category IDs array
$post->attachCategories([1, 2, 5]);

// Multiple category IDs collection
$post->attachCategories(collect([1, 2, 5]));

// Single category model instance
$categoryInstance = app('rinvex.categories.category')->first();
$post->attachCategories($categoryInstance);

// Single category slug
$post->attachCategories('test-category');

// Multiple category slugs array
$post->attachCategories(['first-category', 'second-category']);

// Multiple category slugs collection
$post->attachCategories(collect(['first-category', 'second-category']));

// Multiple category model instances
$categoryInstances = app('rinvex.categories.category')->whereIn('id', [1, 2, 5])->get();
$post->attachCategories($categoryInstances);

Notes:

  • The attachCategories() method attach the given categories to the model without touching the currently attached categories, while there's the syncCategories() method that can detach any records that's not in the given items, this method takes a second optional boolean parameter that's set detaching flag to true or false.
  • To detach model categories you can use the detachCategories() method, which uses exactly the same signature as the attachCategories() method, with additional feature of detaching all currently attached categories by passing null or nothing to that method as follows: $post->detachCategories();.

And as you may have expected, you can check if categories attached:

// Single category id
$post->hasAnyCategories(1);

// Multiple category IDs array
$post->hasAnyCategories([1, 2, 5]);

// Multiple category IDs collection
$post->hasAnyCategories(collect([1, 2, 5]));

// Single category model instance
$categoryInstance = app('rinvex.categories.category')->first();
$post->hasAnyCategories($categoryInstance);

// Single category slug
$post->hasAnyCategories('test-category');

// Multiple category slugs array
$post->hasAnyCategories(['first-category', 'second-category']);

// Multiple category slugs collection
$post->hasAnyCategories(collect(['first-category', 'second-category']));

// Multiple category model instances
$categoryInstances = app('rinvex.categories.category')->whereIn('id', [1, 2, 5])->get();
$post->hasAnyCategories($categoryInstances);

Notes:

  • The hasAnyCategories() method check if ANY of the given categories are attached to the model. It returns boolean true or false as a result.
  • Similarly the hasAllCategories() method uses exactly the same signature as the hasAnyCategories() method, but it behaves differently and performs a strict comparison to check if ALL of the given categories are attached.

Advanced usage

Generate category slugs

Rinvex Categories auto generates slugs and auto detect and insert default translation for you if not provided, but you still can pass it explicitly through normal eloquent create method, as follows:

app('rinvex.categories.category')->create(['name' => ['en' => 'My New Category'], 'slug' => 'custom-category-slug']);

Note: Check Sluggable package for further details.

Smart parameter detection

Rinvex Categories methods that accept list of categories are smart enough to handle almost all kinds of inputs as you've seen in the above examples. It will check input type and behave accordingly.

Retrieve all models attached to the category

You may encounter a situation where you need to get all models attached to certain category, you do so with ease as follows:

$category = app('rinvex.categories.category')->find(1);
$category->entries(\App\Models\Post::class)->get();

Query scopes

Yes, Rinvex Categories shipped with few awesome query scopes for your convenience, usage example:

// Single category id
$post->withAnyCategories(1)->get();

// Multiple category IDs array
$post->withAnyCategories([1, 2, 5])->get();

// Multiple category IDs collection
$post->withAnyCategories(collect([1, 2, 5]))->get();

// Single category model instance
$categoryInstance = app('rinvex.categories.category')->first();
$post->withAnyCategories($categoryInstance)->get();

// Single category slug
$post->withAnyCategories('test-category')->get();

// Multiple category slugs array
$post->withAnyCategories(['first-category', 'second-category'])->get();

// Multiple category slugs collection
$post->withAnyCategories(collect(['first-category', 'second-category']))->get();

// Multiple category model instances
$categoryInstances = app('rinvex.categories.category')->whereIn('id', [1, 2, 5])->get();
$post->withAnyCategories($categoryInstances)->get();

Notes:

  • The withAnyCategories() scope finds posts with ANY attached categories of the given. It returns normally a query builder, so you can chain it or call get() method for example to execute and get results.
  • Similarly there's few other scopes like withAllCategories() that finds posts with ALL attached categories of the given, withoutCategories() which finds posts without ANY attached categories of the given, and lastly withoutAnyCategories() which find posts without ANY attached categories at all. All scopes are created equal, with same signature, and returns query builder.

Category translations

Manage category translations with ease as follows:

$category = app('rinvex.categories.category')->find(1);

// Update title translations
$category->setTranslation('name', 'en', 'New English Category Title')->save();

// Alternatively you can use default eloquent update
$category->update([
    'name' => [
        'en' => 'New Category',
        'ar' => 'تصنيف جديد',
    ],
]);

// Get single category translation
$category->getTranslation('name', 'en');

// Get all category translations
$category->getTranslations('name');

// Get category title in default locale
$category->name;

Note: Check Translatable package for further details.


Manage your nodes/nestedsets

Inserting categories

Moving and inserting categories includes several database queries, so transaction is automatically started when category is saved. It is safe to use global transaction if you work with several models.

Another important note is that structural manipulations are deferred until you hit save on model (some methods implicitly call save and return boolean result of the operation).

If model is successfully saved it doesn't mean that category was moved. If your application depends on whether the category has actually changed its position, use hasMoved method:

if ($category->save()) {
    $moved = $category->hasMoved();
}

Creating categories

When you simply create a category, it will be appended to the end of the tree:

app('rinvex.categories.category')->create($attributes); // Saved as root

$category = app('rinvex.categories.category')->fill($attributes);
$category->save(); // Saved as root

In this case the category is considered a root which means that it doesn't have a parent.

Making a root from existing category

The category will be appended to the end of the tree:

// #1 Implicit save
$category->saveAsRoot();

// #2 Explicit save
$category->makeRoot()->save();

Appending and prepending to the specified parent

If you want to make category a child of other category, you can make it last or first child. Suppose that $parent is some existing category, there are few ways to append a category:

// #1 Using deferred insert
$category->appendToNode($parent)->save();

// #2 Using parent category
$parent->appendNode($category);

// #3 Using parent's children relationship
$parent->children()->create($attributes);

// #5 Using category's parent relationship
$category->parent()->associate($parent)->save();

// #6 Using the parent attribute
$category->parent_id = $parent->getKey();
$category->save();

// #7 Using static method
app('rinvex.categories.category')->create($attributes, $parent);

And only a couple ways to prepend:

// #1 Using deferred insert
$category->prependToNode($parent)->save();

// #2 Using parent category
$parent->prependNode($category);

Inserting before or after specified category

You can make $category to be a neighbor of the $neighbor category. Suppose that $neighbor is some existing category, while target category can be fresh. If target category exists, it will be moved to the new position and parent will be changed if it's required.

# Explicit save
$category->afterNode($neighbor)->save();
$category->beforeNode($neighbor)->save();

# Implicit save
$category->insertAfterNode($neighbor);
$category->insertBeforeNode($neighbor);

Building a tree from array

When using static method create on category, it checks whether attributes contains children key. If it does, it creates more categories recursively, as follows:

$category = app('rinvex.categories.category')->create([
    'name' => [
        'en' => 'New Category Title',
    ],

    'children' => [
        [
            'name' => 'Bar',

            'children' => [
                [ 'name' => 'Baz' ],
            ],
        ],
    ],
]);

$category->children now contains a list of created child categories.

Rebuilding a tree from array

You can easily rebuild a tree. This is useful for mass-changing the structure of the tree. Given the $data as an array of categories, you can build the tree as follows:

$data = [
    [ 'id' => 1, 'name' => 'foo', 'children' => [ ... ] ],
    [ 'name' => 'bar' ],
];

app('rinvex.categories.category')->rebuildTree($data, $delete);

There is an id specified for category with the title of foo which means that existing category will be filled and saved. If category does not exists ModelNotFoundException is thrown. Also, this category has children specified which is also an array of categories; they will be processed in the same manner and saved as children of category foo.

Category bar has no primary key specified, so it will treated as a new one, and be created.

$delete shows whether to delete categories that are already exists but not present in $data. By default, categories aren't deleted.

Retrieving categories

In some cases we will use an $id variable which is an id of the target category.

Ancestors

Ancestors make a chain of parents to the category. Helpful for displaying breadcrumbs to the current category.

// #1 Using accessor
$result = $category->getAncestors();

// #2 Using a query
$result = $category->ancestors()->get();

// #3 Getting ancestors by primary key
$result = app('rinvex.categories.category')->ancestorsOf($id);

Descendants

Descendants are all categories in a sub tree, i.e. children of category, children of children, etc.

// #1 Using relationship
$result = $category->descendants;

// #2 Using a query
$result = $category->descendants()->get();

// #3 Getting descendants by primary key
$result = app('rinvex.categories.category')->descendantsOf($id);

// #3 Get descendants and the category by id
$result = app('rinvex.categories.category')->descendantsAndSelf($id);

Descendants can be eagerly loaded:

$categories = app('rinvex.categories.category')->with('descendants')->whereIn('id', $idList)->get();

Siblings

Siblings are categories that have same parent.

$result = $category->getSiblings();

$result = $category->siblings()->get();

To get only next siblings:

// Get a sibling that is immediately after the category
$result = $category->getNextSibling();

// Get all siblings that are after the category
$result = $category->getNextSiblings();

// Get all siblings using a query
$result = $category->nextSiblings()->get();

To get previous siblings:

// Get a sibling that is immediately before the category
$result = $category->getPrevSibling();

// Get all siblings that are before the category
$result = $category->getPrevSiblings();

// Get all siblings using a query
$result = $category->prevSiblings()->get();

Getting related models from other table

Imagine that each category has many products. I.e. HasMany relationship is established. How can you get all products of $category and every its descendant? Easy!

// Get ids of descendants
$categories = $category->descendants()->pluck('id');

// Include the id of category itself
$categories[] = $category->getKey();

// Get products
$goods = Product::whereIn('category_id', $categories)->get();

Now imagine that each category has many posts. I.e. morphToMany relationship is established this time. How can you get all posts of $category and every its descendant? Is that even possible?! Sure!

// Get ids of descendants
$categories = $category->descendants()->pluck('id');

// Include the id of category itself
$categories[] = $category->getKey();

// Get posts
$posts = \App\Models\Post::withCategories($categories)->get();

Including category depth

If you need to know at which level the category is:

$result = app('rinvex.categories.category')->withDepth()->find($id);

$depth = $result->depth;

Root category will be at level 0. Children of root categories will have a level of 1, etc. To get categories of specified level, you can apply having constraint:

$result = app('rinvex.categories.category')->withDepth()->having('depth', '=', 1)->get();

Default order

Each category has it's own unique _lft value that determines its position in the tree. If you want category to be ordered by this value, you can use defaultOrder method on the query builder:

// All categories will now be ordered by lft value
$result = app('rinvex.categories.category')->defaultOrder()->get();

You can get categories in reversed order:

$result = app('rinvex.categories.category')->reversed()->get();
Shifting a category

To shift category up or down inside parent to affect default order:

$bool = $category->down();
$bool = $category->up();

// Shift category by 3 siblings
$bool = $category->down(3);

The result of the operation is boolean value of whether the category has changed its position.

Constraints

Various constraints that can be applied to the query builder:

  • whereIsRoot() to get only root categories;
  • whereIsAfter($id) to get every category (not just siblings) that are after a category with specified id;
  • whereIsBefore($id) to get every category that is before a category with specified id.

Descendants constraints:

$result = app('rinvex.categories.category')->whereDescendantOf($category)->get();
$result = app('rinvex.categories.category')->whereNotDescendantOf($category)->get();
$result = app('rinvex.categories.category')->orWhereDescendantOf($category)->get();
$result = app('rinvex.categories.category')->orWhereNotDescendantOf($category)->get();

// Include target category into result set
$result = app('rinvex.categories.category')->whereDescendantOrSelf($category)->get();

Ancestor constraints:

$result = app('rinvex.categories.category')->whereAncestorOf($category)->get();

$category can be either a primary key of the model or model instance.

Building a tree

After getting a set of categories, you can convert it to tree. For example:

$tree = app('rinvex.categories.category')->get()->toTree();

This will fill parent and children relationships on every category in the set and you can render a tree using recursive algorithm:

$categories = app('rinvex.categories.category')->get()->toTree();

$traverse = function ($categories, $prefix = '-') use (&$traverse) {
    foreach ($categories as $category) {
        echo PHP_EOL.$prefix.' '.$category->name;

        $traverse($category->children, $prefix.'-');
    }
};

$traverse($categories);

This will output something like this:

- Root
-- Child 1
--- Sub child 1
-- Child 2
- Another root
Building flat tree

Also, you can build a flat tree: a list of categories where child categories are immediately after parent category. This is helpful when you get categories with custom order (i.e. alphabetically) and don't want to use recursion to iterate over your categories.

$categories = app('rinvex.categories.category')->get()->toFlatTree();
Getting a subtree

Sometimes you don't need whole tree to be loaded and just some subtree of specific category:

$root = app('rinvex.categories.category')->find($rootId);
$tree = $root->descendants->toTree($root);

Now $tree contains children of $root category.

If you don't need $root category itself, do following instead:

$tree = app('rinvex.categories.category')->descendantsOf($rootId)->toTree($rootId);

Deleting categories

To delete a category:

$category->delete();

IMPORTANT! Any descendant that category has will also be deleted!

IMPORTANT! Categories are required to be deleted as models, don't try do delete them using a query like so:

app('rinvex.categories.category')->where('id', '=', $id)->delete();

That will break the tree!

Helper methods

// Check if category is a descendant of other category
$bool = $category->isDescendantOf($parent);

// Check whether the category is a root:
$bool = $category->isRoot();

// Other checks
$category->isChildOf($other);
$category->isAncestorOf($other);
$category->isSiblingOf($other);

Checking consistency

You can check whether a tree is broken (i.e. has some structural errors):

// Check if tree is broken
$bool = app('rinvex.categories.category')->isBroken();

// Get tree error statistics
$data = app('rinvex.categories.category')->countErrors();

Tree error statistics will return an array with following keys:

  • oddness -- the number of categories that have wrong set of lft and rgt values
  • duplicates -- the number of categories that have same lft or rgt values
  • wrong_parent -- the number of categories that have invalid parent_id value that doesn't correspond to lft and rgt values
  • missing_parent -- the number of categories that have parent_id pointing to category that doesn't exists

Fixing tree

Category tree can now be fixed if broken. Using inheritance info from parent_id column, proper _lft and _rgt values are set for every category.

app('rinvex.categories.category')->fixTree();

Note: Check Nested Sets package for further details.

Changelog

Refer to the Changelog for a full history of the project.

Support

The following support channels are available at your fingertips:

Contributing & Protocols

Thank you for considering contributing to this project! The contribution guide can be found in CONTRIBUTING.md.

Bug reports, feature requests, and pull requests are very welcome.

Security Vulnerabilities

We want to ensure that this package is secure for everyone. If you've discovered a security vulnerability in this package, we appreciate your help in disclosing it to us in a responsible manner.

Publicly disclosing a vulnerability can put the entire community at risk. If you've discovered a security concern, please email us at [email protected]. We'll work with you to make sure that we understand the scope of the issue, and that we fully address your concern. We consider correspondence sent to [email protected] our highest priority, and work to address any issues that arise as quickly as possible.

After a security vulnerability has been corrected, a security hotfix release will be deployed as soon as possible.

About Rinvex

Rinvex is a software solutions startup, specialized in integrated enterprise solutions for SMEs established in Alexandria, Egypt since June 2016. We believe that our drive The Value, The Reach, and The Impact is what differentiates us and unleash the endless possibilities of our philosophy through the power of software. We like to call it Innovation At The Speed Of Life. That’s how we do our share of advancing humanity.

License

This software is released under The MIT License (MIT).

(c) 2016-2022 Rinvex LLC, Some rights reserved.

More Repositories

1

countries

Rinvex Country is a simple and lightweight package for retrieving country details with flexibility. A whole bunch of data including name, demonym, capital, iso codes, dialling codes, geo data, currencies, flags, emoji, and other attributes for all 250 countries worldwide at your fingertips.
PHP
1,640
star
2

laravel-subscriptions

⚠️ [ABANDONED] Rinvex Subscribable is a flexible plans and subscription management system for Laravel, with the required tools to run your SAAS like services efficiently. It's simple architecture, accompanied by powerful underlying to afford solid platform for your business.
PHP
726
star
3

laravel-repositories

⚠️ [ABANDONED] Rinvex Repository is a simple, intuitive, and smart implementation of Active Repository with extremely flexible & granular caching system for Laravel, used to abstract the data layer, making applications more flexible to maintain.
PHP
667
star
4

laravel-bookings

⚠️ [ABANDONED] Rinvex Bookable is a generic resource booking system for Laravel, with the required tools to run your SAAS like services efficiently. It's simple architecture, accompanied by powerful underlying to afford solid platform for your business.
PHP
458
star
5

laravel-attributes

⚠️ [ABANDONED] Rinvex Attributable is a robust, intelligent, and integrated Entity-Attribute-Value model (EAV) implementation for Laravel Eloquent, with powerful underlying for managing entity attributes implicitly as relations with ease. It utilizes the power of Laravel Eloquent, with smooth and seamless integration.
PHP
434
star
6

laravel-addresses

⚠️ [ABANDONED] Rinvex Addressable is a polymorphic Laravel package, for addressbook management. You can add addresses to any eloquent model with ease.
PHP
240
star
7

laravel-statistics

⚠️ [ABANDONED] Rinvex Statistics is a lightweight, yet detailed package for tracking and recording user visits across your Laravel application. With only one simple query per request, important data is being stored, and later a cronjob crush numbers to extract meaningful stories from within the haystack.
PHP
212
star
8

laravel-auth

A powerful authentication, authorization and verification package built on top of Laravel. It provides developers with Role Based Access Control, Two-Factor Authentication, Social Authentication, and much more, compatible Laravel’s standard API and fully featured out of the box.
PHP
132
star
9

laravel-cacheable

⚠️ [ABANDONED] Rinvex Cacheable is a granular, intuitive, and fluent caching system for eloquent models. Simple, but yet powerful, plug-n-play with no hassle.
PHP
111
star
10

cortex-classic

Rinvex Cortex is a solid foundation for enterprise solutions, that provides a flexible and extensible architecture for building multi-lingual, multi-tenant applications with content management, themeable views, application modules and much more.
PHP
94
star
11

laravel-tenants-classic

Rinvex Tenantable is a contextually intelligent polymorphic Laravel package, for single db multi-tenancy. You can completely isolate tenants data with ease using the same database, with full power and control over what data to be centrally shared, and what to be tenant related and therefore isolated from others.
PHP
82
star
12

laravel-support

Rinvex common support helpers, contracts, and traits required by various Rinvex packages. Validator functionality, and basic controller included out-of-the-box.
PHP
73
star
13

universities

Rinvex University is a simple and lightweight package for retrieving university details with flexibility. A whole bunch of data including name, country, state, email, website, telephone, address, and much more attributes for the 17k+ known universities worldwide at your fingertips.
PHP
57
star
14

obsolete-larapulse

⚠️ [ABANDONED] This project is abandoned and no longer maintained. The author suggests following https://twitter.com/LaravelLog on twitter for @laravelphp framework specific changes instead.
PHP
41
star
15

laravel-widgets

⚠️ [ABANDONED] Rinvex Widgets is a powerful and easy to use widget system, that combines the both power of code logic and the flexibility of template views. You can create asynchronous widgets, reloadable widgets, and use the console generator to auto generate your widgets, all out of the box.
PHP
40
star
16

laravel-pages

Rinvex Pages is an integral part of your content management system (CMS), it affords an easy, yet powerful way to create and manage pages with full control over their URLs, active status, titles, content, and other attributes.
PHP
38
star
17

authy

Rinvex Authy is a simple wrapper for @Authy TOTP API, the best rated Two-Factor Authentication service for consumers, simplest 2fa Rest API for developers and a strong authentication platform for the enterprise.
PHP
36
star
18

laravel-authy

Rinvex Authy is a simple wrapper for @Authy TOTP API, the best rated Two-Factor Authentication service for consumers, simplest 2fa Rest API for developers and a strong authentication platform for the enterprise.
PHP
35
star
19

laravel-contacts

⚠️ [ABANDONED] Rinvex Contacts is a polymorphic Laravel package, for contact management system. You can add contacts to any eloquent model with ease.
PHP
30
star
20

laravel-menus

Rinvex Menus is a simple menu builder package for Laravel, that supports hierarchical structure, ordering, and styling with full flexibility using presenters for easy styling and custom structure of menu rendering.
PHP
30
star
21

languages

Rinvex Language is a simple and lightweight package for retrieving language details with flexibility. A whole bunch of data including name, native, iso codes, language family, language script, language cultures, and other attributes for the 180+ known languages worldwide at your fingertips.
PHP
29
star
22

laravel-tags

Rinvex Taggable is a polymorphic Laravel package, for tag management. You can tag any eloquent model with ease, and utilize the awesomeness of Sluggable, and Translatable models out of the box.
PHP
27
star
23

laravel-forms

⚠️ [ABANDONED] Rinvex Forms is a dynamic form builder for Laravel, it's like the missing gem, the possibilities of using it are endless! With flexible API and powerful features you can build almost every kind of complex form with ease.
PHP
15
star
24

punnet

Rinvex Punnet is opinionated, lightweight, yet powerful, and performant light speed docker environment for PHP applications.
Shell
14
star
25

laravel-testimonials

⚠️ [ABANDONED] Rinvex Testimonials is a Laravel package for managing testimonials. Customers can give you testimonials, and you can approve or disapprove each individually. Testimonials are good for showing the passion and love your service gets from customers, encouraging others to join the hype!
PHP
13
star
26

cortex-auth-classic

Cortex Fort is a frontend layer for the powerful authentication, authorization and verification package rinvex/fort on top of Laravel. It has all required controllers, views, routes, and other required assets to run a fully functional user management system with complete dashboard out of the box.
PHP
12
star
27

cortex-tenants-classic

Cortex Tenantable is a frontend layer for the contextually intelligent polymorphic Laravel package, for single db multi-tenancy. You can completely isolate tenants data with ease using the same database, with full power and control over what data to be centrally shared, and what to be tenant related and therefore isolated from others
Blade
12
star
28

laravel-composer

Rinvex Composer is an intuitive package that utilizes Composer Plugin API to support additional actions during installation, such as installing packages outside of the default vendor library and running custom scripts during install, update, and uninstall processes.
PHP
11
star
29

cortex-attributes-classic

Cortex Attributable is a frontend layer for the robust, intelligent, and integrated Entity-Attribute-Value model (EAV) implementation for Laravel Eloquent, with powerful underlying for managing entity attributes implicitly as relations with ease. It utilizes the power of Laravel Eloquent, with smooth and seamless integration.
PHP
9
star
30

cortex-bookings-classic

Cortex Bookings is a front layer of a generic resource booking system for Laravel, with the required tools to run your SAAS like services efficiently. It's simple architecture, accompanied by powerful underlying to afford solid platform for your business.
PHP
8
star
31

cortex-categories-classic

Cortex Categorizable is a frontend layer for the polymorphic Laravel package, for category management. You can categorize any eloquent model with ease, and utilize the power of Nested Sets, and the awesomeness of Sluggable, and Translatable models out of the box.
PHP
8
star
32

cortex-foundation-classic

The core foundation of Rinvex Cortex modular application architecture.
PHP
7
star
33

cortex-tags-classic

Cortex Taggable is a frontend layer for the polymorphic Laravel package, for tag management. You can tag any eloquent model with ease, and utilize the awesomeness of Sluggable, and Translatable models out of the box.
PHP
6
star
34

cortex-statistics-classic

Cortex Statistics is a frontend layer for lightweight, yet detailed package for tracking and recording user visits across your Laravel application. With only one simple query per request, important data is being stored, and later a cronjob crush numbers to extract meaningful stories from within the haystack.
PHP
6
star
35

cloudinit

Shell
5
star
36

cortex-pages-classic

Cortex Pages is a frontend layer for an integral part of your Laravel content management system (CMS), it affords an easy, yet powerful way to create and manage pages with full control over their URLs, active status, titles, content, and other attributes.
PHP
5
star
37

laravel-oauth

Rinvex OAuth is an OAuth2 server and API authentication package that is simple and enjoyable to use.
PHP
4
star
38

cortex-oauth-classic

Cortex OAuth is a frontend layer for the OAuth server Laravel package, for API management.
PHP
2
star
39

cortex-contacts-classic

Cortex Contacts is a frontend layer for the polymorphic contact management system. You can add contacts to any eloquent model with ease.
PHP
2
star
40

renamed-country

⚠️ This package is renamed and now maintained at https://github.com/rinvex/countries, author suggests using the new package instead.
PHP
2
star
41

cortex-settings-tenantable-classic

Cortex Settings Tenantable is a new module for rinvex/cortex applications.
PHP
1
star
42

cortex-installer

⚠️ [ABANDONED] Rinvex Cortex Installer is a command line tool that depends on composer to install the Cortex projects seamlessly.
PHP
1
star
43

cortex-console-classic

Cortex Console is a set of powerful tools for administrators and system support staff, to maintain the project through a web console.
PHP
1
star
44

cortex-forms-classic

Cortex Forms is a frontend layer for dynamic form builder for Laravel, it's like the missing gem, the possibilities of using it are endless! With flexible API and powerful features you can build almost every kind of complex form with ease.
PHP
1
star
45

cortex-testimonials-classic

Cortex Testimonials is a frontend layer for managing testimonials. Customers can give you testimonials, and you can approve or disapprove each individually. Testimonials are good for showing the passion and love your service gets from customers, encouraging others to join the hype!
PHP
1
star