This filamentphp app is combined with multi-tenant and shield. Each Tenant has its own roles.
- Shield Features
- Multi-tenant
- Invite User
- php: 8.3
- Node: 20
- Copy .env file
cp .env.example .env
- Edit mysql connection in your .env (credential is based on your sql server)
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=password
- Run
composer install
- Run
npm install
- Run
php artisan key:generate
- Run
php artisan migrate:refresh
- Run
php artisan shield:generate --all
- Run
php artisan serve
- Open
localhost
on your browser
- Install Docker https://laravel.com/docs/11.x/installation#docker-installation-using-sail
- Copy .env file
cp .env.example .env
- Edit mysql connection in your .env (credential is based on your sql server)
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=sail
DB_PASSWORD=password
- Run this command
docker run --rm \
-u "$(id -u):$(id -g)" \
-v "$(pwd):/var/www/html" \
-w /var/www/html \
laravelsail/php83-composer:latest \
composer install --ignore-platform-reqs
- Run
./vendor/bin/sail up -d
to build and start the container - Run
./vendor/bin/sail npm install
- Run
./vendor/bin/sail artisan key:generate
- Run
./vendor/bin/sail artisan migrate:refresh
- Run
./vendor/bin/sail artisan shield:generate --all
- Open
localhost
on your browser
- Always add the
tenant_id
in the newly created migration - Use the
TenantTrait
in the newly created model - In the
Tenant
model, add the HasMany relationship of the newly created model
public function posts(): HasMany {
return $this->hasMany(Post::class);
}
- Create an observer class extend it with
BaseObserver
- Add the newly created
Observer
in theboot
ofAppServiceProvider
. Check laravel document for more info. - You can run
shield:generate --all
to generate policies and permissions
![Screenshot 2024-07-29 at 5 32 22 AM](https://private-user-images.githubusercontent.com/120788000/352871045-5c830ffd-38ab-4be7-a7b5-d3b1b2bc9167.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk2OTcxNzEsIm5iZiI6MTczOTY5Njg3MSwicGF0aCI6Ii8xMjA3ODgwMDAvMzUyODcxMDQ1LTVjODMwZmZkLTM4YWItNGJlNy1hN2I1LWQzYjFiMmJjOTE2Ny5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjE2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxNlQwOTA3NTFaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1kZGJlMTcxZDZiYjVmNTk2NDc4ZGRmMTA3ZDk5MDliZDhlNzA4ODE5YjUzZjFmOWVmNjZiMGJiMTBjNDA0Y2E2JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.1i-UvKtssIhnfqwxXPrHygHP2_eQd-jgHoKaeKfl9K4)
![Screenshot 2024-07-29 at 5 32 34 AM](https://private-user-images.githubusercontent.com/120788000/352871046-489490fd-606b-49d0-b116-10a0164a07a4.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk2OTcxNzEsIm5iZiI6MTczOTY5Njg3MSwicGF0aCI6Ii8xMjA3ODgwMDAvMzUyODcxMDQ2LTQ4OTQ5MGZkLTYwNmItNDlkMC1iMTE2LTEwYTAxNjRhMDdhNC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjE2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxNlQwOTA3NTFaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT01MzI0NWM0OGVmNjE2YWEzM2IyMjBhYjU0MWZkOGUzYWY0MjBmOGQzMjk1YzNiZDY2NTNhYzVjYjUxMjQ4MWU4JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.Jc4shBDvzmE8lwvf6aU08TKqRuoxFSoVLZ-e80ewSVo)
![Screenshot 2024-07-29 at 5 32 50 AM](https://private-user-images.githubusercontent.com/120788000/352871048-a34a8f07-35e2-48d0-8672-4edacdf253ab.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk2OTcxNzEsIm5iZiI6MTczOTY5Njg3MSwicGF0aCI6Ii8xMjA3ODgwMDAvMzUyODcxMDQ4LWEzNGE4ZjA3LTM1ZTItNDhkMC04NjcyLTRlZGFjZGYyNTNhYi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjE2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxNlQwOTA3NTFaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1iOTBjOWE5MDhkNjI5ZWZlN2VjNzkxZmM5MWIyNWNlYmRkOGFkOWEzOWZhYjAwNmM5YjIzMDAzZTBlMjVkMTgyJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.UfvcV9zxjmNkUdhcHew1RcUzR9r3w3JDxyt22pzW4b8)
![Screenshot 2024-07-29 at 5 35 32 AM](https://private-user-images.githubusercontent.com/120788000/352871153-1958633d-a860-41ac-b034-af0e528224b8.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk2OTcxNzEsIm5iZiI6MTczOTY5Njg3MSwicGF0aCI6Ii8xMjA3ODgwMDAvMzUyODcxMTUzLTE5NTg2MzNkLWE4NjAtNDFhYy1iMDM0LWFmMGU1MjgyMjRiOC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjE2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxNlQwOTA3NTFaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0zYzY3OGJkYWI5YTczNDAzYTIxOTIyNzk2YTJjYmY0MGUyYThjMGI2MjI1OTc1MjA5MjhhYzk5NmM4NWMwMGJkJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.CTlvtSWBrxZkAzNQ10H6GI_dRSp1u7EJErC59w9gx8w)
![Screenshot 2024-07-29 at 5 35 40 AM](https://private-user-images.githubusercontent.com/120788000/352871155-9c26a9cd-2071-4806-b171-a7ecc381f220.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk2OTcxNzEsIm5iZiI6MTczOTY5Njg3MSwicGF0aCI6Ii8xMjA3ODgwMDAvMzUyODcxMTU1LTljMjZhOWNkLTIwNzEtNDgwNi1iMTcxLWE3ZWNjMzgxZjIyMC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjE2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxNlQwOTA3NTFaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT04NmViMDljNmU1MDY1NmMzMWVjMTgzNWQ5Y2U1YjRhNTZhMWZkNDQwOGJhZWYzNjllZGY5YmE3MTRlZTU1MDRmJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.J72ZTfnWZpjXxydkRCsfZkd4_yrrkIv9R2gOJoNp5WY)
![Screenshot 2024-07-29 at 5 36 23 AM](https://private-user-images.githubusercontent.com/120788000/352871156-c61b5f53-2527-4b3f-ba7f-ff04d021af03.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk2OTcxNzEsIm5iZiI6MTczOTY5Njg3MSwicGF0aCI6Ii8xMjA3ODgwMDAvMzUyODcxMTU2LWM2MWI1ZjUzLTI1MjctNGIzZi1iYTdmLWZmMDRkMDIxYWYwMy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjE2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxNlQwOTA3NTFaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT02NjdkMzc2ZjA1NGNiODNkODNkZTYxOTE4MDc4N2JjZDllYTYxMWMyMGVhZWNiNTAwNzQzYjZmMGFiY2RkMmM0JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.KOHKJW2-UyttTD9z6912MPe69feOOQ3hoOHpzSdYg3k)