Installation
composer require zhyu/tawa
Publish the package assets and config:
php artisan vendor:publish --provider="Zhyu\Tawa\TawaServiceProvider" --tag="tawa-assets"
php artisan vendor:publish --provider="Zhyu\Tawa\TawaServiceProvider" --tag="tawa-config"
Basic Usage
TawaServiceProvider in config/app.php under providers (if not auto-discovered).php artisan migrate
/admin (default route).First Use Case
Post) and define its CRUD operations via the admin panel.Model Management
app/Models/ and ensure they extend Illuminate\Database\Eloquent\Model.Livewire Integration
Tawa\Components\AdminLayout) for custom admin logic:
namespace App\Http\Livewire\Admin;
use Tawa\Components\AdminLayout;
class CustomComponent extends AdminLayout
{
public function mount()
{
$this->title = "Custom Admin Page";
}
}
resources/views/admin/layouts/app.blade.php.Alpine.js Enhancements
<div x-data="{ open: false }">
<button @click="open = !open">Toggle</button>
<div x-show="open">Content</div>
</div>
Permission System
/admin/roles and /admin/permissions).Route::middleware(['auth', 'can:access-admin'])->group(function () {
Route::get('/admin', [AdminController::class, 'index']);
});
Menu Configuration
config/tawa.php):
'menus' => [
[
'name' => 'Posts',
'route' => 'admin.posts.index',
'icon' => 'fas fa-file-alt',
],
],
php artisan vendor:publish --tag="tawa-views") and modifying resources/views/vendor/tawa/./api/admin/posts).created, deleted) for custom logic:
public function boot()
{
\App\Models\Post::created(function ($post) {
// Custom logic on post creation
});
}
Livewire Component Conflicts
zhyu/tawa (e.g., AdminLayout). Prefix with your namespace (e.g., App\Livewire\Admin\CustomLayout).Alpine.js Scope Issues
x-data with unique IDs or namespaces:
<div x-data="{ open: false }" x-init="$wire.init()">
Permission Caching
php artisan cache:clear
php artisan view:clear
Route Caching
php artisan route:cache), ensure admin routes are not cached or update them manually after changes:
php artisan route:clear
Model Observers
AppServiceProvider after the package’s observers to avoid conflicts:
public function boot()
{
\App\Models\Post::observe(\App\Observers\PostObserver::class);
}
php artisan livewire:discover to regenerate Livewire components if issues arise.x-init to log data:
<div x-data x-init="console.log('Data:', $data)">
app/Http/Kernel.php:
protected $routeMiddleware = [
'can' => \Zhyu\Tawa\Http\Middleware\CheckPermission::class,
];
Custom Admin Panels
Tawa\Components\AdminPanel and registering it in config/tawa.php:
'panels' => [
'custom' => \App\Components\CustomAdminPanel::class,
],
Dynamic Menus
public function boot()
{
\Zhyu\Tawa\Facades\Tawa::extendMenus(function ($menus) {
$menus[] = ['name' => 'Dynamic Menu', 'route' => route('dynamic.route')];
return $menus;
});
}
Custom Fields
app/Providers/TawaServiceProvider.php:
public function boot()
{
\Zhyu\Tawa\Fields\Field::macro('customField', function () {
return new \App\Fields\CustomField();
});
}
Localization
php artisan vendor:publish --tag="tawa-translations") and modifying resources/lang/vendor/tawa/.Asset Overrides
public/vendor/tawa/css/admin.csspublic/vendor/tawa/js/admin.jsHow can I help you explore Laravel packages today?