Laravel Ownership simplify management of Eloquent model's owner. Group can be an owner of event, user can be an owner of chat room, organization can own licenses. It can be used for many cases not limited by authorship. Make any model as owner and create ownable models in a minutes!
- Features
- Installation
- Usage
- Changelog
- Upgrading
- Contributing
- Testing
- Security
- Credits
- Alternatives
- License
- About CyberCog
- Designed to work with Laravel Eloquent models
- Using contracts to keep high customization capabilities
- Each model can has owners of one type or use polymorphism
- Option to auto-assigning current authenticated user on model creation as owner
- Configurable auto-owner resolve strategy on model creation
- Option to manually assign owner on model creation
- Option to manually skip auto-assigning current user
- Transfer ownership (change owner)
- Make model orphaned (abandon owner)
- Various ownership checks and query scopes
- Following PHP Standard Recommendations:
- Covered with unit tests
First, pull in the package through Composer.
composer require cybercog/laravel-ownership
If you disabled package auto-discovery you can register it manually.
Include the service provider within app/config/app.php
.
'providers' => [
Cog\Laravel\Ownership\Providers\OwnershipServiceProvider::class,
];
Laravel Ownership allows model to have strict owner model type (HasOwner
trait) or use polymorphic relation (HasMorphOwner
trait).
Strict ownership is useful when model can belong to only one model type. Attempt to set owner of not defined model type will throw an exception InvalidOwnerType
.
Example: Only users allowed to create posts.
Polymorphic ownership is useful when model can belong to owners of different types. Example: Users and Organizations can upload applications to marketplace.
At the owner model use CanBeOwner
contract and implement it:
use Cog\Contracts\Ownership\CanBeOwner as CanBeOwnerInterface;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable implements CanBeOwnerInterface
{
// ...
}
Use Ownable
contract in model which will get ownership behavior and implement it or just use HasOwner
trait.
use Cog\Contracts\Ownership\Ownable as OwnableInterface;
use Cog\Laravel\Ownership\Traits\HasOwner;
use Illuminate\Database\Eloquent\Model;
class Article extends Model implements OwnableInterface
{
use HasOwner;
}
Ownable model with strict ownership must have in database additional nullable column to store owner relation:
Schema::table('articles', function (Blueprint $table) {
$table->integer('owned_by_id')->unsigned()->nullable();
$table->index('owned_by_id');
});
By default, owner model will be the same as config('auth.providers.users.model')
provides.
To override default owner model in strict ownership, it's primary key or foreign key extend your ownable model with additional attributes:
use Cog\Contracts\Ownership\Ownable as OwnableInterface;
use Cog\Laravel\Ownership\Traits\HasOwner;
use Illuminate\Database\Eloquent\Model;
class Article extends Model implements OwnableInterface
{
use HasOwner;
protected $ownerModel = Group::class;
protected $ownerPrimaryKey = 'gid';
protected $ownerForeignKey = 'group_id';
}
Use Ownable
contract in model which will get polymorphic ownership behavior and implement it or just use HasMorphOwner
trait.
use Cog\Contracts\Ownership\Ownable as OwnableInterface;
use Cog\Laravel\Ownership\Traits\HasMorphOwner;
use Illuminate\Database\Eloquent\Model;
class Article extends Model implements OwnableInterface
{
use HasMorphOwner;
}
Ownable model with polymorphic ownership must have in database additional nullable columns to store owner relation:
Schema::table('articles', function (Blueprint $table) {
$table->nullableMorphs('owned_by');
});
$article->ownedBy();
$article->owner();
$article->getOwner();
$article->ownedBy;
$article->owner;
$article->changeOwnerTo($owner);
$article->abandonOwner();
$article->hasOwner();
$article->isOwnedBy($owner);
$article->isNotOwnedBy($owner);
$article = new Article;
$article->withDefaultOwner()->save();
Will use resolveDefaultOwner()
method under the hood.
Or provide concrete owner:
$user = User::where('name', 'admin')->first();
$article = new Article;
$article->withDefaultOwner($user)->save();
$article = new Article;
$article->withoutDefaultOwner()->save();
Article::whereOwnedBy($owner)->get();
Article::whereNotOwnedBy($owner)->get();
To set currently authenticated user as owner for ownable model create - extend it with attribute withDefaultOwnerOnCreate
. It works for both strict and polymorphic ownership behavior.
use Cog\Contracts\Ownership\Ownable as OwnableInterface;
use Cog\Laravel\Ownership\Traits\HasOwner;
use Illuminate\Database\Eloquent\Model;
class Article extends Model implements OwnableInterface
{
use HasOwner;
protected $withDefaultOwnerOnCreate = true;
}
To override strategy of getting default owner extend ownable model with resolveDefaultOwner
method:
use Cog\Contracts\Ownership\Ownable as OwnableInterface;
use Cog\Laravel\Ownership\Traits\HasOwner;
use Illuminate\Database\Eloquent\Model;
class Article extends Model implements OwnableInterface
{
use HasOwner;
public $withDefaultOwnerOnCreate = true;
/**
* Resolve entity default owner.
*
* @return \Cog\Contracts\Ownership\CanBeOwner|null
*/
public function resolveDefaultOwner()
{
return \App\User::where('name', 'admin')->first();
}
}
Please see CHANGELOG for more information on what has changed recently.
Please see UPGRADING for detailed upgrade instructions.
Please see CONTRIBUTING for details.
Run the tests with:
vendor/bin/phpunit
If you discover any security related issues, please email open@cybercog.su instead of using the issue tracker.
Anton Komarev |
Prasit Gebsaap |
---|
Laravel Ownership contributors list
Feel free to add more alternatives as Pull Request.
Laravel Ownership
package is open-sourced software licensed under the MIT license by Anton Komarev.Intellectual Property
image licensed under Creative Commons 3.0 by Arthur Shlain.Fat Boss
image licensed under Creative Commons 3.0 by Gan Khoon Lay.
CyberCog is a Social Unity of enthusiasts. Research the best solutions in product & software development is our passion.