Автозавершение кода для phalconphp
Хотелось бы иметь простой доступ к списку методов некоторых сервисов и передаваемых в них параметров не заглядывая в документацию.
Конечно, из любого контроллера можно обратиться к стандартному сервису через переменную с соответствующим названием $this->tag, $this->url, автодополнение срабатывает как положено в любом нормальном IDE. Как настроить автодополнение для phalconphp для Netbeans?
Но в случае использования своих сервисов IDE уже молчит. Да и возникает необходимость обращаться как к своим, так и к стандартным сервисам phalcon не только из контроллеров.
В моделях возникает необходимость добавить методы получения данных из соответствующих таблиц, в случаях, когда критерии выборки из таблицы сложные, в этом случае неправильно пихать такой код в контроллер, тем более, когда получаем эти данные с такими критериями в нескольких местах одного, а то и нескольких контроллеров. При этом может возникнуть необходимость обратиться к методам сервисов: базы данных, acl.
К примеру, надо получить список задач:
проверяем, чтобы ответственный за выполнение задачи или постановщик совпадал с ИД текущего пользователя или он входил в список наблюдателей задачи;
обнуляем поля таблицы, для просмотра которых пользователей не имеет прав (обусловлено использованием dataTables — данные передаются по аякс и в данных должны присутствовать все столбцы).
Получается — из модели мы как минимум должны обратиться к методам сервисов auth (предпочитаю использовать отдельный сервис для данных пользователя, который умеет инициализироваться по ключу из кук, запомнить авторизацию в куках и забыть при выходе) и acl (\Phalcon\Acl\Adapter), в некоторых случаях еще возникает необходимость вызвать методы адаптера базы данных (\Phalcon\Db\Adapter\Pdo) или модель-менеджера (\Phalcon\Mvc\Model\Manager).
Можно, конечно, воспользоваться конструкцией вида:
\Phalcon\DI::getDefault()->getModelManager() \Phalcon\DI::getDefault()->getAuth() # или \Phalcon\DI::getDefault()->get('modelManager') \Phalcon\DI::getDefault()->get('auth')
Но, вот незадача — в обоих случаях уже надо будет лезть в документацию, чтобы узнать точное название нужного метода и порядок передаваемых параметров. А хотелось бы, чтобы IDE сразу выдало подсказку для всех возможных методов.
Для начала: я предпочитаю при инициализации сервисов объявить глобальную функцию getDi():
/** * @return \Phalcon\DI\FactoryDefault */ function getDi() { static $di = null; if (!$di) { $di = new \Phalcon\DI\FactoryDefault(); } return $di; }
потому как не люблю лишнего нагромождения кода, которое создаст использование конструкции \Phalcon\DI::getDefault().
Далее, создаем папочку в проекте, к примеру my-phalcon.
И копируем туда phalcon-devtools\ide\{номер версии}\Phalcon\DI.php.
Вносим нужные изменения в этот файлик — добавляем вызов недостающих там сервисов:
namespace Phalcon { ... class DI implements \Phalcon\DiInterface { ... /** * @return \Phalcon\Security */ public function getSecurity() {} /** * @return \Handy\Models\Auth */ public function getAuth() {} /** * @return \Phalcon\Acl\Adapter\Memory */ public function getAcl() {} /** * @return \Phalcon\Db\Adapter\Pdo\Mysql */ public function getDb() {} /** * @return \Phalcon\Tag */ public function getTag() {} ... # ваши сервисы ...
И, вуаля: автозавершение для всех доступных методов, всех нужных сервисов работает!