Я только что установил pyFluidSynth на MacOS - возникла та же проблема.
Я исправил это, предоставив звуковой драйвер в методе Synth.start:
fs = fluidsynth.Synth()
fs.start(driver='coreaudio')
То, что я делаю, является содержанием общие классы в каталоге "библиотеки" за пределами иерархии модулей. Затем установите мой INCLUDE_PATH
использовать каталог "моделей" соответствующего модуля, плюс общий каталог "библиотеки".
docroot/
index.php
application/
library/ <-- common classes go here
default/
controllers/
models/
views/
members/
controllers/
models/
views/
admin/
controllers/
models/
views/
. . .
В моем сценарии начальной загрузки добавил бы я"application/library/
"к INCLUDE_PATH
. Затем в каждом контроллере init()
функция, я добавил бы что модуль"models/
"каталог к INCLUDE_PATH
.
править: Функции как setControllerDirectory()
и setModuleDirectory()
не добавляйте соответствующие каталоги моделей к INCLUDE_PATH
. Необходимо сделать это сами в любом случае. Вот один пример того, как сделать это:
$app = APPLICATION_HOME; // you should define this in your bootstrap
$d = DIRECTORY_SEPARATOR;
$module = $this->_request->getModuleName(); // available after routing
set_include_path(
join(PATH_SEPARATOR,
array(
"$app{$d}library",
"$app{$d}$module{$d}models",
get_include_path()
)
)
);
Вы могли добавить"library
"к Вашему пути в начальной загрузке, но Вы не можете добавить"models
"каталог для корректного модуля в начальной загрузке, потому что модуль зависит от маршрутизации. Некоторые люди выполняют в этом init()
метод их контроллеров и некоторые люди пишут, что плагин для предварительной отправки ActionController сцепляется с установленным INCLUDE_PATH
.
Это может также быть выполнено через соглашение о присвоении имен следовать Zend_Loader
. Сохраните свои образцовые файлы в папке моделей под их папкой модуля. Назовите их как Module_Models_ModelName
и сохраните их в имени файла ModelName.php в папке моделей для того модуля. Удостоверьтесь, что папка приложения находится в Вашем включала путь и предположение, что Вы используете Zend_Loader
для автоматической загрузки можно затем просто сослаться на модели их именем класса.
Это имеет преимущество хранения Вашего типового кодекса, сгруппированного в с фактическим модулем, для которого это. Это сохраняет модуль содержавшим в единственной структуре папок, которая помогает поощрить инкапсуляцию. Это также поможет в будущем, если необходимо портировать модуль на другой проект.
У меня та же проблема. Ответ Билла мне не подходит, потому что я склонен разделять свои модули не на «кто их видит», а на «что они делают». Например, «модуль форума» может управляться как администратором, так и публикой. Я пытаюсь использовать внешние модули, такие как admin, members, public, но затем они используют другие модули, такие как «forum / validatepost», «forum / show users personal info». Если бы кто-нибудь мог пролить свет на то, как они защищают внутренний модуль от общественности, то это было бы удобно. Я предполагаю, что ACL может быть ключом, но меня все еще беспокоит то, что доступ контролируется объектами, а не файловой системой / .htaccess и т. Д.
Чтобы ответить на вопрос PHPoet: (i) Пути к каталогам контроллера модуля можно указать с помощью вызовов фронт-контроллера: например, см .: «12.11.2. Указание каталогов контроллеров модулей» (Zend Framework Docs)
(ii) Пути к представлениям можно задать с помощью ViewRenderer (помощник действий контроллера) например, см .: «Пример 12.12. Выбор другого сценария представления »(Zend Framework Docs)
Путем экспериментирования с возможностью изменить пути по умолчанию к представлениям и контроллерам, тем самым освобождая автозагрузчик для нормальной работы.
(Я не изучал способ автозагрузчик работает, но было бы разумно иметь некоторую систему отображения для решения такого рода проблем.)
Я только что создал этот специальный помощник действий для описываемой вами проблемы:
<?php
class My_Controller_Action_Helper_GetModel extends Zend_Controller_Action_Helper_Abstract
{
/**
* @var Zend_Loader_PluginLoader
*/
protected $_loader;
/**
* Initialize plugin loader for models
*
* @return void
*/
public function __construct()
{
// Get all models across all modules
$front = Zend_Controller_Front::getInstance();
$curModule = $front->getRequest()->getModuleName();
// Get all module names, move default and current module to
// back of the list so their models get precedence
$modules = array_diff(
array_keys($front->getDispatcher()->getControllerDirectory()),
array('default', $curModule)
);
$modules[] = 'default';
if ($curModule != 'default') {
$modules[] = $curModule;
}
// Generate namespaces and paths for plugin loader
$pluginPaths = array();
foreach($modules as $module) {
$pluginPaths[ucwords($module)] = $front->getModuleDirectory($module) . '/models';
}
// Load paths
$this->_loader = new Zend_Loader_PluginLoader($pluginPaths);
}
/**
* Load a model class and return an object instance
*
* @param string $model
* @return object
*/
public function getModel($model)
{
$class = $this->_loader->load($model);
return new $class;
}
/**
* Proxy to getModel()
*
* @param string $model
* @return object
*/
public function direct($model)
{
return $this->getModel($model);
}
}
Итак, в вашем Bootstrap.php:
Zend_Controller_Action_HelperBroker::addPrefix('My_Controller_Action_Helper');
И в любом из ваших контроллеров:
<?php
class IndexController extends Zend_Controller_Action
{
public function indexAction()
{
$model = $this->_helper->getModel('SomeModel');
}
}
И это позволит ваш доступ к моделям в любом контроллере во всех модулях.