Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > мой небольшой framework


Автор: DrNemo 15.3.2014, 14:12
Привет всем.
Хочу показать вам свою небольшую поделку, которую уже давно пилю для собственных нужд. Интересно ваше мнение по нему, и возможные проблемы и не доработки.
Особенности:
  • MVC
  • Возможность размещать части сайта по разным папкам, а так же делать общие для всех сайтов компоненты.
  • Поддержка Active Record
  • Достаточно гибкие возможности для каждого action, позволяющие кардинально изменить поведение сайта.
  • Немного юмора)

Зовут Gallant )
https://github.com/DrNemo/gallant.mvc
http://gallantes.ru/ - тут немного о том как этим пользоваться)

Автор: jexerrus 19.3.2014, 09:51
Выглядит приятно

а какие плюсы по сравнению например с Yii ?

Автор: DrNemo 20.3.2014, 21:23
Пожалуй ни чего из уже реализованного, там не круче чем в yii. На мой взгляд yii очень громоздкий, по количеству кода необходимого для реализации задачи, мне приятен более компактный и как мне кажется лаконичный подход.
Так же я считаю, что некоторые моменты должен писать сам программист, это дает больше гибкости и контроля. Например авторизация, вот как на Yii перевести пользователей на новый формат хранения паролей(с md5 на crypt)?
Задачи которые я ставил перед собой, это минимум кода для реализации максимума функционала.
немножко примеров из разных рабочих проектов:
Список всех пользователей сервиса:
Код

function actionIndex(){
    $users = User::fetch();
    G::template()->tpl('member/index', array('users' => $users));
}

Создание новой задачи:
Код

function actionNewTask(){
    if($post = G::getRequest('post', 'new_task')){
        $user = G::get('User');

        $new_task = new Task($post);
        $new_task->auter_id = $user->id;
            
        if($new_task->save()){
            G::ref('/task/');
        }
    }
    G::template()->tpl('task/task-form');
}

Ну и тд)

Автор: DrNemo 21.3.2014, 00:08
П.С.: https://github.com/DrNemo/gallant.mvc/blob/master/control/controlBlog.php - пример контроллера блога

Автор: SamDark 21.3.2014, 01:49
Цитата

Например авторизация, вот как на Yii перевести пользователей на новый формат хранения паролей(с md5 на crypt)?


1. Рассылаем всем юзерам мыло с просьбой сменить пароль.
2. Дописываем в identity или методы, которые там используются,`if(начинается как хеш crypt) { новый код } else { старый код`.
3. Ждём.

Посмотрел немного. Местами узнаётся CodeIgniter в конструкциях вроде "define('GALLANT_SYSTEM', true);" и получении данных из сегментов URL.

1. С именованием плохо:

- Называть директорию контроллеров control странно. Почему для моделей не mod тогда?
- Шаблон head.php включает в себя разметку для тела и футер. Лучше как у всех назвать layout.
- G::getDomen() → G::getDomain()
- G::ref($url) почему не назвать G::redirect($url)?
- Auter → Author
- $f = function(&$v, $k, $f){ понять не просто....
- CONCET_MODEL?

2. Документацию лучше писать в markdown, в HTML замучаетесь...
3. Нет нормальной документации в phpdoc.
4. Нет тестов, а они очень нужны для фреймворка. Это всё-таки основа кучи проектов...

Автор: DrNemo 21.3.2014, 08:32
Цитата(SamDark @  21.3.2014,  01:49 Найти цитируемый пост)
1. Рассылаем всем юзерам мыло с просьбой сменить пароль.
2. Дописываем в identity или методы, которые там используются,`if(начинается как хеш crypt) { новый код } else { старый код`.
3. Ждём.

Немного расстрою вас, на письмо, если вам повезет, отреагируют процентов 10 пользователей)
Я бы сделал смену так (в методе авторизации):
Код

static public function auth($mail, $pass){
        $criteria = User::criteria()->where('mail = :mail')->attr(array(':mail' => $mail))->limit(1);
        $user = User::fetch($criteria)->first();
        
        if(!$user){
            G::setError('auth');
            return false;
        }

        if(!Password::verify($pass, $user->password)){ // новая проверка пароля
            if(md5($pass) == $user->password){ // старая проверка
                $user->password = Password::hash($pass); // сохраняем в новом виде
            }else{
                G::setError('auth');
                return false;
            }
        }
        if($user->bloced){
            G::setError('auth_bloced');
            return false;
        }
        $user->date_login = time();
        $user->save();

        G::setSession('User', array('id' => $user->id));        
        return true;
    }

Про именования спасибо, некоторые моменты учту)
G::ref($url) - имя этого метода "историческое", сейчас я уже даже не могу вспомнить почему именно так)
Auter → Author - эту модель создает сам программист, и название может дать ей любое

за markdown спасибо, попробую
Документация phpDoc сегодня перегружу.
Тесты уже пишу, так что скоро будут и они

И это всего лишь альфа, в ней еще много проблем и недоработок)

Автор: SamDark 21.3.2014, 11:34
Можно и при логине перехешировать. В любом случае использование или не использование Yii ничего не меняет.

Автор: Sanchezzz 25.3.2014, 23:43
Добавлю еще такое:

css с шаблонами лучше не хранить 


Код приложения вообще как по правилу не должен доступен извне, конечно бывают исключения и за технических проблем.

Пример в Laravel 
app/
public/ это папка доступна из интернета.
vendor/ фрамеворк и другие библиотеки
 
Пример Yii2
app/ может на самом деле называться как хочешь
web/ это папка доступна из интернета.
vendor/ фрамеворк и другие библиотеки

Техническая проблема о которой говорилось выше
Иногда конечно такой структурой нельзя воспользоватся, например при хостинге где нет возможности править конфиг апача или ngnix
У каждой проблемы есть решение:
И то эту проблему достаточно переопределить base_path в конфиге приложения + index.php слегка подправить путь к фреймворку

ЗЫ мое чудо https://github.com/sanchezzzhak/Kitty-Framework, проект забросил так как пришел на Yii2 и laravel
возможно я продолжу начатое...

 

Автор: DrNemo 26.3.2014, 09:48
Для решения этой задачи в конфиге можно указать путь к каждой папке (моделей, контроллеров, шаблонов), так же поддерживаются массивы путей, что позволяет сделать например общие модели для нескольких сайтов (не смотря на разные папки доступны они будут в одном namespace).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)