flyo / nitro-laravel
Flyo Nitro Laravel Framework Module
Requires
- flyo/nitro-php: ^1.1
- flyo/nitro-php-bridge: ^1.2
- illuminate/support: ^11.0
- illuminate/view: ^11
- laravel/helpers: ^1.6
Requires (Dev)
- larastan/larastan: ^2.0
- laravel/pint: ^1.17
README
composer require flyo/nitro-laravel
publish the config
artisan vendor:publish
Adjust the token in config/flyo.php
Ensure to remove the default routes in
routes/web.php
which could conflict with the cms routes.
Views
Add/Adjust the cms.blade.php
view file in resources/views
, this is where the cms page loader starts:
<?php /** @var \Flyo\Model\Page */ ?> <x-flyo::page :page=$page />
Now all component block views are looked up in ressources/views/flyo
, for example if you have a Flyo Nitro component block with name Text the view file would be ressources/views/flyo/Text.blade.php
utilizing the following variables:
You can adjust the views namespace in the config file using
views_namespace
key.
<?php /** @var \Flyo\Model\Block $block */ print_r($block->getContent()); print_r($block->getConfig()); print_r($block->getItems()); print_r($block->getSlots()); ?>
To make the block editable (which means clicking in the block, will correctly add the block to the cms editor) you can use the following blade directive @editable($block)
:
<?php /** @var \Flyo\Model\Block $block */ ?> <div @editable($block) style="border:1px solid blue; padding:20px;"> <?php print_r($block->getContent()); ?> <div>
Layout Variable
In order to build menus, the $config
response from the api is a global available variable, for example this could be used in layout-components:
/** @var \Flyo\Model\ConfigResponse $config */ <div> <?php foreach($config->getContainers()['mainnav']->getItems() as $nav): ?> <a href="<?= $nav->getHref(); ?>"><?= $nav->getLabel(); ?></a> <?php endforeach; ?> </div>
Make sure to include the <x-flyo::head>
component in the head of your layout file, for example
<head> <title>My Super Website</title> <x-flyo::head /> </head>
This will add needed javascript for reloading and editin blocks in local environments and also assign all available meta informations.
A full layout example which could be placed in resources/views/layouts/app.blade.php
:
<?php /** @var \Flyo\Model\ConfigResponse $config */ ?> <!DOCTYPE html> <html lang="de"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <x-flyo::head /> </head> <body> <ul> <?php foreach ($config->getContainers() as $container): ?> <li><?= $container->getLabel(); ?></li> <ul> <?php foreach ($container->getItems() as $page): ?> <li><a href="<?= $page->getHref(); ?>"><?= $page->getLabel(); ?></a></li> <?php endforeach; ?> </ul> <?php endforeach; ?> </ul> <hr/> {{ $slot }} </body> </html>
Entity Detail
To display an entity detail page, you have to register a route, create a controller and a view file:
Routing File example
<?php use App\Http\Controllers\TierController; use Illuminate\Support\Facades\Route; Route::get('/tier/{slug}', [TierController::class, 'show']);
The Controller:
<?php namespace App\Http\Controllers; use Flyo\Api\EntitiesApi; use Flyo\Configuration; use Illuminate\Contracts\View\Factory; class TierController extends Controller { public function __construct(public Factory $viewFactory, public Configuration $config) {} public function show(string $slug) { $api = new EntitiesApi(null, $this->config); $entity = $api->entityBySlug($slug); return $this->viewFactory->make('tier', [ 'entity' => $entity, ]); } }
And the example tier.blade.php
in the resources/views
folder:
<?php /** @var \Flyo\Model\Entity $entity */ ?> <x-layout> <h1><?= $entity->getModel()->image->source; ?></h1> </x-layout>
There is also a more generic controller available which can be used to display any entity detail page:
Route::get('/poi/{slug}', function ($slug) { return app(Flyo\Laravel\Controllers\EntityController::class)->resolve(fn (Flyo\Api\EntitiesApi $api, $param) => $api->entityBySlug($param, 116))->render($slug, 'poi'); });
where the poi.blade.php
file in the resources/views
folder could look like this:
<?php /** @var Flyo\Model\EntityInterface $entity */ /** @var object $model */ ?> <x-layout> <?php print_r($model); ?> <?php print_r($entity); ?> </x-layout>
## Misc
In order to resolve the Configuration object somewhere in your application, you can use the following code:
// use DI to resolve the Configuration object public function __construct(public Flyo\Model\ConfigResponse $config) { } // or facade /** @var Flyo\Model\ConfigResponse $cfg */ $configResponse = app(Flyo\Model\ConfigResponse::class);
Same for the page response
// use DI to resolve the Configuration object public function __construct(public Flyo\Model\Page $page) { } // or facade /** @var Flyo\Model\Page $cfg */ $page = app(Flyo\Model\Page::class);
Documentation
Package Development
- Check the
example-app/.env
file to have a correct flyo token. - Go to example-app and run
php artisan serve
to get the example app running.