sme/app

simple mvc app

v0.0.2.2 2022-03-22 13:00 UTC

This package is auto-updated.

Last update: 2024-10-22 18:25:43 UTC


README

SME

simple mvc framework

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

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

Установка
Первый запуск

Route
Controller
View
Compressor
Model
Storage
Cache
Http client
Exceptions
Log
Console

Установка:

composer create-project sme/app my_project

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

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

php console serve

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

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

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

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

Route:

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

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

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

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

Controller:

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

Создаём нужный нам метод, например index()
public function index() {
  //Тут мы что то выполняем например можем показать какой то вид View('home')
  return View('home');
}
Для получения данных от клиента используется класс request или хелперrequest()
Получаем переменную из маршрута:
request()->route('id');
Или
Route::get('/catalog/item/{id}',function($id) {
  //В переменной $id будет первая переменная из маршрута
Получаем переменную из формы:
request()->input('name');

View:

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

Передать переменную в вид из контроллера или замыкания маршрута
View('home',['message'=>'hello','message2'=>'world']);
В видах мы можем делать как и обычные вставки php <?php ?> так и компилируемые с помощью спецсимволов {{Переменная или функция}} или @функция
<h1>Hello World!!!</h1>
<strong>yes {{$message}} {{$message2}}!</strong>
Time: {{date('H:i:s')}}
Наследование lay - папка, html - файл
@extends('lay.html')
Обьявить секцию
@section('content')  
<div>Контент</div> 
@endsection
или
@section('head','Текст')
Получить секцию
@yield('content')
Обьявить переменную:
@php  
$var = 123; 
@endphp
Перебрать массив
<ul>
@foreach($items as $item)
<li>{{$item}}</li>
@endforeach
</ul>
Добавление собственных функций в компилятор
В файле appService.php в методе register или же подключить свой класс через appService
Compiler::declare(имя функции,анонимная функция(агрументы переданные в функцию,последним всегда будет анонимная функция для добавления в конец буффера))
Compiler::declare('plus',function($arg1,$arg2,$appendFnc){ 
  $appendFnc('<?php echo '.$arg1.'; ?>');
  return "<?php echo ".($arg1+$arg2)."; ?>";
});
Готово, вызываем в виде
@plus(2,4)
Результат, в том месте где была вызвана функция будет выведено 6
в самом низу страницы будет выведено 2

Compressor:

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

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

Пример с css
<link href="{{compressor(['css/style.css', 'css/style2.css'], 'styles.css')}}" rel="stylesheet">

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

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

Model:

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

По умолчанию имя таблицы должно быть таким же как и название класса модели, но можно переназначить с помощью свойства класса $table
protected $table='other_table';
Для работы с моделью нужно подключить её в контроллере
public function index() {
$this->model("db");
...
Или если нужно использовать в замыкании маршрута
Controller::model("db");
Чтобы обратится к модели используем тот же метод только без аргументов: 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):
$db->find(1);
$db->name = 'name2';
$db->price = '1234';
$db->save();
Удаление записи:
$db->find(1);
$db->delete();

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');
Так же можно сохранять файлы сразу из при их получении из формы
...
<input type="file" name="file" />
<input type="text" name="fileName" value="default"/>
...
request()->file('file')->storeAs('',request()->input('fileName').'.jpg');

Cache:

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

Сохранить данные в кэше put(ключ,данные,время хранения в секундах)
Cache::put('message','Hello World!',60);
Получить данные
Cache::get('message');
или получить и сразу удалить
Cache::pull('message');
Удалить
Cache::forget('message');
Проверить сущеутвование по ключу
Cache::has('message');

Http client:

Простой 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 запрос с параметрами

Http::post('http://url',['name'=>'value']);
По умолчанию запрос выполняется в виде json обьекта с типом application/json
Если нужно выполнить обычный application/x-www-form-urlencoded то добавьте метод asForm перед выполнением запроса
Http::asForm()->post('http://url',['name'=>'value']);
Если нужен multipart/form-data
Http::asMultipart()->post('http://url',['name'=>'value']);

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

Http::withBasicAuth('user', 'password')->get('http://url');
или Digest авторизация
Http::withDigestAuth('user', 'password')->get('http://url');
если 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:

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

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

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

Exceptions::throw('имя_исключения', 'Обновите страницу');
Или через хелпер
abort('имя_исключения');
Так же мы можем переназначать системные исключения
Например переназначим исключение валидации на вывод json
Exceptions::declare('validate',function($errors){
  return response()->json([
          'status'=>false,
          'errors'=>$errors
   ]);
});

Log:

Логирование

Включить логирование можно в файле конфигурации .env
...
#	Logs
LOG_ENABLED=true
...
По умолчанию лог сохраняется по пути ROOT/storage/.log/
Сохранить информацию в лог
Log::info('Какой то вывод');
Если нужно записать ошибку используется метод error
Log::error('Ошибка');
Лог так же выводится в консольных командах
Например если мы хотим вывести таймер или что то подобное можно использовать метод thisLine в этом случае информация не запишется в файл а будет перезаписываться на этой же строке в консоле
Log::thisLine(true)->info(date('s'));

Console:

Команды

Запустить Dev server
php console serve
Очистить кэш
php console cache:clear

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

Например напишем отображение времени в консоли
В файле route/console.php создаём маршрут с методом 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