你在这里

Drupal里public://在哪里定义的

主标签

public://是怎么生效的,在哪里定义?

大致步骤:

1.drupal bootstrap的引导阶段drupal_bootstrap_full里,会调用file_get_stream_wrappers() 来保证注册了所有的stream wrapper.
//common.inc的5186行.

2. file_get_stream_wrappers函数是在includes/file.inc里定义,这个函数里会利用钩子原理调用module_invoke_all('stream_wrappers')来得到所有在其它模块里定义的stream wrapper.这时,核心模块system.module里的system_stream_wrappers()会被调用,这个函数里声明了public://的信息如下:

$wrappers = array(
    'public' => array(
      'name' => t('Public files'),
      'class' => 'DrupalPublicStreamWrapper',
      'description' => t('Public local files served by the webserver.'),
      'type' => STREAM_WRAPPERS_LOCAL_NORMAL,
    ),
    'temporary' => array(
      'name' => t('Temporary files'),
      'class' => 'DrupalTemporaryStreamWrapper',
      'description' => t('Temporary local files for upload and previews.'),
      'type' => STREAM_WRAPPERS_LOCAL_HIDDEN,
    ),
  );

3.得到所有wrapper之后再通过PHP原生的函数stream_wrapper_register(协议名,类)来注册wrapper.

在file_get_stream_wrappers函数的146行有这样一句:stream_wrapper_register($scheme, $info['class']);这个$cheme就是指public,这个$info["class"]就是上面的DrupalPublicStreamWrapper.

这个类定义在includes/stream_wrappers.inc里,如下:

/**
 * Drupal public (public://) stream wrapper class.
 *
 * Provides support for storing publicly accessible files with the Drupal file
 * interface.
 */
class DrupalPublicStreamWrapper extends DrupalLocalStreamWrapper {
  /**
   * Implements abstract public function getDirectoryPath()
   */
  public function getDirectoryPath() {
    return variable_get('file_public_path', conf_path() . '/files');
  }

  /**
   * Overrides getExternalUrl().
   *
   * Return the HTML URI of a public file.
   */
  function getExternalUrl() {
    $path = str_replace('\\', '/', $this->getTarget());
    return $GLOBALS['base_url'] . '/' . self::getDirectoryPath() . '/' . drupal_encode_path($path);
  }
}

其实就是对PHP STREAM WRAPPER的实现。

---------------------------------------------------------------------------------------------------------

PHP Wrapper是什么
自PHP 4.3开始,PHP开始允许用户通过stream_wrapper_register()自定义URL风格的协议。用户使用fopen(), copy()等文件系统函数对封装协议进行操作时,PHP会调用注册协议时所提供的类中相应的函数。
PHP手册中给了一个例子,它将VariableStream类注册为var://协议,通过这个协议,用户可以使用文件系统函数直接读写全局变量。例如,用户可以通过 “var://foo” 读写 $GLOBALS['foo'] 。

---------------------------------------------------------------------------------------------------------

在此感谢[Drupal中国]群友 "冉强军"的帮助!

Drupal 版本: 

猜你喜欢