Installation
composer require dcouture-ca/page-part-bundle
Add to config/app.php under providers:
Dcouture\PagePartBundle\PagePartServiceProvider::class,
Publish the config (if needed):
php artisan vendor:publish --provider="Dcouture\PagePartBundle\PagePartServiceProvider"
Basic Usage Register a page part via a service provider or manually:
use Dcouture\PagePartBundle\Contracts\PagePartInterface;
class MyPagePart implements PagePartInterface {
public function render(): string {
return '<div>Hello, Page Part!</div>';
}
}
Register it in AppServiceProvider:
public function boot() {
$this->app->make('page-part')->register('my_part', MyPagePart::class);
}
First Use Case Render a page part in a Blade view:
@pagePart('my_part')
Registration
PagePartServiceProvider or manually in boot().registerWithTag()).Rendering
@pagePart('slug') (auto-renders if registered).$part = app('page-part')->get('my_part');
echo $part->render();
Dynamic Parts
setData():
$part->setData(['key' => 'value']);
View Integration
Blade::directive('pagePart', function ($slug) {
return "<?php echo app('page-part')->render({$slug}); ?>";
});
Dependency Injection
Inject PagePartManager into controllers/services:
public function __construct(protected PagePartManager $manager) {}
Conditional Rendering
Use has() to check part existence:
if ($manager->has('my_part')) {
echo $manager->render('my_part');
}
Caching Cache rendered parts globally or per-request:
$manager->setCacheEnabled(true);
Registration Timing
boot()).Namespace Collisions
App\PageParts\MyPart).Blade Directive Scope
@pagePart only works in Blade files. Use $manager->render() elsewhere.Data Binding
setData() overwrites existing data. Use mergeData() for partial updates.Check Registration Dump registered parts:
dd(app('page-part')->getRegisteredParts());
Enable Debug Mode
Set debug: true in config to log missing parts.
Override Rendering
Extend PagePartManager to customize behavior:
class CustomManager extends PagePartManager {
public function render($slug) {
// Custom logic
return parent::render($slug);
}
}
Custom Storage
Override getStorage() to use a database or API:
$manager->setStorage(new CustomStorage());
Event Hooks
Listen for PagePartRendering events to modify output:
event(new PagePartRendering($part, $slug));
View Composers Bind parts to views:
View::composer('*', function ($view) {
$view->with('parts', app('page-part')->getAll());
});
How can I help you explore Laravel packages today?