Saved searches
Use saved searches to filter your results more quickly
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
simple php wramework. Example my codeStyle and .
andy87/php-framework
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
README.md
Делается с нуля, своими силамы, бес подглядываний, для демонстрации своего codeStyle и видения разработки ( поставил перд собой задачу: написать фреймворк своими силами — это же всегда интересно )
За основу была взята концепция фреймворка yii2.
framework в процессе разработки.
Проект в большей степени подражает структуре yii2, но не полностью.
📁 app ├── 📁 _ # ядро проекта ├── 📁 config # Дирректория с настройками приложения │ ├── 📁 setups # Дирректория с настройками для конкретного хоста ( HOST_NAME ) │ │ └── 📄 localhost.php # Приватные настройки с реквизитами для подключений (Пример: HOST_NAME localhost ) │ ├── 📄 params.php # Настройки компонентов │ ├── 📄 routes.php # Настройка маршрутов ├── 📁 controllers # Контроллеры вашего приложения │ └── 📄 SiteController.php # Пример: Контроллер Site ├── 📁 models # Используемые модельки проекта │ └── 📁 source # Исходные файлы моделек ├── 📁 satic # Статика проекта │ ├── 📁 css # Стили │ ├── 📁 docs # Документы │ ├── 📁 fonts # Шрифты │ ├── 📁 img # Картинки │ └── 📁 js # js └── 📁 views # Вьюхи/Представления ├── 📁 layouts # Дирректория для обёрток вьюх └── 📁 site # шаблоны для контроллера `site`
для тех кто в теме и кому интересно что у фреймворка под лифчиком под капотом.
📁 _ ├── 📁 base # Базовые класы для наследований │ └── 📁 prototype # диррекория содержащая traits ├── 📁 components # дирриктория с азовыми компонентами фреймворка │ └── 📁 main # Основные компоненты App() ├── 📁 guide # дирриктория с гайдами │ ├── 📁 en # гайд на Английсков │ └── 📁 ru # гайд на Русском ├── 📁 helpers # вспомогательные компоненты ├── 📁 runtime # файлы генерируемые фрейморком │ ├── 📁 cache # кеш │ └── 📁 logs # логи ├── 📁 setups # настройки фреймворка │ ├── 📄 autoload.php # настройка автозагрузки классов │ └── 📄 const.php # Список констант └── 📁 templates # шаблоны ошибок └── 📁 generator # генерируемые шаблоны └── 📁 errors # страницы ошибок 403/404/500/502/504/502
Используя консоль в связке с командой cd проникаете в дирректорию с будующим проектом и используете команду
git clone https://github.com/andy87/php-framework .
При использовании web-сервера Apache
в корне проекта требуется наличие файла .htaccess с минимальным содержимым:
Options -Indexes Options +FollowSymlinks RewriteEngine On RewriteCond % ^/(js|css|img|docs|fonts|static) RewriteRule ^js/(.*)$ app/static/js/$1 [L] RewriteRule ^css/(.*)$ app/static/css/$1 [L] RewriteRule ^img/(.*)$ app/static/img/$1 [L] RewriteRule ^docs/(.*)$ app/static/docs/$1 [L] RewriteRule ^fonts/(.*)$ app/static/fonts/$1 [L] RewriteRule ^static/(.*)$ app/static/$1 [L] RewriteCond % !^/app/static/ RewriteCond % !favicon.ico RewriteCond % !-f [OR] RewriteCond % !-d RewriteRule ^(.*)$ app/$1 # При желании ErrorDocument 404 /app/_/templates/errors/404.php # . 403/500/502/504/508
При использовании web-сервера Nginx
минимальные настройки:
Внутрение зависимости и настройка фремворка
- Namespace’ы начинаются с _ (нижнего подчёркивания)
- Всё «мясо» фреймворка лежит в дирректории app
- правила роутинга настрайваются в app/config/routes.php
- контроллеры/экшоны в routes.php указываются в lowercase , при имени контроллера/экшона CamelCase имя пишется через тире
Пример: роут uri => main-server/restart-now вызовит контроллер MainServerController экшон actionRestartNow - Настройки подключения для домена настрайваются в app/config/setups/ .php
- Models настледуется от BaseModels
- Controller настледуется от BaseController
- Имена Controller’ов имеют суфикс Controller
Пример: контроллер Main имеет имя файла класса MainController - Имена Action’ов имеют префикс action
Пример: экшон Login имеет имя метода actionLogin - экшон должен вернуть
— для вывода HTML — результат render()
— для вывода JSON — возвращать renderJson() либо return array
Из консоли используя cd направляемся в дирректорию app в ней используем для генерации файлов, следующие команды:
- Генерация контроллера
_ create/controller MyProfile
Будет сгенерирован файл: /app/controllers/MyProfileController.php (шаблон) - Генерация представления/шаблона
_ create/view landingPage mainPAge
Будет сгенерирован файл: /app/views/landing-page/main-page.php (шаблон) - Генерация модели
_ create/model BestCar table_car
Будут сгенерированы 2 файла: /app/models/source/BestCar.php (шаблон), /app/models/BestCar.php (шаблон) - Генерация модуля
_ create/module Test
Будет сгенерирован файл: /app/modules/Test.php (шаблон) - Генерация миграций
_ create/migrate Skill
можно добавить дполнительные параматры Имя таблицы , Комментарий к таблице
Пример: _ create/migrate Skill table_name «Комментарий к таблице»
Будет сгенерирован файл: /app/migrations/m000000_000000_Skill.php (шаблон)
прикол в том что я не планировал вводить миграции, а в ходе работы вдруг захотелось. Пришлось их в прямом смысле слова — вкорячить. Бога ради не хотел я костыли делать, но один всёже пришлось связаный с CLI.
- Просмотр списка не зарегистрированных миграцый
_ migrate/list
Пример:
Migration pending list: - m200509_203019_skill - m200509_203029_soft
Migrations: - table `table_1` exists! - table `table_2` created - table `table_3` SQL error
Реализованы методы модели
- one() — возвращает одну подходящюю под запрос моделб (Объект)
- all() — возвращает все подходящие под запрос модели (Объект)
- get() — возвращяет объект Record для дальнейшего вызова методов
- getAll() — возвращяет все записи из таблицы
- select() — указатель какие поля надо вернуть
- where() — усбовия выборки
- andWhere() — дополнительные условия
- limit() — установка limit в SQL запросе
- order() — установка order в SQL запросе
- asArray() — возвращает ответ в виде массива
- asArrayValue() — возвращает массив со значениями( без кючей )
- (позже будет добавлено) orWhere()
- (позже будет добавлено) leftJoin()
Model::get()->where(['id' => 1]); // WHERE `id` = 1 Model::get()->where(['name' => 'Admin']); // WHERE `name` = 'Admin' Model::get()->where(['id' => [1,2,3,4,5]]); // WHERE `id` IN(1,2,3,4,5) Model::get()->where(['email', 'is NOT', NULL]); // WHERE `email` is NOT NULL Model::get()->where(['email', '=', '2@mail.ru']); // WHERE `email` = '2@mail.ru'
$model = User::get()->where(['id' => 1])->one(); // return: Object User // -> public $username = 'and_y87' // -> public $email = 'e@mail.ru' $model = User::get()->where(['id' => 1])->asArray()->one(); // return: Array( // 'username = 'and_y87', // 'email' = 'e@mail.ru' ) $model = User::get()->where(['id' => 1])->asArrayValue()->one(); // return: Array( // 'and_y87', // 'e@mail.ru' ) $model = User::get()->where(['id',', 3])->all(); // return: Array( // Object User $username ='and_y87', $email ='e@mail.ru' ] // Object User $username ='Admin', $email ='bbb@mail.ru' ] // Object User $username ='User', $email ='ccc@mail.ru' ] ) $model = User::get()->where(['id',', 3])->asArray()->all(); // return: Array( // [ 'username' => 'and_y87', 'email' => 'e@mail.ru' ] // [ 'username' => 'Admin', 'email' => 'bbb@mail.ru' ] // [ 'username' => 'User', 'email' => 'ccc@mail.ru' ] ) $model = User::get()->where(['id',', 3])->asArrayValue()->all(); // return: Array( // [ 'and_y87', 'e@mail.ru' ] // [ 'Admin', 'bbb@mail.ru' ] // [ 'User', 'ccc@mail.ru' ] )
Запрос попадает в точку входа main.php
Создаёть экземпляр класса App()
Устанавливаются все свойства App()
В экземпляре класса Route()- Ищется подходящее правило в Route::$rules
- Из подхзодящего правила Задаются ID для:
- Route::$controller
- Route::$action
- устанавливается свойство $id
- устанавливается свойство $target
- создаёт экземпляр класса Action()
- устанавливается свойство $id
- устанавливается свойство $target
Создаётся экземпляр пользовательского контроллера по имени Controller::$target. далее у пользовательского контроллера последовательно вызывается методы:
- init()
- rules()
- beforeAction()
- $controller->target>()
- afterAction()
- App::display() — отдаёт ответ ( text/json/link) исходя из формата ответа ( App::$response->format)
сомнительные преимущества проекта 🙂
- отсутствие зависимостей
- концептуально похож на Yii2
- мало весит
- простота