bluzphp / framework Goto Github PK
View Code? Open in Web Editor NEWLightweight PHP framework
Home Page: http://bluzphp.github.io/
License: MIT License
Lightweight PHP framework
Home Page: http://bluzphp.github.io/
License: MIT License
Необходимо повторить функционал https://github.com/doctrine/dbal/blob/master/lib/Doctrine/DBAL/Query/QueryBuilder.php, к сожалению взять лишь необходимое не получается, придется копипастить и адаптировать.
Примечание - синтаксис LIMIT необходимо использовать универсальный - LIMIT 100 OFFSET 200
Необходимо функционал методов doInsert()
, doUpdate()
и delete()
перенести в Db\Table
, таким образом мы облегчим сам объект, и отвяжим его от SQL таблицы, что позволит нам использовать Db\Row
как сущность, а Db\Table
как коллекцию и менеджер сущностей.
В дальнейшем это позволит безболезненно создать Model\Record
и Model\Collection
которые и будут реализовывать данные классы.
Совместимость не пострадает.
Странно видеть константы вида METHOD_POST внутри AbstractRequest, ведь они относятся лишь к HTTP
Нужно проверить как фреймворк будет дружить с PostgreSQL, на данный момент знаю лишь, что будет проблема с получением значения sequence, т.е. нужно будет слегка модифицировать код.
Удобный пакет для разработки мультиязычных приложений
Нужны ли адаптеры - не уверен, может стоит оставить лишь массив?
Ну и в любом случае необходимо предусмотреть быстрый анализ сорцов для поиска фраз, которые надо перевести.
Выпускать две версии: PHP (попробовать) и Zephir (production/highload)
Такой подход будет сильным конкурентным преимуществом
есть роутер
@route /categories/view/{$alias}
есть грид
устанавливаемы параметр
$grid->setParams(['alias' => app()->getRequest()->getParam('alias')]);
(для того чтобы работала пагинация)
кейз:
стучимся на /categories/ololo
пытаемся перейти на "2" страничку в пагинации
Expected:
/categories/ololo/categories-page/2
Actual
/categories/ololo
впихнуть categories-page в роутер (так, чтобы page подхватывался гридом не удалось - урлы строит, но как параметр не ловит)
Пакет для организации очередей, возможно с несколькими адаптерами, возможно на основе чего-то готового (см http://framework.zend.com/manual/1.12/ru/zend.queue.html)
Должен использоваться для отправки почтовых сообщений (см #16)
Необходимо организовать быструю загрузку пакетов без необходимости внесения изменений в Application.php
Первый на выход - пакет Ldap.
Не хочу лезть со своим уставом в чужой монастырь, поэтому не лезу сразу в код.
В общем https://github.com/bluzphp/framework/blob/master/src/Bluz/Logger/Logger.php#L103
При передаче отладчик текста с символом % вылетает баг.
Ответ: http://stackoverflow.com/questions/3666734/php-sprintf-escaping
Но судя по коду в других местах этот момент учтен у вас.
P.S. Глаз радуется от такого красивого кода;-) Молодцы.
Test coverage definitely should be increased.
Also continious integration server need to be set up.
Probably some private server with jenkins or/and travis.ci.
The latter would give nice green (on not so nice red) bage to repository main page.
Подумать над реализацией и необходимостью пакета dependency injection
Пока я вижу лишь необходимость DI между модулями и вендорами, т.е. когда один модуль завязан на другой, или когда модуль требует ещё какие либы
Внутри самого фреймворка у нас либо жёсткие зависимости, либо наоборот - пассивные - нет, значит и не надо, идём запасным путём.
Если для контроллера включено кеширование, а глобальное кеширование отключено, в методе save
переменная fullPath
будет не инициализирована (не хватает проверки значения $this->cache
).
Система авторизация должна поддерживать следующие провайдеры:
\Application\Auth\Table
Для реализации последних стоит использовать guzzle
Необходим пакет, который будет врапером/хэлпером для какой-нить популярной Mail либы типа PHPMailer
Не совсем понятно зачем данный класс был унаследован от AbstractLogger,
а затем еще была добавлено использование реализации (use) LoggerTrait
может оставить просто наследование AbstractLogger?
Еще как вариант https://github.com/AntonShevchuk/Bluz/blob/master/library/Bluz/Router/Router.php#L310
Согласно http://p2k.ru/archives/33
-$params = preg_split('///', $uri);
+$params = explode('/',$uri);
Хотя как я понимаю это из Zend, врядли они про это не знали.
subj
subj
Надо добавить в док блок атрибут @method, который позволит отсекать изначально неправильные запросы при организации REST сервисов
В фреймворке кроме DEBUG константы так же встречается PATH_APPLICATION, надо бы избавится от столь неявного бага
На данный момент функционал пакета Rest
и Crud
не соответствует KISS идеологии, всё не так уж и очевидно как хотелось бы.
Плюс, хотелось бы добавить интерфейс (Rest
или Crud
), который можно реализовать в классах-наследниках от Db\Table
, что упростило бы в разы реализацию тривиальных задач по созданию менеджеров сущностей
Session Upload Progress indication is running while the upload is ongoing, and before control is handed over to a user's PHP code. As a result, the php upload handler uses configuration data set in the .ini files, and can only use modules that are available at that time.
Другими словами, хотите юзать PHP_SESSION_UPLOAD_PROGRESS - настраивайте хендлер для сессии в ini, т.к. как иначе, когда PHP видет куку аплоада, он тут же стартует сессию по настройкам из ini, а когда Bluz (или другой фреймворк) переустанавливает пути для сохранения сессии, то это уже другая сессия
У нас получается пересечение с методом Messages::addError($message)
, что сводит с ума парсер gettext'a при поиске строк для перевода (мы его настраиваем на поиск вызовов функции addError
со строкой в первом параметре)
Кодогенератор очень нужен, т.к. он делает работу с фреймворком ещё проще...
https://github.com/bashmach/bluzman
В коде помощника Ahref
не используется помощник Attributes.php
В каждом контроллере, мы сейчас инициализируем Формы, сами засовываем данные из Запроса, и также потом это все обрабатываем, добавляем Фильтры, которые по id объекта получают Модели, и т.д.
В итоге в контроллере находится огромное количество кода, который уменьшает как качество кода, так и читаемость.
В Symfony была реализована автоподстановка Значений из БД (как MySql, так и Mongo), в виде Entity, но при этом перехватить сообщение, о том, что что-то не найдено - не очень хорошо.
Я предлагаю реализовать классы - Mapper'ы, которые могут проверить полученные данные, отфильтровать их, а только потом предоставить эти данные в контроллер.
Пример такого Mapper'а:
namespace Arilas\User\Mapper;
use Some\Package\RequestMapper;
use Some\Package\Field;
class ProfileMapper extends RequestMapper {
/**
* @var Arilas\User\Entity\User
*/
protected $user;
/**
* @var string
*/
protected $name;
public function init(array $values) {
$user = new Field('user_id');
$user->getFilterChain()
->attach(new Digits())
->attach(new Entity([
'className' => 'Arilas\User\Entity\User',
]);
$name = new Field('name');
$name->setRequired(false);
$name->getFilterChain()
->attach(new StringTrim());
$this
->add($user, 'user')
->add($name)
;
}
public function getUser(){
return $this->user;
}
public function getName(){
return $this->name;
}
public function onError(Request $request){
if ($request->isXMLHttpRequest()) {
$result = new JsonModel();
} else {
$result = new ViewModel();
}
$result->setVariable('success', false);
$result->setVariable('errors', $this->getMessages());
return $result;
}
}
Суть очень похожа на Формы в ZF2, то-есть все те же InputFilter'ы, с Фильтрацией и Валидацией, но при этом этот код должен работать до(!) Контроллера, и предоставлять интерфейс к данным запроса.
Данный подход реализован в большинстве фреймворков на Java, так как это позволяет инкапсулировать данные запроса.
Также при портировании приложения на HACK, в режиме sctrict, типизация запроса смогла бы помочь.
Перенести View\Cache -> Cache\File
Расширить функционал и добавить поддержку тегов - т.к. это необходимо для выборочной очистки кеша
Надо бы расписать провайдеры, а не тулить всё в Application\Auth\Table
Необходимо проверить, есть ли какие проблемы, если есть - допилить
subj
Добавить возможность построения пагинации для произвольных url
На данный момент url строится на базе module/controller + params (page, limit, orders ,filters)
subj
Уже появилась необходимость в поддержке NoSQL решений, можно попробовать реализовать и узнать насколько проблематично вписать их в фреймворк
При ответе в виде application/json (при более 8000 символов), в заголовке HTTP Response нет Content-Lenght (так как ставится вид chunked). Достаточно часто она необходима разработчикам под iPhone/Android.
Длина должна выставляется в Bluz\Application, метод render.
Вот пример:
$json = json_encode($result->toArray());
header('Content-Length: '.strlen($json));
//override response code so javascript can process it
header('Content-type: application/json');
ob_clean();
flush();
echo $json;
Просмотреть текущую реализацию, проверить работоспособность, обновить документацию
На текущий момент связи как-то странно организованы, надо бы это дело привести в порядок
It's good to know for developers what coding style this framework supports
До идеала View не хватает удобного инструмента для "обезвреживания" данных в шаблоне. Возможные пути решения - создания "обёртки"/"презерватива", вроде бы тот же объект, но нет...:
<?php
$foo->bar = "<script>alert(123)</script>";
$foo = new Sanitize($foo);
echo $foo->bar; // <script>alert(123)</script>
Ни к месту он... совсем...
Система считает guest бесправным, и не получается дать ему права какие-либо
Т.е. надо физически удалять привелегию, если необходимо разрешить её гостю
Library tests from skeleton probably need to be moved in framework repository.
Удобный сценарий для использования Db\Query\Select
совместно с Db\Table
:
<?php
// default SELECT u.* FROM users AS u WHERE id = 42
$usersRows = Users\Table::select()->where(['id' => 42])->execute();
// default SELECT u.login FROM users AS u WHERE id = 42
$usersRows = Users\Table::select('u.login')->where(['id' => 42])->execute();
Данную ошибку выдает консольный вызов
типа
php bin/cli.php --debug --env dev --uri /analytics
PHP Fatal error: Call to undefined method Bluz\Request\CliRequest::getHeader() in /Library/WebServer/analytics.bluz/application/modules/error/controllers/index.php on line 77
PHP Stack trace:
PHP 1. {main}() /Library/WebServer/analytics.bluz/bin/cli.php:0
PHP 2. Bluz\Application->process() /Library/WebServer/analytics.bluz/bin/cli.php:88
PHP 3. Bluz\Application->dispatch() /Library/WebServer/analytics.bluz/vendor/bluzphp/framework/src/Bluz/Application.php:630
PHP 4. call_user_func_array() /Library/WebServer/analytics.bluz/vendor/bluzphp/framework/src/Bluz/Application.php:731
PHP 5. Bluz\Application->Application{closure}() /Library/WebServer/analytics.bluz/vendor/bluzphp/framework/src/Bluz/Application.php:731
Fatal error: Call to undefined method Bluz\Request\CliRequest::getHeader() in /Library/WebServer/analytics.bluz/application/modules/error/controllers/index.php on line 77
Call Stack:
0.0005 245112 1. {main}() /Library/WebServer/analytics.bluz/bin/cli.php:0
0.0173 1259032 2. Bluz\Application->process() /Library/WebServer/analytics.bluz/bin/cli.php:88
0.0650 1892528 3. Bluz\Application->dispatch() /Library/WebServer/analytics.bluz/vendor/bluzphp/framework/src/Bluz/Application.php:630
0.0662 1897720 4. call_user_func_array() /Library/WebServer/analytics.bluz/vendor/bluzphp/framework/src/Bluz/Application.php:731
0.0662 1898144 5. Bluz\Application->Application{closure}() /Library/WebServer/analytics.bluz/vendor/bluzphp/framework/src/Bluz/Application.php:731
Application Error
Call to undefined method Bluz\Request\CliRequest::getHeader()
/Library/WebServer/analytics.bluz/application/modules/error/controllers/index.php#77
Упрощенная реализация контролера
return
function ()
{
throw new Exception("Hello World");
}
При доступе через http unhandled exception обрабатывается нормально
Для ускорения разработки надо бы добавить помощники для быстрой генерации элементов формы. За пример можно взять http://kohanaframework.org/3.0/guide/api/Kohana_Form
Очень не хватает для быстрой разработки набора валидаторов.
$login = new Validator\Validator('login');
$login ->required()
->alphaNumeric()
->regex("/^[a-z]/")
->check($_POST['login'])
;
// or with custom error messages
$login = new Validator\Validator('login');
$login ->required()
->setError("Login can't be empty");
$login ->alphaNumeric()
->setError("Login can consists only latin characters and numbers");
$login ->regex("/^[a-z]/")
->setError("Login should begin with latin character");
$login->check($_POST['login'])
$email = new Validator\Validator('email');
$email ->required()
->email()
->check($_POST['email'])
;
$email -> getRequirements(); // return rules as array of strings
Структура пакета Validator
:
Validator
- класс обёртка над элементом, с магическим __call()
который будет вызывать соответствующий валидатор.AbstractValidator
- получает в качестве аргумента элемент Validator
, несёт на себе функционал метода setError
, требует реализации init
и check
, для каждого валидатора, текст ошибки по умолчанию несёт сам валидаторValidator\Required
- правило проверкиБудет полезно добавить возможность кешировать не только вычисляемые данные для представления но и HTML целиком.
Как вариант добавить параметр @cache-html
в аннотацию контроллера, параметры функции использовать в качестве ключа к кешу.
Потенциальная проблема - при добавлении CSS и JS используя помощники вида, они не будут попадать в кеш. Вариант - оставить на откуп разработчику, но при использовании данных хелперов выкидывать ошибки.
Если какой-то параметр вдруг является массивом, то попадая в whereList
https://github.com/bluzphp/framework/blob/master/src/Bluz/Db/Table.php#L310
этот массив тянется до самого обращения к PDO вызывая нотис типа "Array to string conversion in"
Аналогичный нотис появляется и в логере https://github.com/bluzphp/framework/blob/master/src/Bluz/Db/Db.php#L602
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.