1. Go to this page and download the library: Download tobento/apps library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
tobento / apps example snippets
use Tobento\Apps\AppBoot;
class Backend extends AppBoot
{
/**
* Specify your app boots:
*/
protected const APP_BOOT = [
//\Tobento\App\Console\Boot\Console::class,
//\Tobento\App\User\Web\Boot\UserWeb::class,
];
/**
* Set a unique app id. Must be lowercase and
* only contain [a-z0-9-] characters.
* Furthermore, do not set ids with two dashes such as 'foo--bar'
* as supapps id will be separated by two dashes.
*/
protected const APP_ID = 'backend';
/**
* You may set a slug for the routing e.g. example.com/slug/
* Or you may set the slug to an empty string e.g. example.com/
*/
protected const SLUG = 'admin';
/**
* You may set a domains for the routing e.g. ['api.example.com']
* In addition, you may set the slug to an empty string,
* otherwise it gets appended e.g. api.example.com/slug
*/
protected const DOMAINS = [];
/**
* You may set a migration to be installed on booting e.g Migration::class
*/
protected const MIGRATION = '';
}
use Tobento\Apps\AppBoot;
class DomainFoo extends AppBoot
{
/**
* Specify your app boots:
*/
protected const APP_BOOT = [
Backend::class,
Frontend::class,
];
/**
* Set a unique app id. Must be lowercase and
* only contain [a-z0-9-] characters.
* Furthermore, do not set ids with two dashes such as 'foo--bar'
* as supapps id will be separated by two dashes.
*/
protected const APP_ID = 'domain-foo';
/**
* You may set a slug for the routing e.g. example.com/slug/
* Or you may set the slug to an empty string e.g. example.com/
*/
protected const SLUG = '';
/**
* You may set a domains for the routing e.g. ['api.example.com']
* In addition, you may set the slug to an empty string,
* otherwise it gets appended e.g. api.example.com/slug
*/
protected const DOMAINS = ['example.com'];
/**
* @var bool
*/
protected bool $supportsSubapps = true;
}
use Tobento\App\AppFactory;
// Create the app:
$app = (new AppFactory())->createApp();
// Add directories:
$app->dirs()
->dir(realpath(__DIR__.'/../'), 'root')
->dir(realpath(__DIR__.'/../app/'), 'app')
->dir($app->dir('app').'config', 'config', group: 'config')
->dir($app->dir('root').'public', 'public')
->dir($app->dir('root').'vendor', 'vendor');
// Adding boots:
$app->boot(DomainFoo::class);
$app->boot(DomainBar::class);
$app->boot(Backend::class);
// Adding app specific boots:
$app->booting();
$app->get(Backend::class)->addBoot(BackendSpecificBoot::class);
// Run the app:
$app->run();
use Tobento\App\Boot;
class Blog extends Boot
{
public const BOOT = [
Backend::class,
Frontend::class,
];
public function boot(Backend $backend, Frontend $frontend): void
{
$backend->addBoot(BlogBackend::class);
$frontend->addBoot(BlogFrontend::class);
}
}
use Tobento\App\AppFactory;
// Create the app:
$app = (new AppFactory())->createApp();
// Add directories:
$app->dirs()
->dir(realpath(__DIR__.'/../'), 'root')
->dir(realpath(__DIR__.'/../app/'), 'app')
->dir($app->dir('app').'config', 'config', group: 'config')
->dir($app->dir('root').'public', 'public')
->dir($app->dir('root').'vendor', 'vendor');
// Adding boots:
$app->boot(Blog::class);
// Run the app:
$app->run();
use Tobento\Service\Database\DatabasesInterface;
$storageDatabase = $app->get(DatabasesInterface::class)->default('shared:storage');
// or
$fileDatabase = $app->get(DatabasesInterface::class)->get('shared:file');
use Tobento\Apps\AppBoot;
use Tobento\Apps\AppsInterface;
use Tobento\Service\Routing\RouterInterface;
// Boot the app if it has not booted yet:
$app->booting();
// Get the apps:
$apps = $app->get(AppsInterface::class);
// Get any desired app:
var_dump($apps->get('frontend') instanceof AppBoot);
// bool(true)
$frontendApp = $apps->get('frontend')->app();
$frontendApp->booting();
// For instance, get all frontend app routes:
$routes = $frontendApp->get(RouterInterface::class)->getRoutes();
use Tobento\Apps\AppsInterface;
use Tobento\Service\Routing\RouterInterface;
// Boot the app if it has not booted yet:
$app->booting();
// Get the apps:
$apps = $app->get(AppsInterface::class);
// Boot parent app:
$apps->get('domain-foo')->app()->booting();
// Get sub app:
$frontendApp = $apps->get('domain-foo--frontend')->app();
$frontendApp->booting();
// For instance, get all frontend app routes:
$routes = $frontendApp->get(RouterInterface::class)->getRoutes();
use Tobento\App\Testing\TestCase;
use Tobento\App\AppInterface;
use Tobento\Apps\AppsInterface;
final class BackendAppTest extends TestCase
{
public function createApp(): AppInterface
{
$app =
use Tobento\App\Testing\TestCase;
use Tobento\App\AppInterface;
use Tobento\Apps\AppsInterface;
final class BackendAppTest extends TestCase
{
public function createApp(): AppInterface
{
$app = $this->createTmpApp(rootDir: __DIR__.'/..');
// Boot your apps:
$app->boot(Backend::class);
$app->booting();
// Get the app you want to test:
$app = $app->get(AppsInterface::class)->get('backend')->app();
// You may boot additional boots for testing:
$app->boot(\Tobento\App\Seeding\Boot\Seeding::class);
return $app;
}
}
use Tobento\App\Testing\TestCase;
use Tobento\App\AppInterface;
use Tobento\Apps\AppsInterface;
final class BackendAppTest extends TestCase
{
public function createApp(): AppInterface
{
$app = $this->createTmpApp(rootDir: __DIR__.'/..');
// Boot your apps:
$app->boot(DomainFoo::class);
$app->booting();
// Get and boot parent app:
$app = $app->get(AppsInterface::class)->get('domain-foo')->app();
$app->booting();
// Get sub app:
$app = $app->get(AppsInterface::class)->get('domain-foo--backend')->app();
// You may boot additional boots for testing:
$app->boot(\Tobento\App\Seeding\Boot\Seeding::class);
return $app;
}
}
app/config/apps.php
config/database.php
php ap apps:list
php ap apps route:list
php ap apps route:list --aid=frontend --aid=backend
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.