хочется немного обсудить yii

Adelf

Administrator
Команда форума
kohana мне не нравится
расскажи кратко - чем? (можно в личку, но лучше сюда. Для пользы обществу)
З.Ы. Любой холивар на тему фреймворков будет перенесен отсюда.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
только желательно имея опыт с yii/zf/symfony, а не просто "я его взял, а там так классно! сайт за 10 минут - DruPal рулит!"
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Сегодня нашел неплохую фичу.
задача была - проверить при обновлении поста, что пост принадлежит автору

yii поддерживает лямбда-колбеки и решение - в 3 строки (остальное уже было сделано генератором)
PHP:
class PostsController extends Controller
	public function accessRules(){
	    $Model = Posts::model()->findByPk((int)_GET('id'));
		return array(
			array('allow', // allow author user to perform 'admin' and 'delete' actions
				'actions'=>array('update','delete'),
				'users'=>array('@'),
				'expression'=>function () use ($Model){
			            return $Model && $Model->user_id == yii::app()->user->id;
				    },
			),
		);
	}
'actions'=>array('update','delete'), - список действий для проверки
'users'=>array('@'), - только залогиненые
yii::app()->user - встроенный объект, связанный с сессией и формой логина,
'expression'=> - мое замыкание

наконец-то я могу писать на PHP как на jQuery :)
 

MiksIr

miksir@home:~$
Но вообще лучше это через RBAC делать. Хотя конкретную проверку вот на роль в accessRules не запихнуть, ибо нельзя передать параметр в бизнес-правило.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
вообще-то не лучше :)

RBAC - большой и мощный модуль, по принципу бритвы Оккама я его выключил

>конкретную проверку вот на роль в accessRules не запихнуть
а вот это без проблем
PHP:
//accessRules:
			array('allow', // allow author to update
			        'actions'=>array('update'),
			        'role'=>'author'
			),
в учебнике пример инициализации ролей
PHP:
$task=$auth->createTask('updateOwnPost','редактирование своей записи','return Yii::app()->user->id==$params["post"]->authID;');
$role=$auth->createRole('author');
$role->addChild('updateOwnPost');
мне не нравится, что правила читаются из базы, а потом исполняются через eval -
"нафига нам эти навороты"(С) вместо проверки на равенство 2х переменных
 

MiksIr

miksir@home:~$
А я вот недавно отругал себя, что не сразу стал использовать RBAC а ограничился user->isAdmin. Потому что, конечно, понадобилось что-то большее.

> а вот это без проблем
Ага, а $params["post"] ты в этом случае откуда брать будешь. В том то и дело, что этот пример работает для ->checkAccess('role', $params), но не работает для фильтра.
 

Long

Новичок
при старте меня больше всего убил тот момент, когда я попытался вывести данные из связанных моделей. я перелопатил чуть ли не весь форум (ман в этом отношении вообще не помощник), убил дня полтора, пока добился результата. кстати, с релейшенами там далеко не так все гладко. особенно это касается HAS_ONE и MANY_MANY.
за 4 месяца работы лично у меня накопилось 5 серьезных (на мой взгляд серьезных) претензий.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
MiksIr, $params - параметр метода CDbAuthManager::executeBizRule($bizRule,$params,$data), локальная переменная среды, в которой исполняется eval()
какой "этот пример"? какие фильтры? ты запутался и меня путаешь

Long, а в чем была проблема и какие претензии? очень интересно
 

Long

Новичок
  1. Отсутствие эмуляции вложенных транзакций. Например, у меня есть расширение "биллинг", которое требует атомарности. Но я не могу открыть транзакцию в своем расширении, потому как тот кто использует его, может так же ее стартовать. Принцип черного ящика не работает. В ближайших планах сделать патч - вроде ничего не должно помешать
  2. при использовании CActiveDataProvider установленные в критерии отбора limit и offset не используются, а используется то, что передается через объект CPagination. Исходный код смотрел, понимаю зачем так сделано, но как красиво разрешить проблему (чтобы при заданных в критерии значения брались оттуда) - не нашел. Требует довольно серьезных изменений кода Yii. Пока решил тем, что написал тупой метод конвертер, который из limit и offset для критерия получает соответствующие значения для пагинатора и при создании CActiveDataProvider его вызываю - по крайней мере изменения локализованны в одном месте.
  3. Я бы предпочел чтобы CActiveRecord в любом случае при создании (поиске) возвращал бы объект. 21 век на дворе, а приходится проверять возвращаемые значения и строить явно лишние обработки.
  4. То, что в модели напрямую используются параметры, пришедшие из вне (например,номер страницы, переданный через GET) - это вообще за гранью добра и зла, ихмо. Таким образом обеспечивается магия в работе штатных гридов. На мой взгляд, не дело для фреймока позволять внутри себя что-то магическое производить. И вообще, из-за этого подхода существует такой косяк как п.2.
  5. Магия на этом не заканчивается. Почему-то для контроллеров ввели чумовое правило - имя файла должно начинаться с прописной буквы. При этом ко всем остальным субъектам фреймворка таких требований нет (по крайней мере я не встречался еще).
  6. Использовать объект запроса и объект ответа - это правильно, почему по такому пути не пошел Yii, я не знаю. Наверное тоже можно "полечить", но это для меня сейчас не самое актуальное, проживем и так.
  7. Ну и документация... Вроде как довольно много, но когда начинаешь сталкиваться с реальной жизнью - в ней как правило ответов нет. Либо они зашифрованы (например, нет явного указания на п.5, только постфактум понимаешь, что да, есть такое требование, ну или исходный код посмотреть - так выходит быстрее)
 

MiksIr

miksir@home:~$
Отсутствие эмуляции вложенных транзакций. Например, у меня есть расширение "биллинг", которое требует атомарности. Но я не могу открыть транзакцию в своем расширении, потому как тот кто использует его, может так же ее стартовать. Принцип черного ящика не работает. В ближайших планах сделать патч - вроде ничего не должно помешать
Наверно потому, что в PDO нет нативной поддержки сейвпоинтов, а значит непонятно - поддерживает ли база такую фичу.
 

MiksIr

miksir@home:~$
Я бы предпочел чтобы CActiveRecord в любом случае при создании (поиске) возвращал бы объект. 21 век на дворе, а приходится проверять возвращаемые значения и строить явно лишние обработки.
Спорно. В большинстве случаев все-равно придется делать проверки типа $obj->isNew
Ну и вообще - пустой объект выглядит менее логично, если мы попросили find
 

Long

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

MiksIr

miksir@home:~$
Вы то знаете, а вот автор Yii - нет. Это к тому, почему нет из коробки.
 

Long

Новичок
спорьте. мне очевидны преимущества работы с объектами при использовании ОО подхода.

Вы то знаете, а вот автор Yii - нет.
рекомендую заглянуть в исходники CDbTransaction и обратить внимание на $_connection. Не надо принижать знания автора, Qiang крутой чувак ;)
 

korchasa

LIMB infected
Long
Ты можешь написать пример кода, где использование объекта, вместо null, давало бы какие-то плюсы? И что по твоему должно возвращаться? Пустой объект Article или специальный NullArticle?
 
  • Like
Реакции: AmdY

AmdY

Пью пиво
Команда форума
korchasa прав. у меня на одном проекте была реализация, когда всегда возвращался "пустой" объект, да ещё с предустановленным айди, намучался
PHP:
$obj = new News(12);
if ($obj) {} // true
$obj->getId() {} // 12
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Long, спасибо

1. требование довольно специфическое. Во фреймворке этого быть не должно.
думаю, решается через колбеки на события в DAO, с флагами на начало транзакций
2. не сталкивался
3. +1, 2й мой патч - возврат коллекции вместо 2-мерного массива, как я уже привык
AmdY, объект с id - по определению не пустой, косяк с неконсистентностью объекта - говнокод, а не аргумент
korchasa, смысл в инкапсуляции есть, в соблюдении типа данных - тоже, но щас будет долгий флейм, попозже - с удовольствием.
при fetchRow - можно возвращать пустой массив, fetchColumn - null, fetchObj - пустой объект
4. Где это можно увидеть? Еще я не понял зачем в контроллере получать get-параметр через аргумент.
мой 1й патч - своя обработка ввода.
5. и не только, от подобных ROR-style easter eggs я просто прифигел поначалу, явно сделано по привычке
6. думаю, это будет, но потом, во 2й версии
а доку писали социопаты с умственным нарушением, да уж ...
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
> какие фильтры?
Вот этот http://www.yiiframework.com/doc/guide/1.1/en/topics.auth#access-control-filter
Как ты в этот фильтр засунешь $param?
Так, еще раз. $param не относится к фильтру, вообще.
Это локальная переменная той функции, где исполняется eval. Код, который исполняется в eval, определяется в task-е при инициализации менеджера ролей CDbAuthManager.
Содержимое $param передается контроллером через длинный каскад вызовов.

В фильтрах мы только подключаем правила, в правиле - называем имя роли, по которой из базы вытягивается правило и task с текстом кода для исполнения.
Это, блин, то самое программирование по негласным соглашениям.

Из контроллера напрямую передать параметры - никак, только через свой реестр.
А вот с лямбдой - все замечательно.
 
Сверху