Installation
composer require milestone/appframe
Publish the package assets and config:
php artisan vendor:publish --provider="Milestone\Appframe\AppframeServiceProvider"
Basic Usage
php artisan appframe:module ModuleName
app/Modules/ModuleName with:
ModuleNameServiceProvider.phpModuleNameController.phpModuleNameModel.php (extending Appframe\Model)ModuleNameView (Blade templates in resources/views/modules/module-name/)First Use Case
User):
namespace App\Modules\Users\Models;
use Milestone\Appframe\Model;
class User extends Model
{
protected $fillable = ['name', 'email'];
}
config/appframe.php:
'modules' => [
'users' => [
'namespace' => 'App\Modules\Users',
'controller' => 'UsersController',
'model' => 'User',
],
],
routes/web.php):
Route::module('users', 'App\Modules\Users\Http\Controllers\UsersController');
CRUD Operations
// In a controller
$users = \Appframe::module('users')->all(); // Fetches all records
$user = \Appframe::module('users')->find(1); // Single record
$created = \Appframe::module('users')->create($request->all()); // Create
\Appframe::module('users')->update(1, $request->all()); // Update
\Appframe::module('users')->delete(1); // Delete
Module Registration
AppframeServiceProvider:
public function registerModules()
{
\Appframe::registerModule('users', [
'namespace' => 'App\Modules\Users',
'controller' => 'UsersController',
'model' => 'User',
'views' => 'modules.users',
]);
}
View Integration
@moduleLayout('users')
@moduleContent('users.index')
@endmoduleLayout
resources/views/modules/_layouts/base.blade.php.Middleware & Policies
\Appframe::module('users')->middleware('auth');
ModuleNamePolicy.php:
public function before($request)
{
if ($request->user()->cannot('manage-users')) {
abort(403);
}
}
API Endpoints
\Appframe::module('users')->api(true);
Resource classes for API responses:
namespace App\Modules\Users\Http\Resources;
use Milestone\Appframe\Http\Resources\JsonResource;
class UserResource extends JsonResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
];
}
}
webpack.mix.js:
mix.js('resources/js/modules/users/app.js', 'public/js/modules/users')
.sass('resources/sass/modules/users/app.scss', 'public/css/modules/users');
database/migrations/module_name_*_create_*_table.php.$module = \Mockery::mock('overload:\Milestone\Appframe\Facades\Appframe');
$module->shouldReceive('module')->andReturn($mockModule);
Namespace Conflicts
config/appframe.php match the actual directory structure. Example:
app/Modules/Users/Models/User.php → 'namespace' => 'App\Modules\Users\Models'
composer dump-autoload.Outdated CLI Tools
AppframeCommand class.Laravel Version Compatibility
registerModuleBinding() instead of bind().@moduleLayout may conflict with newer Laravel directives).Caching Issues
php artisan route:clear
php artisan config:clear
Model Binding
Appframe\Model extends Laravel’s Model correctly. If not, override the resolveRouteKey() method:
public function resolveRouteKey()
{
return $this->id;
}
Module Not Found
config/appframe.php and the service provider is loaded in config/app.php:
'providers' => [
Milestone\Appframe\AppframeServiceProvider::class,
],
Route Errors
\Appframe::module('users')->controller(); // Should return the controller instance
php artisan route:list
View Not Loading
views path in config/appframe.php is correct and the Blade file exists at resources/views/modules/module-name/view-name.blade.php.Database Queries
\DB::enableQueryLog();
$users = \Appframe::module('users')->all();
dd(\DB::getQueryLog());
Custom Directives
Extend Blade directives in AppframeServiceProvider:
Blade::directive('moduleContent', function ($expression) {
return "<?php echo \Appframe::moduleContent($expression); ?>";
});
Event Listeners
Listen to module events (e.g., module.created):
\Appframe::module('users')->on('created', function ($model) {
// Post-create logic
});
API Resources
Override default JSON responses by extending Milestone\Appframe\Http\Resources\JsonResource.
Validation Rules
Add module-specific rules in ModuleNameRules.php:
namespace App\Modules\Users\Rules;
use Milestone\Appframe\Rules\AbstractRules;
class UserRules extends AbstractRules
{
public function rules()
{
return [
'email' => 'required|email|unique:users',
];
}
}
Attach to the module:
\Appframe::module('users')->rules(new UserRules());
Localization
Override translations in resources/lang/en/module-name.php:
return [
'create' => 'New User',
'edit' => 'Edit User',
];
How can I help you explore Laravel packages today?