[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Мысли о велосипеде
Страницы: 1, 2
Slays
Всем привет. Давно я тут не появлялся, но что-то опять захотелось покодить, решил написать собственный фреймворк любопытства ради. Заведу тут личную темку, может кто чем поможет. Кому интересно, заходите, пишите. Я тут на долго, время от времени буду отписываться, надеюсь на диалог. user posted image

Хотелось бы начать с простых вопросов:
1) Кто какими фреймворками пользуется/пользовался и какие считаете наиболее удобными, ну и почему ?
2) Что обязательно должно быть в хорошем фремворке?

Почитываю пока документации по yii, zend, limb3 и symfony. Все они довольно сильно отличаются.

До связи, темку не удаляйте smile.gif

_____________
если помог, не скупись на карму =)
Игорь_Vasinsky
Цитата
1) Кто какими фреймворками пользуется/пользовался и какие считаете наиболее удобными, ну и почему ?


какая разница?CI, но каждый выбирает сам или по необходимости

Цитата
2) Что обязательно должно быть в хорошем фремворке?


да наверно всё что нужно))
набор библиотек, документация

в Yii есть замечательный CRUD

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Slays
Какие-то основные моменты в принципе понятны:

1) все запросы направляем на index.php
2) запускаем фронт-контроллер/приложение

Внутри приложения происходит:
1) Создание объекта запроса Request: через него обращаемся ко всем глобальным переменным POST, GET, SERVER и т.д, в том числе получаем запрашиваемый URI.
2) Парсинг и возможная маршрутизация запроса через объект Routes, на выходе получаем контроллер/действие/параметры
3) Создаем класс контроллера, запускаем метод/действие с параметрами. В ответ нам должен вернутся сформированный макет.
4) Создаем объект ответа Response, отвечающий за заголовки/хеадеры и ответ серверу, передаем туда сформированный ответ и отдаем в браузер.

Также думаю сделать приложение неким глобальным контейнером для используемых объектов, чтобы мы могли в любом месте из контроллера обратится например к

$this -> app() -> request;
// и т.д. А также подгрузить необходимый класс, типо
$this -> app() -> loader -> load( 'mail', 'Mail' );
// либо через более короткий алиас
// и использовать
$this -> app() -> mail;


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

Например в limb 3 фронт-контроллер сделан в виде цепочки фильтров, которую я полностью не понял. Поскольку сам файл приложения у них остается таким же монолитным с предопределенным набором фильтров, а в случае необходимости использования другого набора придется писать новый наследуемый класс со своим набором. В чем тогда преимущество.

Идея сделать приложение в виде некого конструктора сейчас наиболее интересна, кто что думает. :unsure:

_____________
если помог, не скупись на карму =)
Guest
Игорь_Vasinsky
Цитата
CI, но каждый выбирает сам или по необходимости


Я уже намучился с этим фреймом. Куда не кинься он везде ущербный и приходится править ядро через свои классы. Подскажите пожалуйста как в нём исправить косяк со слётом авторизации и в ajax запросах?
Slays
воу воу парень, заведи себе отдельную тему ))
Люди, кто что скажет про сборный фронт-контроллер.
В зенде вроде используются для этого какие-то плагины диспетчеризации. Какие еще есть варианты ?

_____________
если помог, не скупись на карму =)
Slays
lekafe, Интересно
user posted image
Хоть кто-то здесь живой, это радует )

Мне вот идея фильтров/плагинов/хуков нравится. Только я одно понять не могу, все же они что-то изменяют и всем нужны какие-то входные данные. То есть если я хочу написать какой-то плагин, я должен учитывать то, что вернет мне предыдущий плагин и вообще знать, что нужные этому фильтру данные уже есть в системе. Получаются сплошные зависимости.

Например:
- Получение запроса Request
-- получаем доступ к запросу
- Маршрутизация Routes
-- парсим запрос и получаем контроллер/действие/параметры
- Выполнение Dispatch
-- выполняем контроллер -> действие( параметры)
- Отдаем в браузер Response

Т.е. даже в этой схеме смена порядка действия приведет к сбою, так как каждому из них нужны данные, полученные другим. В зенде вроде бы порядок основных действий задан строго и у нас есть возможность лишь вызывать дополнительные действия до или после основных.

Но все равно получается, если я хочу добавить какой-то плагин, например, проверку авторизации, я должен вставить его в конкретное место, например, после маршрутизации, когда известны контроллер/действие. Да и что если какой-то плагин изменит данные, нужные другому плагину. Как-то гибкости не получается и все плагины нужно друг под друга подстраивать. user posted image

Напиши, если не сложно, принцип команд, которые ты используешь.

_____________
если помог, не скупись на карму =)
bestxp
фреймворки разные бывают, мне лично не нравиться вариант с Фронт Контроллером, мне нравиться вариант системы Событий (Эвентов)

А так по сути мне оч понравился Silex из маленьких, nette из экзотических, yii для всего остального и symphony для сложного.

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

ИМХО

ps added
Еще в последнее время присматриваюсь к AOP библиотеке (Аспекты)
Slays
bestxp Спасибо за наводки, посмотрю что за звери. Конечно хочется что-то свое, в этом и интерес, но основные концепции других тоже хотелось бы понять, чтоб оценить их сильные и слабые стороны. user posted image

_____________
если помог, не скупись на карму =)
bestxp
стороны у каждого свои, я там сказал ИМХО того что понравилось)

а так пробуй и решай что больше нравиться
Slays
lekafe Спасибо, попробую поразбираюсь )


_____________
если помог, не скупись на карму =)
Slays
Фронт-контроллеры пока отложил, затянуло что-то в отдельные пакеты. Сделал пакет для работы с базами данных, надстройка над PDO, пока что только для работы с mysqli, но думаю расширить проблем не составит.

Сделал различные варианты, где-то пока что с ограниченным функционалом. Например, связи между таблицами пока что не реализованы. Название классов связанно с расположением.

Вообщем вот что есть:


Создание соединения с БД
$connect = new Db_Connect_Mysqli( $config );

// выполнение запроса
$connect -> execute( "INSERT INTO" );

// выполнение запроса выборки
$connect -> fetchAll( "SELECT * FROM table" );


Использование DBAL (абстрактный слой доступа)
Простой фасад для выполнения запросов
$dbal :: query( $sql );
$dbal :: select( $table, $query_params );
$dbal :: insert( $table, $data );
$dbal :: update( $table, $data, $where );
$dbal :: delete( $table, $where );


Составные запросы

// чтение
$query = new Db_Query_Select( $connect );
$query -> select() -> from( 'table' ) -> where( $where ) -> limit( 2 ) -> query();

$query = new Db_Query_Select( $connect, array( 'from' => 'table', 'where' => 'where' ) );
$query -> query();

// запись
$query = new Db_Query_Insert( $connect );
$query -> insert( $table ) -> import( $data ) -> execute();

// изменение
$query = new Db_Query_Update( $connect );
$query -> update( $table ) -> import( $data ) -> where( $where ) -> execute();

// удаление
$query = new Db_Query_Delete( $connect );
$query -> delete( $table ) -> where( $where ) -> execute();


Цепочку можно заменить:

// чтение
$query = new Db_Query_Select( $connect, array( 'from' => 'table', 'where' => $where ) );

// запись
$query = new Db_Query_Insert( $connect, $table, $data );

// и т.д.


Использование ORM (объектная модель), работа с таблицей

// установка соединения по умолчанию для всех таблиц
Db_Table :: setConnect( $connect );

$table = new Db_Table( 'page' );

// возвращает список строк
$table -> find( $where, $query_params );

// возвращает одну строку
$table -> findById( 2 );

// другие операции
$table -> insert( $data );
$table -> update( $data, $where );
$table -> delete( $where );


Active Record

// добавление строки
$page = new Page();
$page -> name = 'Новое имя';
$page -> save();

// чтение и изменение строк
$pages = AR :: find( $query_params );
$pages -> name = 'Новое имя';
$pages -> save();

// удаление строк
$pages = AR :: find( $query_params );
$pages -> delete();


Все запросы выборки возвращают итератор объектов, которые можно считывать, например, так:


while( $row = $reader -> read() )
echo $row -> getName() . '<br/>';


Интересно, кто какие способы доступа к БД обычно использует и есть ли какие замечания по данному API ?

_____________
если помог, не скупись на карму =)
redreem
я их (фреймворков) писал аж 4 штуки... сейчас у меня четкое устоявшееся мнение, что в однюху в разумные сроки (ну скажем год) в рамках "свободного времени" написать стоящий фреймворк не реально... посоветую yii и забить на свои велосипеды, если конечно велосипед не имеет финансирования smile.gif
inpost
redreem
Действительно так много? Я как не загляну, везде одно и то же самое, набор с десяток классов и всё smile.gif

Slays
Так как нет тематики, сложно о чём-то начать говорить... Хотя если о последнем комментарии, то твой класс справится с сложными запросами на LEFT JOIN + подзапросом внутри запроса? Или есть простой метод, который предназначен для сложных запросов без оболочки с прямым доступом к query ?
И ещё, без кода + документации - сложно о чём-то говорить.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
bestxp
И ещё совет придерживайся psr1 psr0
Slays
inpost
Ну вот самый простой интерфейс для сложных запросов:

$connect = new Db_Connect_Mysqli( $config );
$connect -> execute( "INSERT INTO" );
$connect -> fetchAll( "SELECT * FROM table" );


LEFT JOIN в принципе реализован, подзапросы пока не пробовал, но это не так сложно. Сейчас, пожалуй, самое сложное это реализовать зависимости между таблицами, каскадные операции и т.д.

Мне тут больше интересно, кто какие интерфейсы чаще применяет ? Сами пишете все запросы, через составные или еще как ?

И что именно по оформлению не так ? в плане psr ? По сути я представил просто куски API, ну да, пока без использования пространства имен.

Насчет количества фреймворков тоже не понял, по сути ж это куча независимых пакетов и прослойка, пакеты достаточно написать один лишь раз. Какие вообще трудности возникают при написании своего фреймворка, на что там нужен год ? Я то конечно пишу чисто ради прокачки скилзов, время особо не поджимает, общественности представлять его не собираюсь =)

Еще очень хочу, но никак не могу, приучить себя к написанию тестов в стиле экстремального программирования.

_____________
если помог, не скупись на карму =)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.