Liaison App (aka Package)
A Liaison app can include routes, views, methods, hooks, and more. You can include as few or as many parts as you like.
Apps typically do one of two things: create features for other apps to use or implement features other apps provide. Most features are created through Addons. Most features are implemented through directory structures & configurations.
Also See:
- Web Server Documentation
- Integration - Integrate a Liaison app into another webserver (such as wordpress, laravel, or a diy setup)
- README
Through these examples, we'll build a fully functional Liaison app.
Sections of this document
- Directory Structure
- config.json
- Routing
- Files
-
addRoute()
TODO:
- Views
- Addons
- Hooks
- Seo Headers
- Css & Javascript files
App Directory Structure
You can include one, multiple, or all of these files & directories.
App/
- config.json <- Package settings
- public/ <- Public files to be routed to.
- index.css
- index.php <- home page
- contact.php <- /contact/
- view/ <- Views
- theme.php <- site layout
- theme.css
- addon/ <- Addons (extend \Lia\Addon)
- MyAddon.php
- class/ <- Classes to autoload, PSR4 style, but you should use composer instead.
Note: You don't need to make any files until you're ready for them.
config.json
config.json
is optional & there are likely to be breaking changes.
{
"namespace": "lia",
"name": "lia",
"fqn": "lia:server",
"base_url": "/",
"public_file_params": {
"key":"raw_value"
}
}
Notes:
-
namespace
does nothing currently. It was supposed to, but we're actually usingname
andfqn
. We will likely change this. - the
Server
package loads the configs & for any config that has a matching property on the package class will overwrite that property.
Routing
Routing is available through your public
dir, and through $lia->addRoute('/pattern/{slug}/', callable)
.
To test:
- Create
deliver.php
following the Web Server Documentation -
php -S localhost:3000 /deliver.php
/public/
Files
/public/index.php
: (Your home page /
)
<?php
// add a css (or js) file to the page. Files of the same type are compiled together.
$lia->addResourceFile(__DIR__.'/index.css');
// public_file_params from your config.json are available here
?>
<h1>Elections in My Town, Some State</h1>
<p>My Town's city council & school board elections are approaching soon! The school board race is cotentious with only 3 seats available, but 7 candidates running - some with very different perspectives. ...</p>
<?php
// $lia->view('elections.php', $args=[]); # We'll use this later.
?>
/public/index.css
:
h1 {
font-size:1.6em;
margin:0;
padding:8px;
}
p {
max-width: 80ch;
padding: 12px;
}
Visit http://localhost:3000/
.
Note: Public files can also use patterns, like public/election/{slug}/
, just like programmatic routes below.
$lia->addRoute()
Routes can be added programmatically with or without paramaters, and can point to a callable or a file.
Also See:
<?php
// \Lia $lia
$lia->addRoute('/election/2023-city-council/',
function(\Lia\Obj\Route $route,\Lia\Obj\Response $response) use ($lia){
$response->content = $lia->view('office', ['year'=>'2023', 'election'=>'city-council']);
}
);
// or you can use paramaters
$lia->addRoute('/election/{year}/{$name}/',
function(\Lia\Obj\Route $route,\Lia\Obj\Response $response) use ($lia){
$response->content = $lia->view('office',
[
'year'=>$route->param('year'),
'election'=>$route->param('name')
]
);
}
);
//optional paramaters don't have to be at the end.
$lia->addRoute('/candidate/{uuid}/{?slug}/', ...);
// only allow post requests (also works with a callable)
$lia->addRoute('@POST./submit_voter_opinion/', 'path/to/some/file.php');
// allow get & post
$lia->addRoute('@GET.@POST./candidate_questionnaire/', 'path/to/some/file.php');
Notes:
- Routes are retrieved from
Lia\Addon\Router
, and processed inLia\Addon\Server
; seeprocess_route()
. -
addRoute
accepts a third paramater, which is passed to files as the variable$package
; it is not available in callable routes.
Views - /view/
View Directories
- view
help/errors
resides at$view_dir.'/help/errors.php'
and may haveerrors.css
anderrors.js
next to it that will be automatically included - TODO: Document more and better
Add Views
- Add view files into existing view directories
-
$lia->addon('lia:server.view')->addViewFile('view_name', 'path/to/file.php')
, file.php should output content - or
$lia->addon('lia:server.view')->addViewCallable('view_name', function(string $view_name, array $args){ return 'content';});
- or
$lia->addon('lia:server.view')->addView('view_name', '/views/directory/')
Addons Lia\Addon
TODO - fill in view docs for libraries
Hooks
Hook into an event:
<?php
// DASHBOARD_DISPLAYED is a string constant and is part of another library
$lia->hook(\Tlf\User\Hooks::DASHBOARD_DISPLAYED,
// Each hook defines it's own function signature (essentially by passing the correct paramaters when calling the hook)
function(\Lia $lia, \Tlf\User\EasyServer $server){
// may contain css to switch to a full-width page to better display the dashboard
$lia->addResourceFile(dirname(__DIR__).'/file/user-dashboard.css');
}
);
// Alternatively:
// $lia->addon('lia:server.hook')->add(DASHBOARD_DISPLAYED, function(){});
Call a hook:
<?php
// each arg after the hook name is passed directly to each registered callable.
$lia->call_hook(\Tlf\User\Hooks::DASHBOARD_DISPLAYED, $lia, $easy_user_server);
// Alternatively:
// $lia->addon('lia:server.hook')->call(DASHBOARD_DISPLAYED, $lia,$easy_user_server);
SEO Headers
TODO
Css & Javascript files
TODO