php-app
v0.5.0
Published
PHP loyihasini desktop ilovaga aylantiruvchi CLI (PHP, HTML, CSS, JS)
Maintainers
Readme
PHP APP
PHP loyihasini desktop ilovaga aylantiruvchi CLI. Ilovani PHP, HTML, CSS va JS bilan yozasiz.
Butun runtime (Electron, PHP, xavfsizlik) php-app paketi ichida turadi. Sizning loyiha papkangizda faqat o'z fayllaringiz bo'ladi.
O'rnatish (bir marta)
cd php-app
npm install # Electron o'rnatiladi
./bin/fetch-php.sh # static PHP yuklab olinadi
npm link # `php-app` buyrug'i tizimga o'rnatiladi
php-app doctor # hammasi tayyorligini tekshiradiEndi php-app istalgan joydan ishlaydi.
Buyruqlar
php-app create <nom> # yangi loyiha papkasini yaratadi
php-app run [papka] # loyihani oynada ochadi; fayl o'zgarsa avtomatik yangilanadi
php-app check [papka] # php-app.json to'g'ri to'ldirilganini tekshiradi
php-app build [papka] # test uchun ilova yig'adi (tez, o'rnatgichsiz)
php-app release [papka] # tarqatish uchun o'rnatgich yasaydi (.dmg / .exe / .AppImage)
php-app doctor # tizim tayyorligini va yangilanishni tekshiradi
php-app update # yangi versiya bo'lsa yangilaydiPlatforma tanlash (build / release bilan): --mac, --win, --linux.
Yangilanish: php-app doctor yangi versiyani ko'rsatadi, php-app update yangilaydi
(-y bilan so'rovsiz). Boshqa buyruqlar ham yangilanish bo'lsa bir qatorda eslatadi.
Ish jarayoni:
php-app create hisobchi
cd hisobchi
php-app run # ishlab chiqish (app.php o'zgarsa oyna avtomatik yangilanadi)
php-app release # tayyor bo'lgach: dist/ ichida o'rnatgich fayl paydo bo'ladibuild va release avval php-app.json ni tekshiradi. Zarur maydon bo'lmasa jarayon to'xtaydi
va nima yetishmayotgani ko'rsatiladi. Natija loyihaning dist/ papkasiga chiqadi.
📁 Sizning loyihangiz (toza!)
php-app create shundan iborat papka yaratadi:
mening_ilovam/
├── app.php ← butun ilovangiz shu yerda (PHP + HTML + CSS + JS)
├── icon.png ← ilova ikonkasi (512x512, almashtiring)
└── php-app.json ← sozlamalarHech qanday node_modules, electron, php-bin — hech narsa. Hammasi global php-app da.
php-app.json — sozlamalar
{
"name": "Mening ilovam", // ilova nomi
"version": "1.0.0", // versiya (x.y.z)
"appId": "com.kompaniya.ilova", // noyob identifikator (reverse-domain)
"author": "Abbosjon <email>", // muallif
"description": "Qisqa tavsif", // tavsif
"icon": "icon.png", // ikonka (≥512x512 PNG)
"index": "app.php", // bosh fayl
"window": { "width": 720, "height": 640, "title": "Mening ilovam" }
}Build uchun majburiy: name, version, appId, author, icon.
Ular bo'lmasa php-app build to'xtaydi va nima yetishmayotganini aytadi.
Istalgan vaqtda tekshirish: php-app check.
🧩 Native funksiyalar
JS'dan (window.PhpApp)
<button onclick="PhpApp.notify('Salom', 'Matn')">Bildirishnoma</button>
<script>
await PhpApp.confirm('Rozimisiz?'); // true/false
await PhpApp.openFile(); // fayl dialogi
await PhpApp.clipboard.write('matn');
PhpApp.openExternal('https://php.net');
PhpApp.window.minimize(); // oyna boshqaruvi
</script>PHP'dan (PhpApp::)
<?php require 'phpapp.php'; ?>
<?php
PhpApp::notify('Salom', 'PHP dan bildirishnoma');
PhpApp::alert('Xabar');
if (PhpApp::isNative()) { /* native oynadamiz */ }
?>require 'phpapp.php'; — bu framework kutubxonasini ulaydi. Fayl global paketda turadi
(lib/phpapp.php), PHP uni include_path orqali avtomatik topadi — loyihangizga nusxalanmaydi.
Tray, menyu, global tugmalar va hodisalar (v0.2.0)
<script>
// Tray ikonka + menyu
PhpApp.tray.set({
tooltip: 'Mening ilovam',
icon: 'icon.png', // ixtiyoriy, loyihaga nisbatan; macOS uchun: template: true + monoxrom PNG
menu: [
{ id: 'open', label: 'Ochish', accelerator: 'CmdOrCtrl+O' },
{ type: 'separator' },
{ id: 'quit', label: 'Chiqish' },
],
});
// Ilova menyusi (yuqori panel) va kontekst menyu
PhpApp.menu.setApp([{ label: 'Fayl', submenu: [{ id: 'new', label: 'Yangi' }] }]);
PhpApp.menu.context([{ id: 'copy', label: 'Nusxa olish' }], x, y); // x/y yo'q → kursor joyida
// Global tugma (ilova fonda bo'lsa ham ishlaydi)
PhpApp.shortcut.register('CmdOrCtrl+Shift+P', 'ping');
// Hodisalarni tinglash
PhpApp.on('tray.click', () => PhpApp.notify('Tray bosildi'));
PhpApp.on('menu.click', (p) => console.log('menyu:', p.id, p.checked));
PhpApp.on('shortcut', (p) => PhpApp.notify('Tugma', p.accelerator));
</script>Hodisalar (PhpApp.on(event, cb)):
| event | payload | qachon |
|---|---|---|
| tray.click | {} | tray ikonka bosilganda |
| menu.click | {id, checked, type} | tray/app/context menyu elementi bosilganda |
| shortcut | {id, accelerator} | global tugma bosilganda |
Menyu elementi maydonlari: id, label, type (normal/separator/checkbox/radio),
accelerator, enabled, visible, checked, submenu[], role (native rol).
⚠️ Hodisalar faqat JS tomonda. PHP (
PhpApp::tray(),PhpApp::appMenu(),PhpApp::registerShortcut()) tray/menyu/tugmani yaratadi, lekin bosilishini tinglay olmaydi — uniPhpApp.on()bilan JS'da tinglang.macOS menyu panelida eng toza ko'rinish uchun kichik monoxrom PNG bering va
template: trueqo'shing (rangli ikonka avtomatik 16px'ga kichraytiriladi).
🎨 Screen — faqat PHP UI (v0.3.0)
Butun interfeys, holat va hodisalarни sof PHP'da yozing — HTML/CSS/JS umuman yozmaysiz.
app.php ni Screen sifatida yozing:
<?php require 'ui.php';
class Sanoq extends Screen {
public int $son = 0; // public prop = reaktiv holat
public string $ism = '';
function build($ui) {
$ui->appBar('Sanoq');
$ui->text("Son: {$this->son}")->size(32)->bold()->center();
$ui->field('ism')->hint('Ismingiz'); // $this->ism ga bog'lanadi
$ui->row(function ($r) {
$r->button('−')->onTap('kamayt');
$r->button('+')->primary()->onTap('oshir');
})->gap(8)->center();
}
function oshir() { $this->son++; } // holat o'zgaradi → UI o'zi yangilanadi
function kamayt() { $this->son--; }
}
App::run(Sanoq::class);Widgetlar (v0.4.0):
- Layout:
row, column, card, box, grid, scroll, spacer, divider - Kontent:
appBar, heading, text, link, badge, chip, avatar, progress, spinner, alert, image, icon - Input:
field, textarea, checkbox, toggle, radio, select, slider - Amal:
button(variantlar bilan) - Ro'yxat:
each($items, fn)— dinamik ro'yxat
Modifikatorlar:
- Matn:
->size() ->bold() ->italic() ->muted() ->small() ->large() ->color() ->align() - Quti:
->bg() ->padding() ->paddingX() ->paddingY() ->margin() ->rounded() ->width() ->height() ->shadow() ->border() ->full() ->grow() ->opacity() - Flex:
->center() ->between() ->around() ->start() ->end() ->wrap() ->gap() ->cols() - Button/badge/alert:
->primary() ->secondary() ->danger() ->success() ->warning() ->ghost() ->outline() ->block() ->disabled() - Input:
->hint() ->value() ->type() ->rows() ->min() ->max() ->step()· Hodisa:->onTap()
Misol (variantlar):
$ui->button('Saqlash')->primary()->block()->onTap('saqla');
$ui->alert('Xato!')->danger();
$ui->each($foydalanuvchilar, function ($u, $item) {
$u->row(fn($r) => $r->avatar($item['ism'])->text($item['ism'])->grow());
});Maxsus rang: php-app.json ga "theme": { "primary": "#7c5cff" } qo'shsangiz — butun UI shu rangда.
Yoki loyihaga theme.css qo'ysangiz — u avtomatik ulanadi (o'z CSS'ingiz).
Qanday ishlaydi: build() widgetlarni HTML'ga aylantiradi (tayyor light/dark tema bilan). Tugma bosilganda
handler (PHP metod) chaqiriladi → public proplar (holat) o'zgaradi → UI qayta chiziladi. Dasturchi bironta
HTML/JS yozmaydi.
Qoidalar: reaktiv holat public prop bo'lsin va default qiymatli bo'lsin (
public int $son = 0;);app.phpfaqat class +App::run(...)bo'lsin (har hodisada qaytadan ishlaydi). Handler ichidaPhpApp::notify()kabi native chaqiruvlar ham ishlaydi.Eski uslub (raw PHP+HTML) ham ishlayveradi —
ui.phpниrequireqilmasangiz hech narsa o'zgarmaydi.
Ko'p sahifa (routing) + modular tuzilma (v0.5.0)
Har bir sahifa — alohida Screen class, alohida faylда. app.php ularни ulaydi va route qiladi:
// app.php
<?php require 'ui.php';
require 'pages/HomePage.php';
require 'pages/SettingsPage.php';
App::run([
'home' => HomePage::class, // birinchi = default
'settings' => SettingsPage::class,
]);// pages/HomePage.php
<?php class HomePage extends Screen {
public function build($ui) {
$ui->appBar('Bosh')->class('bar');
$ui->button('Sozlamalar →')->onTap('sozlamalar');
}
public function sozlamalar() { $this->go('settings'); } // navigatsiya
}Handler ичида $this->go('settings') (yoki ->go(SettingsPage::class)) bilan sahifага o'tasiz.
Yangi sahифа o'z default holatида ochiladi.
Class-based CSS (PHP'да CSS yozmang)
Widgetlarга ->class('nom') bilan o'z CSS klassingizni ulaysiz; CSS'ни alohida faylда yozasiz:
$ui->text("Son: {$this->son}")->class('counter');
$ui->button('Saqlash')->class('btn primary');/* styles/app.css — CSS shu yerda, PHP'да emas */
.counter { font-size: 32px; text-align: center; }
.btn { padding: 10px 16px; border-radius: 8px; }php-app.jsonga ulang:
{ "styles": ["styles/app.css"], "defaultTheme": true }"styles": [...]— o'z CSS fayllaringiz (tartib bilan ulanadi)"defaultTheme": false— tayyor temani butunlay o'chiradi (faqat o'z CSS'ingiz qoladi)theme.css(loyihada) — avtomatik, oxirида ulanadi"theme": {"primary":"#..."}— tez rang o'zgartirish
Komponentlar (qayta ishlatiladigan)
Oddiy PHP funksiya — require qilib chaqirasiz:
// components/userCard.php
function userCard($ui, $u) {
$ui->card(fn($c) => $c->row(function ($r) use ($u) {
$r->avatar($u['ism']); $r->text($u['ism'])->class('name')->grow();
}));
}
// sahifada: userCard($ui, $foydalanuvchi);Struktura: app.php · pages/*.php · components/*.php · styles/*.css · theme.css
⚙️ Qanday ishlaydi?
php-app run
│
▼
┌──────────── global php-app paketi ────────────┐
│ Electron oyna ──→ loyihangizning app.php'si │
│ (bundlangan static PHP) │
│ │ │
│ window.PhpApp (JS) PhpApp:: (PHP) │
│ └──────── native ko'prik ────────┘ │
│ │ │
│ Native OS (bildirishnoma, fayl…) │
│ │
│ 📁 fayl o'zgarsa → oyna avtomatik yangilanadi │
└─────────────────────────────────────────────────┘php-app run→ Electron loyihangizningapp.php'sini bundlangan PHP bilan ishlatadi.- Native amallar: JS'dan IPC orqali, PHP'dan token bilan himoyalangan lokal HTTP orqali.
- Loyiha fayllari kuzatiladi — o'zgarish bo'lsa oyna qayta yuklanadi (live reload).
🗂 Paket ichki tuzilishi (dasturchi buni ko'rmaydi)
php-app/
├── bin/php-app.js ← CLI (create / run / build)
├── runtime/
│ ├── main.js ← Electron + PHP server + native ko'prik + live reload
│ ├── preload.js ← window.PhpApp
│ └── php-bin/…/php ← bundlangan static PHP
├── lib/phpapp.php ← PHP kutubxonasi (require 'phpapp.php')
└── templates/default/ ← `create` uchun shablon🔧 Talablar
- Node.js 18+ (Electron uchun)
- macOS / Windows / Linux
- PHP o'rnatilishi shart emas —
fetch-php.shilova ichiga static PHP joylaydi. (Agar bo'lmasa, tizimdagi PHP ishlatiladi.)
