Giter Site home page Giter Site logo

framework's People

Contributors

andreyalex avatar antonshevchuk avatar bashmach avatar baziak avatar dyachenko avatar filipp-kucheriavenko avatar kvasenko avatar l2avenholm avatar lavoryk avatar loginwashere avatar mak-di avatar maxlm avatar miroling avatar peter279k avatar pzhv avatar scrutinizer-auto-fixer avatar silverslice avatar taras-seryogin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

framework's Issues

Refactoring Db\Row

Необходимо функционал методов doInsert(), doUpdate() и delete() перенести в Db\Table, таким образом мы облегчим сам объект, и отвяжим его от SQL таблицы, что позволит нам использовать Db\Row как сущность, а Db\Table как коллекцию и менеджер сущностей.
В дальнейшем это позволит безболезненно создать Model\Record и Model\Collection которые и будут реализовывать данные классы.
Совместимость не пострадает.

Refactoring Request package

Странно видеть константы вида METHOD_POST внутри AbstractRequest, ведь они относятся лишь к HTTP

Add support for PostgreSQL

Нужно проверить как фреймворк будет дружить с PostgreSQL, на данный момент знаю лишь, что будет проблема с получением значения sequence, т.е. нужно будет слегка модифицировать код.

Translation Package

Удобный пакет для разработки мультиязычных приложений
Нужны ли адаптеры - не уверен, может стоит оставить лишь массив?
Ну и в любом случае необходимо предусмотреть быстрый анализ сорцов для поиска фраз, которые надо перевести.

Grid pagination with custom route

есть роутер
@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 подхватывался гридом не удалось - урлы строит, но как параметр не ловит)

Queue Package

Пакет для организации очередей, возможно с несколькими адаптерами, возможно на основе чего-то готового (см http://framework.zend.com/manual/1.12/ru/zend.queue.html)
Должен использоваться для отправки почтовых сообщений (см #16)

Optional Packages

Необходимо организовать быструю загрузку пакетов без необходимости внесения изменений в Application.php
Первый на выход - пакет Ldap.

sprintf и символ %

Не хочу лезть со своим уставом в чужой монастырь, поэтому не лезу сразу в код.

В общем 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 and CI

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.

DI Package

Подумать над реализацией и необходимостью пакета dependency injection
Пока я вижу лишь необходимость DI между модулями и вендорами, т.е. когда один модуль завязан на другой, или когда модуль требует ещё какие либы

Внутри самого фреймворка у нас либо жёсткие зависимости, либо наоборот - пассивные - нет, значит и не надо, идём запасным путём.

Error while saving result in Bluz\View\Cache

Если для контроллера включено кеширование, а глобальное кеширование отключено, в методе save переменная fullPath будет не инициализирована (не хватает проверки значения $this->cache).

Add adapters for Auth

Система авторизация должна поддерживать следующие провайдеры:

  • по умолчанию - связка логин/пароль - данный функционал вынесен в \Application\Auth\Table
  • Twitter - данный функционал вынесен в контроллер twitter\auth
  • Facebook - данный функционал вынесен в контроллер facebook\auth
  • LinkedIn
  • VKontakte
  • OpenID

Для реализации последних стоит использовать guzzle

Mail Package

Необходим пакет, который будет врапером/хэлпером для какой-нить популярной Mail либы типа PHPMailer

Bluz\Logger

Не совсем понятно зачем данный класс был унаследован от AbstractLogger,
а затем еще была добавлено использование реализации (use) LoggerTrait
может оставить просто наследование AbstractLogger?

Prepare for RESTful services

Надо добавить в док блок атрибут @method, который позволит отсекать изначально неправильные запросы при организации REST сервисов

Hardcoded PATH_APPLICATION

В фреймворке кроме DEBUG константы так же встречается PATH_APPLICATION, надо бы избавится от столь неявного бага

Refactoring Crud/Rest packages

На данный момент функционал пакета Rest и Crud не соответствует KISS идеологии, всё не так уж и очевидно как хотелось бы.
Плюс, хотелось бы добавить интерфейс (Rest или Crud), который можно реализовать в классах-наследниках от Db\Table, что упростило бы в разы реализацию тривиальных задач по созданию менеджеров сущностей

Don't work PHP_SESSION_UPLOAD_PROGRESS system

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 (или другой фреймворк) переустанавливает пути для сохранения сессии, то это уже другая сессия

Fix addError method in Crud for Translator

У нас получается пересечение с методом Messages::addError($message), что сводит с ума парсер gettext'a при поиске строк для перевода (мы его настраиваем на поиск вызовов функции addError со строкой в первом параметре)

View Ahref issue

В коде помощника Ahref не используется помощник Attributes.php

Implement Request Mappers (Improvement)

В каждом контроллере, мы сейчас инициализируем Формы, сами засовываем данные из Запроса, и также потом это все обрабатываем, добавляем Фильтры, которые по 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, типизация запроса смогла бы помочь.

Code Rafactoring: Cache

Перенести View\Cache -> Cache\File
Расширить функционал и добавить поддержку тегов - т.к. это необходимо для выборочной очистки кеша

Code Review: Auth

Надо бы расписать провайдеры, а не тулить всё в Application\Auth\Table

Add support for SQLite

Необходимо проверить, есть ли какие проблемы, если есть - допилить

Grid pagination

Добавить возможность построения пагинации для произвольных url
На данный момент url строится на базе module/controller + params (page, limit, orders ,filters)

Add support for MongoDb

Уже появилась необходимость в поддержке NoSQL решений, можно попробовать реализовать и узнать насколько проблематично вписать их в фреймворк

Content-Length in JSON Response > 8000 bytes

При ответе в виде 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;

Code Review: Rcl

Просмотреть текущую реализацию, проверить работоспособность, обновить документацию

Bluz\Db->connect

  1. Добавь атрибут \PDO::ATTR_PERSISTENT => true
    при создании PDO объекта, а то сыплются ошибки "Attempt connection to database is failed"
    Пример моей реализации
    $this->dbh = new \PDO(
    $this->connect['type'] . ":host=" . $this->connect['host'] . ";dbname=" . $this->connect['name'],
    $this->connect['user'],
    $this->connect['pass'],
    array(\PDO::ATTR_PERSISTENT => true, \PDO::ATTR_ERRMODE => $this->errorMode)
    );
  2. Добавь больше репорта об ошибке при создании PDO объекта ($e->getMessage())
    Например:
    $this->log("Connected");
    } catch (\Exception $e) {
    throw new DbException('Attempt connection to database is failed: '.$e->getMessage());
    }

Add support relations for DbTable

На текущий момент связи как-то странно организованы, надо бы это дело привести в порядок

View sanitize

До идеала View не хватает удобного инструмента для "обезвреживания" данных в шаблоне. Возможные пути решения - создания "обёртки"/"презерватива", вроде бы тот же объект, но нет...:

<?php
$foo->bar = "<script>alert(123)</script>";
$foo = new Sanitize($foo);
echo $foo->bar; // &lt;script&gt;alert(123)&lt;/script&gt;

Acl Guest Access

Система считает guest бесправным, и не получается дать ему права какие-либо
Т.е. надо физически удалять привелегию, если необходимо разрешить её гостю

Added possibility to build Db\Query\Select with predefined Table

Удобный сценарий для использования 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();

Call to undefined method Bluz\Request\CliRequest::getHeader()

Данную ошибку выдает консольный вызов
типа
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 обрабатывается нормально

Validation package

Очень не хватает для быстрой разработки набора валидаторов.

$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 - правило проверки

Add possibility for cache controller as HTML file

Будет полезно добавить возможность кешировать не только вычисляемые данные для представления но и HTML целиком.

Как вариант добавить параметр @cache-html в аннотацию контроллера, параметры функции использовать в качестве ключа к кешу.

Потенциальная проблема - при добавлении CSS и JS используя помощники вида, они не будут попадать в кеш. Вариант - оставить на откуп разработчику, но при использовании данных хелперов выкидывать ошибки.

Массивы в ключах DB\Table

Если какой-то параметр вдруг является массивом, то попадая в 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

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.