Катализатор требует полной загрузки всего приложения
Итак, у меня есть файл.lib с некоторыми из моих собственных подпрограмм, которые я хотел бы сделать доступными для всего приложения Catalyst. Сейчас мне нужен файл в lib / myapp.pm, и у меня нет проблем. Однако всякий раз, когда я пытаюсь вызвать эту подпрограмму в контроллере, я получаю эту ошибку:
"Undefined subroutine &myapp::Controller::Root::my_sub called at
/home/user/myapp/lib/myapp/Controller/Root.pm line 35, <DATA> line 1003."
Если мне требуется файл, который я хочу требовать в контроллере, это не дает мне никаких проблем. Однако я бы предпочел загружать его только в одном месте для всего приложения, если это было возможно. Кроме того, если мне требуется файл в контроллере, означает ли это, что этот файл загружается каждый раз, когда делается запрос? (Я использую mod_perl, если это имеет какое-либо значение). Я хотел бы сделать это максимально эффективным с точки зрения загрузки файла один раз для всего приложения и любых запросов, а также загрузки только в одном месте только ради чистого кода. Спасибо!
2 ответа
use myapp;
в основном
BEGIN {
require myapp;
import myapp;
}
require myapp;
исполняет myapp.pm
если это еще не было выполнено. Другими словами, независимо от того, сколько раз вы делаете use myapp;
в процессе файл будет выполнен ("загружен") только один раз.
import myapp;
звонки myapp::import()
если это существует для того, чтобы экспортировать вещи. Если предположить, myapp
экспорт my_sub
Вот почему ваш код не работает.
У вас есть два варианта.
- Позвоните
mysub
вmyapp
пакет:myapp::my_sub(...)
, - использование
use myapp;
создать локальное имя дляmy_sub
в каждой посылкеmy_sub
так что вы можете позвонить, используя толькоmy_sub(...)
, (Это предполагаетmyapp
экспортmy_sub
.)
Команда use myapp;
загрузит ваш файл myapp.pm только один раз, даже если он вызывается несколько раз. Но каждый раз, когда она вызывает подпрограмму импорта, становится доступной функция my_sub() (при условии, что вы экспортируете ее с помощью Exporter или чего-то еще) без необходимости писать myapp::my_sub().