Как использовать те же модели в различных модулях в платформе зенда?

Я только что установил pyFluidSynth на MacOS - возникла та же проблема.

Я исправил это, предоставив звуковой драйвер в методе Synth.start:

fs = fluidsynth.Synth()
fs.start(driver='coreaudio')
8
задан Noah Goodrich 3 November 2008 в 18:09
поделиться

4 ответа

То, что я делаю, является содержанием общие классы в каталоге "библиотеки" за пределами иерархии модулей. Затем установите мой 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.

9
ответ дан 5 December 2019 в 13:02
поделиться

Это может также быть выполнено через соглашение о присвоении имен следовать Zend_Loader. Сохраните свои образцовые файлы в папке моделей под их папкой модуля. Назовите их как Module_Models_ModelName и сохраните их в имени файла ModelName.php в папке моделей для того модуля. Удостоверьтесь, что папка приложения находится в Вашем включала путь и предположение, что Вы используете Zend_Loader для автоматической загрузки можно затем просто сослаться на модели их именем класса.

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

3
ответ дан 5 December 2019 в 13:02
поделиться

У меня та же проблема. Ответ Билла мне не подходит, потому что я склонен разделять свои модули не на «кто их видит», а на «что они делают». Например, «модуль форума» может управляться как администратором, так и публикой. Я пытаюсь использовать внешние модули, такие как 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)

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

(Я не изучал способ автозагрузчик работает, но было бы разумно иметь некоторую систему отображения для решения такого рода проблем.)

0
ответ дан 5 December 2019 в 13:02
поделиться

Я только что создал этот специальный помощник действий для описываемой вами проблемы:

<?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');
  }
}

И это позволит ваш доступ к моделям в любом контроллере во всех модулях.

1
ответ дан 5 December 2019 в 13:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: