2016-04-20 4 views
0

Как настроить модуль Kohana + Twig, чтобы Twig установил права на запись «все для записи» для всех его каталогов кэша и его потомков?Устранение прав доступа к файлам кэша для модуля Kohana Twig

Так, например, когда я запускаю мое приложение через модуль Apache (mod_php) и владелец файла кэша apache (или httpd) пользователь, я буду иметь возможность удалить кэш-файлы (для очистки кэша или полностью удалить весь приложение) с использованием обычного пользователя и ssh доступ.

Я могу сделать это с кешем Kohana, но кег Twig создан каким-то образом по-другому.

ответ

0

Это не очень просто, но не слишком сложно. Я получил состояние, представленное ниже методом проб и ошибок.

  1. Создать класс, который наследуется от Twig_Cache_Filesystem и будет использоваться вместо его. Проверьте это:

    <?php 
    namespace Application\Twig; 
    
    class Cache_Filesystem extends \Twig_Cache_Filesystem 
    { 
        public function write($key, $content) 
        { 
         $old = umask(0000); 
         parent::write($key, $content); 
         umask($old); 
        } 
    } 
    

    Обратите внимание, что этот класс должен иметь это имя уникальным, так что это хорошая идея, чтобы пространство имен его. Кроме того, он должен быть доступен для другого кода, поэтому рассмотрите возможность использования автозагрузки composer.

    Это само исправление, остальное руководство - это просто способ его реализации в экосистеме Кохана + Твиг.

  2. Копия Twig.php из modules/kohana-twig/classes/Twig.php в каталог приложения, т.е. application/classes/Twig.php (спасибо Kohana's Cascading Filesystem!)

  3. Изменить немного вновь скопированный файл, чтобы Twig_CacheInterface экземпляр передается в конфигурационном файле (application/config/twig.php) вместо того, чтобы просто простая строка (указывающая директорию кэша Twig). Посмотрите на мой пример:

    <?php defined('SYSPATH') or die('No direct script access.'); 
    
    class Twig extends Kohana_Twig 
    { 
        /** 
        * Initialize the Twig module 
        * 
        * @throws Kohana_Exception 
        * @return bool 
        */ 
        public static function init() 
        { 
         $path = Kohana::$config->load('twig.environment.cache'); 
         if (is_string($path)) { 
          return parent::init(); 
         } else if ($path instanceof Twig_CacheInterface) { 
          return true; 
         } 
    
         throw new Kohana_Exception('Twig cache could not be initialized'); 
        } 
    
    } 
    
  4. В файле конфигурации для kohana-twig модуля, т.е. application/config/twig.php (если еще не копируется из модуля приложения, сделайте это сейчас), определить environment.cache ключ, как это:

    return array(
    
        'loader' => array(
         'extension' => 'twig', 
         'path' => 'views', 
        ), 
        'environment' => array(
         'auto_reload' => (Kohana::$environment >= Kohana::TESTING), 
         'autoescape' => true, 
         'base_template_class' => 'Twig_Template', 
         // Following line is related to this issue and fix: 
         'cache' => new \Application\Twig\Cache_Filesystem(APPPATH . 'cache/twig'), 
         'charset' => 'utf-8', 
         'optimizations' => - 1, 
         'strict_variables' => false, 
        ), 
        'functions' => array(), 
        'filters' => array(), 
        'tests' => array(), 
    } 
    

Это работает для меня. Надеюсь, это поможет кому-то бороться с подобной проблемой.