sme / app
simple mvc app
Installs: 7
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
Type:project
Requires
- php: ^7.0.0
- sme/framework: >=0.0.1
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