spatie/laravel-dashboard-belgian-trains-tile
Laravel Dashboard tile for showing Belgian train connections and status. Built for Spatie’s Laravel Dashboard and can be configured to display upcoming trains, delays, and connection info on a dashboard tile.
Install the Package
composer require spatie/laravel-dashboard-belgian-trains-tile
Ensure laravel-dashboard is installed (v4+ recommended).
Publish Configuration (if needed)
php artisan vendor:publish --provider="Spatie\Dashboard\DashboardServiceProvider" --tag="config"
Check config/dashboard.php for tile-specific settings (e.g., API keys, default station pairs).
Register the Tile Add the tile to your dashboard in a controller or service:
use Spatie\Dashboard\Dashboard;
use Spatie\Dashboard\Tiles\BelgianTrainsTile;
public function dashboard()
{
return Dashboard::create()
->tile(BelgianTrainsTile::class, 'Train Connections');
}
Configure API Credentials
Set NMBS/SNCB API credentials in .env (if required):
NMBS_API_KEY=your_api_key_here
NMBS_API_SECRET=your_secret_here
Test the Tile
Visit your dashboard route (e.g., /dashboard). The tile should display Belgian train connections in the app’s timezone (verified in 4.0.2).
Scenario: Show live train departures from Brussels to Antwerp for a logistics dashboard. Implementation:
namespace App\Dashboard\Tiles;
use Spatie\Dashboard\Tiles\BelgianTrainsTile;
class CustomBelgianTrainsTile extends BelgianTrainsTile
{
public function __construct()
{
parent::__construct();
$this->fromStation = 'Brussels';
$this->toStation = 'Antwerp';
}
}
Dashboard::create()->tile(CustomBelgianTrainsTile::class, 'Brussels → Antwerp Trains');
config/app.php timezone setting).BelgianTrainsTile.php (key methods: render(), getTrainData()).Dashboard::create()->tile(BelgianTrainsTile::class, 'Train Status');
class CustomTile extends BelgianTrainsTile
{
public function __construct()
{
$this->fromStation = request('from') ?? 'Brussels';
$this->toStation = request('to') ?? 'Ghent';
}
}
$this->fromStation = User::find(auth()->id())->preferredStation;
getTrainData() (abstracted in the tile).getTrainData() to:
public function getTrainData()
{
$cacheKey = "trains_{$this->fromStation}_{$this->toStation}";
return cache()->remember($cacheKey, now()->addMinutes(15), function () {
return Http::get('https://api.sncb.be/...', [
'headers' => ['Authorization' => 'Bearer ' . config('nmbs.api_key')],
])->json();
});
}
try {
$data = $this->getTrainData();
} catch (\Exception $e) {
return view('tiles.belgian-trains::error', ['error' => $e->getMessage()]);
}
public function render()
{
Carbon::setDefaultTimezone('Europe/Brussels');
return parent::render();
}
Carbon::setDefaultTimezone(auth()->user()->timezone ?? config('app.timezone'));
public function getLocale()
{
return app()->getLocale() === 'fr' ? 'fr' : 'nl';
}
Dashboard::create()->row() to group tiles:
Dashboard::create()
->row()
->tile(BelgianTrainsTile::class, 'Trains')
->tile(WeatherTile::class, 'Weather')
->row()
->tile(NewsTile::class, 'Updates');
if (auth()->user()->can('view_dashboard')) {
return Dashboard::create()->tile(BelgianTrainsTile::class);
}
public function refreshTrains()
{
$this->dispatch('refresh-trains');
}
window.addEventListener('refresh-trains', () => {
Livewire.emit('refreshBelgianTrainsTile');
});
php artisan vendor:publish --tag="belgian-trains-views"
Modify resources/views/vendor/belgian-trains/tile.blade.php.public function getDarkModeClass()
{
return config('dashboard.dark_mode') ? 'dark:bg-gray-800' : '';
}
config/app.php) matches user expectations.Carbon::now()->timezone('Europe/Brussels')->format('H:i');
render() method for timezone overrides.return cache()->remember("trains_{$this->fromStation}", now()->addMinutes(5), function () {
return Http::get('...')->json();
});
.env and Laravel’s config()).getTrainData().composer require livewire/livewire:^3.0
LivewireComponent errors in browser console.BRU vs. Brussels-Central).'station_mappings' => [
'BRU' => 'Brussels-Central',
'ANT' => 'Ant
How can I help you explore Laravel packages today?