PHPackages                             sme/app - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Framework](/categories/framework)
4. /
5. sme/app

ActiveProject[Framework](/categories/framework)

sme/app
=======

simple mvc app

v0.0.2.2(4y ago)011MITPHPPHP ^7.0.0

Since Mar 21Pushed 4y ago1 watchersCompare

[ Source](https://github.com/SergoMorello/sme.app)[ Packagist](https://packagist.org/packages/sme/app)[ RSS](/packages/sme-app/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependencies (1)Versions (5)Used By (0)

 [![](https://camo.githubusercontent.com/b336682e4dea4c39d4a4e03ffdeee6e38634e54b9e84604f656eab7c0ef53caf/68747470733a2f2f736d652e696e6d736b2e6e65742f69636f2f33327833322e706e67)](https://camo.githubusercontent.com/b336682e4dea4c39d4a4e03ffdeee6e38634e54b9e84604f656eab7c0ef53caf/68747470733a2f2f736d652e696e6d736b2e6e65742f69636f2f33327833322e706e67) SME
==================================================================================================================================================================================================================================================================================================================================================================

[](#----sme)

simple mvc framework
--------------------

[](#simple-mvc-framework)

### Это нечто похожее на laravel но намного быстрее и проще

[](#это-нечто-похожее-на-laravel-но-намного-быстрее-и-проще)

### Внимание, документация является устаревшей, в ближайшее время постараюсь переписать

[](#внимание-документация-является-устаревшей-в-ближайшее-время-постараюсь-переписать)

[Установка](#install)
[Первый запуск](#first)

[Route](#route)
[Controller](#controller)
[View](#view)
[Compressor](#compressor)
[Model](#model)
[Storage](#storage)
[Cache](#cache)
[Http client](#http_client)
[Exceptions](#exceptions)
[Log](#log)
[Console](#console)

### Установка:

[](#установка)

```
composer create-project sme/app my_project

```

### Первый запуск:

[](#первый-запуск)

#### В директории с проектом просто выполнить команду

[](#в-директории-с-проектом-просто-выполнить-команду)

```
php console serve
```

#### Готово! Теперь можно открыть браузер по адресу `http://127.0.0.1:8000`

[](#готово--теперь-можно-открыть-браузер-по-адресу-http1270018000)

#### у вас должна открыться стандартная страница движка.

[](#у-вас-должна-открыться-стандартная-страница-движка)

#### Всё ваше приложение находится в папке `app`

[](#всё-ваше-приложение-находится-в-папке-app)

#### Маршруты в файле `routes/web.php`

[](#маршруты-в-файле-routeswebphp)

### Route:

[](#route)

#### В файле /route/web.php

[](#в-файле-routewebphp)

```
Route::get('/','mainController@index')->name('home');
```

##### Создаём маршрут по пути `/` и вызываем метод `index` в контроллере `mainController`, так же даём имя маршруту `home` в цепочке методов `->name()`

[](#создаём-маршрут-по-пути--и-вызываем-метод-index-в-контроллере-maincontroller-так-же-даём-имя-маршруту-home-в-цепочке-методов--name)

##### Так же можно создать маршрут с замыканием

[](#так-же-можно-создать-маршрут-с-замыканием)

```
Route::get('/',function() {
  //Тут мы что то выполняем например можем показать какой то вид View('home')
  return View('home');
})->name('home');
```

#### Для отправки переменных в маршруте поместите их в фигурных скобках прямо в URL

[](#для-отправки-переменных-в-маршруте-поместите-их-в-фигурных-скобках-прямо-в-url)

```
Route::get('/catalog/item/{id}',functio...
```

### Controller:

[](#controller)

#### В папке /controller создаём файл контроллера, например `mainController.php` шаблон есть в файле `def.php`

[](#в-папке-controller-создаём-файл-контроллера-например-maincontrollerphp-шаблон-есть-в-файле-defphp)

##### Создаём нужный нам метод, например `index()`

[](#создаём-нужный-нам-метод-например-index)

```
public function index() {
  //Тут мы что то выполняем например можем показать какой то вид View('home')
  return View('home');
}
```

##### Для получения данных от клиента используется класс `request` или хелпер`request()`

[](#для-получения-данных-от-клиента-используется-класс-request-или-хелперrequest)

###### Получаем переменную из маршрута:

[](#получаем-переменную-из-маршрута)

```
request()->route('id');
```

###### Или

[](#или)

```
Route::get('/catalog/item/{id}',function($id) {
  //В переменной $id будет первая переменная из маршрута
```

###### Получаем переменную из формы:

[](#получаем-переменную-из-формы)

```
request()->input('name');
```

### View:

[](#view)

#### В папке /app/view создаём файл вида, например `home.php`

[](#в-папке-appview-создаём-файл-вида-например-homephp)

##### Передать переменную в вид из контроллера или замыкания маршрута

[](#передать-переменную-в-вид-из-контроллера-или-замыкания-маршрута)

```
View('home',['message'=>'hello','message2'=>'world']);
```

##### В видах мы можем делать как и обычные вставки php `` так и компилируемые с помощью спецсимволов `{{Переменная или функция}}` или `@функция`

[](#в-видах-мы-можем-делать-как-и-обычные-вставки-php-php--так-и-компилируемые-с-помощью-спецсимволов-переменная-или-функция-или-функция)

```
Hello World!!!
yes {{$message}} {{$message2}}!
Time: {{date('H:i:s')}}
```

##### Наследование `lay` - папка, `html` - файл

[](#наследование-lay---папка-html---файл)

```
@extends('lay.html')
```

##### Обьявить секцию

[](#обьявить-секцию)

```
@section('content')
Контент
@endsection
```

###### или

[](#или-1)

```
@section('head','Текст')
```

##### Получить секцию

[](#получить-секцию)

```
@yield('content')
```

##### Обьявить переменную:

[](#обьявить-переменную)

```
@php
$var = 123;
@endphp
```

##### Перебрать массив

[](#перебрать-массив)

```

@foreach($items as $item)
{{$item}}
@endforeach

```

##### Добавление собственных функций в компилятор

[](#добавление-собственных-функций-в-компилятор)

###### В файле `appService.php` в методе `register` или же подключить свой класс через appService

[](#в-файле-appservicephp-в-методе-register-или-же-подключить-свой-класс-через-appservice)

###### Compiler::declare(`имя функции`,`анонимная функция(`агрументы переданные в функцию`,`последним всегда будет анонимная функция для добавления в конец буффера`)`)

[](#compilerdeclareимя-функциианонимная-функцияагрументы-переданные-в-функциюпоследним-всегда-будет-анонимная-функция-для-добавления-в-конец-буффера)

```
Compiler::declare('plus',function($arg1,$arg2,$appendFnc){
  $appendFnc('');
  return "";
});
```

##### Готово, вызываем в виде

[](#готово-вызываем-в-виде)

```
@plus(2,4)
```

###### Результат, в том месте где была вызвана функция будет выведено `6`

[](#результат-в-том-месте-где-была-вызвана-функция-будет-выведено-6)

###### в самом низу страницы будет выведено `2`

[](#в-самом-низу-страницы-будет-выведено-2)

### Compressor:

[](#compressor)

### Compressor - инструмент для обьединения подключаемых css или js файлов в один

[](#compressor---инструмент-для-обьединения-подключаемых-css-или-js-файлов-в-один)

#### Просто передаём компрессору наши файлы в виде массива и указываем какой файл должен получиться

[](#просто-передаём-компрессору-наши-файлы-в-виде-массива-и-указываем-какой-файл-должен-получиться)

##### Пример с css

[](#пример-с-css)

```

```

#### В результате получаем всего один файл что положительно сказывается на скорости загрузки страницы

[](#в-результате-получаем-всего-один-файл-что-положительно-сказывается-на-скорости-загрузки-страницы)

##### Если содержимое файлов отлично от `text/javascript` или `text/css` можем указать своё в 3 агрументе функции

[](#если-содержимое-файлов-отлично-от-textjavascript-или-textcss-можем-указать-своё-в-3-агрументе-функции)

### Model:

[](#model)

#### В папке /app/model создаём файл модели, например `db.php` шаблон есть в файле `def.php`

[](#в-папке-appmodel-создаём-файл-модели-например-dbphp-шаблон-есть-в-файле-defphp)

##### По умолчанию имя таблицы должно быть таким же как и название класса модели, но можно переназначить с помощью свойства класса `$table`

[](#по-умолчанию-имя-таблицы-должно-быть-таким-же-как-и-название-класса-модели-но-можно-переназначить-с-помощью-свойства-класса-table)

```
protected $table='other_table';
```

##### Для работы с моделью нужно подключить её в контроллере

[](#для-работы-с-моделью-нужно-подключить-её-в-контроллере)

```
public function index() {
$this->model("db");
...
```

##### Или если нужно использовать в замыкании маршрута

[](#или-если-нужно-использовать-в-замыкании-маршрута)

```
Controller::model("db");
```

##### Чтобы обратится к модели используем тот же метод только без аргументов: model()-&gt;`имя модели`:

[](#чтобы-обратится-к-модели-используем-тот-же-метод-только-без-аргументов-model-имя-модели)

```
$db = $this->model()->db;
```

##### Так же можно обратится к модели сразу после подключения

[](#так-же-можно-обратится-к-модели-сразу-после-подключения)

```
Controller::model("db")->find(1)->delete()
```

##### Для работы с данными используется цепочка методов родительского класса:

[](#для-работы-с-данными-используется-цепочка-методов-родительского-класса)

```
$db->select('name')->where('id',1)->first();
```

#### Примеры:

[](#примеры)

##### Получаем массив:

[](#получаем-массив)

```
$db->select('name','test','status')->where('uid',1)->get();
```

##### Создаём запись:

[](#создаём-запись)

```
$db->name = 'name';
$db->price = '123';
$db->save();
```

##### Редактируем запись (метод `find()` используется для получения записи по `ID`):

[](#редактируем-запись-метод-find-используется-для-получения-записи-по-id)

```
$db->find(1);
$db->name = 'name2';
$db->price = '1234';
$db->save();
```

##### Удаление записи:

[](#удаление-записи)

```
$db->find(1);
$db->delete();
```

### Storage:

[](#storage)

#### Класс для работы с хранилищем (в стадии разработки)

[](#класс-для-работы-с-хранилищем-в-стадии-разработки)

##### Сохранить файл на диск

[](#сохранить-файл-на-диск)

```
Storage::disk('local')->put('file.txt','какие то данные');
```

##### Получить файл с диска

[](#получить-файл-с-диска)

```
Storage::disk('local')->get('file.txt');
```

##### Удалить файл

[](#удалить-файл)

```
Storage::disk('local')->delete('file.txt');
```

##### Проверить существует ли файл

[](#проверить-существует-ли-файл)

```
Storage::disk('local')->exists('file.txt');
```

##### Так же можно сохранять файлы сразу из при их получении из формы

[](#так-же-можно-сохранять-файлы-сразу-из-при-их-получении-из-формы)

```
...

...
```

```
request()->file('file')->storeAs('',request()->input('fileName').'.jpg');
```

### Cache:

[](#cache)

#### В кэше можно хранить любые данные и файлы от одной секунды до бесконечности

[](#в-кэше-можно-хранить-любые-данные-и-файлы-от-одной-секунды-до-бесконечности)

##### Сохранить данные в кэше put(`ключ`,`данные`,`время хранения в секундах`)

[](#сохранить-данные-в-кэше-putключданныевремя-хранения-в-секундах)

```
Cache::put('message','Hello World!',60);
```

##### Получить данные

[](#получить-данные)

```
Cache::get('message');
```

###### или получить и сразу удалить

[](#или-получить-и-сразу-удалить)

```
Cache::pull('message');
```

##### Удалить

[](#удалить)

```
Cache::forget('message');
```

##### Проверить сущеутвование по ключу

[](#проверить-сущеутвование-по-ключу)

```
Cache::has('message');
```

### Http client:

[](#http-client)

#### Простой GET запрос

[](#простой-get-запрос)

```
$response = Http::get('http://url');
```

##### В ответ получаем обьект:

[](#в-ответ-получаем-обьект)

```
$response->body(); //Тело ответа
$response->json(); //Если запрашивали json можно сразу преобразовать в массив
$response->header('имя заголовка'); //Получить заголовок из ответа
$response->headers(); //Получить все заголовки в виде массива
$response->ok(); //Если всё хорошо то true
$response->successful(); //Если код от 200 до 299
$response->failed(); //Если код от 400 до 499
$response->clientError(); //Если код 400
$response->serverError(); //Если код 500
```

#### POST запрос с параметрами

[](#post-запрос-с-параметрами)

```
Http::post('http://url',['name'=>'value']);
```

##### По умолчанию запрос выполняется в виде json обьекта с типом `application/json`

[](#по-умолчанию-запрос-выполняется-в-виде-json-обьекта-с-типом-applicationjson)

##### Если нужно выполнить обычный `application/x-www-form-urlencoded` то добавьте метод asForm перед выполнением запроса

[](#если-нужно-выполнить-обычный-applicationx-www-form-urlencoded-то-добавьте-метод-asform-перед-выполнением-запроса)

```
Http::asForm()->post('http://url',['name'=>'value']);
```

##### Если нужен `multipart/form-data`

[](#если-нужен-multipartform-data)

```
Http::asMultipart()->post('http://url',['name'=>'value']);
```

#### Basic авторизация

[](#basic-авторизация)

```
Http::withBasicAuth('user', 'password')->get('http://url');
```

##### или Digest авторизация

[](#или-digest-авторизация)

```
Http::withDigestAuth('user', 'password')->get('http://url');
```

##### если Realm статичен, можем указать

[](#если-realm-статичен-можем-указать)

```
Http::withDigestAuth('user', 'password')->withRealm('realm')->get('http://url');
```

#### Таймаут в секундах

[](#таймаут-в-секундах)

```
Http::timeout('20')->get('http://url');
```

#### Вызвать исключение в случае ошибки

[](#вызвать-исключение-в-случае-ошибки)

```
Http::post('http://url',['name'=>'value'])->throw();
```

##### Если нужно обработать ошибку, можно использовать замыкание

[](#если-нужно-обработать-ошибку-можно-использовать-замыкание)

```
Http::post('http://url',['name'=>'value'])->throw(function($response, $error){
  die("ой, что-то пошло не так");
});
```

### Exceptions:

[](#exceptions)

#### Обьявить исключение можно в appService.php

[](#обьявить-исключение-можно-в-appservicephp)

```
Exceptions::declare('имя_исключения',function($data=""){
  return response('что то сломалось '.$data);
});
```

#### Вызываем исключение

[](#вызываем-исключение)

```
Exceptions::throw('имя_исключения', 'Обновите страницу');
```

##### Или через хелпер

[](#или-через-хелпер)

```
abort('имя_исключения');
```

##### Так же мы можем переназначать системные исключения

[](#так-же-мы-можем-переназначать-системные-исключения)

###### Например переназначим исключение валидации на вывод json

[](#например-переназначим-исключение-валидации-на-вывод-json)

```
Exceptions::declare('validate',function($errors){
  return response()->json([
          'status'=>false,
          'errors'=>$errors
   ]);
});
```

### Log:

[](#log)

#### Логирование

[](#логирование)

##### Включить логирование можно в файле конфигурации `.env`

[](#включить-логирование-можно-в-файле-конфигурации-env)

```
...
#	Logs
LOG_ENABLED=true
...

```

###### По умолчанию лог сохраняется по пути `ROOT/storage/.log/`

[](#по-умолчанию-лог-сохраняется-по-пути-rootstoragelog)

##### Сохранить информацию в лог

[](#сохранить-информацию-в-лог)

```
Log::info('Какой то вывод');
```

##### Если нужно записать ошибку используется метод `error`

[](#если-нужно-записать-ошибку-используется-метод-error)

```
Log::error('Ошибка');
```

##### Лог так же выводится в консольных командах

[](#лог-так-же-выводится-в-консольных-командах)

###### Например если мы хотим вывести таймер или что то подобное можно использовать метод `thisLine` в этом случае информация не запишется в файл а будет перезаписываться на этой же строке в консоле

[](#например-если-мы-хотим-вывести-таймер-или-что-то-подобное-можно-использовать-метод-thisline-в-этом-случае-информация-не-запишется-в-файл-а-будет-перезаписываться-на-этой-же-строке-в-консоле)

```
Log::thisLine(true)->info(date('s'));
```

### Console:

[](#console)

#### Команды

[](#команды)

##### Запустить Dev server

[](#запустить-dev-server)

```
php console serve

```

##### Очистить кэш

[](#очистить-кэш)

```
php console cache:clear

```

#### Запуск приложения из консоли

[](#запуск-приложения-из-консоли)

##### Например напишем отображение времени в консоли

[](#например-напишем-отображение-времени-в-консоли)

###### В файле `route/console.php` создаём маршрут с методом `console` с замыканием

[](#в-файле-routeconsolephp-создаём-маршрут-с-методом-console-с-замыканием)

```
Route::console('time',function(){
  while(true) { //Создаём вечный цикл
    Log::thisLine(true)->info(date('H:i:s')); //Выводим текущее время и смещаем каретку в начало
    sleep(1); //Ставим задержку на выполнение в 1 секунду
  }
});
```

###### Запускаем в консоли

[](#запускаем-в-консоли)

```
php console time

```

###### Передача аргументов из консоли

[](#передача-аргументов-из-консоли)

```
Route::console('hello:{arg1}',function($arg1){
  Log::info('Hello '.$arg1);
  //или
  Log::info('Hello '.request()->route('arg1'));
...
```

###### Выполняем

[](#выполняем)

```
php console hello:world

```

###  Health Score

19

—

LowBetter than 10% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity5

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity37

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

4

Last Release

1515d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/34d9c406e0531b61b66611a641819982ae6648a5584e6dea5f13f9c53b543477?d=identicon)[SergoMorello](/maintainers/SergoMorello)

---

Top Contributors

[![SergoMorello](https://avatars.githubusercontent.com/u/44141734?v=4)](https://github.com/SergoMorello "SergoMorello (7 commits)")

### Embed Badge

![Health badge](/badges/sme-app/health.svg)

```
[![Health](https://phpackages.com/badges/sme-app/health.svg)](https://phpackages.com/packages/sme-app)
```

###  Alternatives

[laravel/telescope

An elegant debug assistant for the Laravel framework.

5.2k67.8M192](/packages/laravel-telescope)[spiral/roadrunner

RoadRunner: High-performance PHP application server and process manager written in Go and powered with plugins

8.4k12.2M84](/packages/spiral-roadrunner)[nolimits4web/swiper

Most modern mobile touch slider and framework with hardware accelerated transitions

41.8k177.2k1](/packages/nolimits4web-swiper)[laravel/dusk

Laravel Dusk provides simple end-to-end testing and browser automation.

1.9k36.7M259](/packages/laravel-dusk)[laravel/prompts

Add beautiful and user-friendly forms to your command-line applications.

708181.8M596](/packages/laravel-prompts)[cakephp/chronos

A simple API extension for DateTime.

1.4k47.7M121](/packages/cakephp-chronos)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
