nasirkhan/laravel-starter
Laravel 13 modular starter with separated frontend/backend. Includes auth & authorization, user/role management, admin backend, backups, log viewer, and custom artisan commands (install, update, module builder). Use as a base to build reusable modules.
Installation
composer create-project nasirkhan/laravel-starter
php artisan starter:install
.env setup, database configuration, and asset compilation.First Use Case: Create a Module
php artisan module:build Blog --force
Backend/BlogController.php, Frontend/BlogController.php)routes/backend/blog.php, routes/frontend/blog.php)resources/views/backend/blog/, resources/views/frontend/blog/)database/migrations/xxxx_create_blog_posts_table.php)Key Directories to Explore
modules/ – Default modules like Auth, Article, Settings.app/Http/Controllers/Backend/ – Admin controllers.app/Http/Controllers/Frontend/ – Public controllers.app/Livewire/ – Reusable components (e.g., Backend/Dashboard/Stats).resources/views/ – Separated backend (backend/) and frontend (frontend/).php artisan module:build [module-name] --force
app/Modules/[ModuleName]/ (e.g., app/Modules/Blog/Http/Controllers/Backend/).resources/views/backend/blog/ or resources/views/frontend/blog/.// In routes/backend.php or routes/frontend.php
Route::module('blog', 'Blog');
// routes/backend.php
Route::prefix('admin')->middleware(['auth', 'admin'])->group(function () {
Route::resource('posts', 'Backend\PostController');
});
// routes/frontend.php
Route::get('blog', 'Frontend\BlogController@index')->name('blog.index');
app/Http/Controllers/ or modularize further.php artisan make:livewire Backend/Post/Index
<livewire:backend.post.index />
Backend/Dashboard/Stats (for admin dashboards).Backend/Settings/General (for configuration panels).php artisan starter:assign-permission user@user.com create_post
php artisan starter:create-role editor
database/seeders/MenuDatabaseSeeder.php.<livewire:backend.menu />
app/Providers/AppServiceProvider or user preferences.dark:bg-gray-800).<livewire:frontend.language-switcher />
// routes/api.php
Route::middleware('auth:sanctum')->group(function () {
Route::apiResource('posts', 'Api\PostController');
});
config/sanctum.php is configured.HasApiTokens trait in models.// tests/Unit/Modules/Blog/PostTest.php
public function test_post_creation()
{
$post = Post::factory()->create();
$this->assertDatabaseHas('posts', ['id' => $post->id]);
}
// tests/Feature/Blog/PostTest.php
public function test_post_page_loading()
{
$response = $this->get('/blog/post/1');
$response->assertStatus(200);
}
// tests/Browser/Backend/PostTest.php
public function test_admin_can_create_post()
{
$this->browse(function (Browser $browser) {
$browser->loginAs(User::first())
->visit('/admin/posts/create')
->type('title', 'Test Post')
->press('Save')
->assertSee('Test Post');
});
}
Module Namespace Conflicts
Auth module vs. Illuminate\Auth).Modules\Auth\ instead of Auth\).php artisan module:build with unique names (e.g., BlogPosts instead of Blog).Livewire Component Caching
php artisan view:clear
php artisan cache:clear
wire:ignore for dynamic content to bypass caching:
<div wire:ignore>{{ $dynamicContent }}</div>
Permission Cache Stale Data
php artisan cache:forget spatie.permission.cache
php artisan config:clear
starter:update-permissions command to refresh:
php artisan starter:update-permissions
Frontend Asset Compilation
npm run dev or npm run build may fail silently.node_modules is clean:
rm -rf node_modules package-lock.json
npm install
npm run format for Blade templates if Prettier fails.package.json for debugging:
"scripts": {
"dev": "vite",
"debug": "vite --force"
}
Database Seed Order
--fresh to reset the database:
php artisan db:seed --fresh
php artisan db:seed-essential --fresh
Docker/Sail Quirks
.env changes.sail build --no-cache
sail up -d
.env is mounted in docker-compose.yml:
volumes:
- ./.env:/opt/app/.env
Livewire Debugging
config/livewire.php:
'log' => env('LIVEWIRE_LOG', true),
storage/logs/livewire.log.Route Debugging
php artisan route:list
php artisan route:list --module=blog
Permission Debugging
dd(auth()->user()->getAllPermissions()->pluck('name'));
php artisan starter:list-permissions
Module Debugging
dd(app('modules')->get('blog'));
Route::get('/debug-module', function () {
return app('modules')->get('blog')->getRoutes();
});
php artisan vendor:publish --tag=module-stubs
How can I help you explore Laravel packages today?