Открыть список
Как стать автором
Обновить

Комментарии 23

Хорошая реализация. Видел достаточно работ, выполняющих данный функционал, но ваша, определенно, заслуживает особого внимания.
Только одно замечание: коменты зря вы на русском писали
Спасибо за отзыв.
Увы, в английском не настолько силен, можете помочь?
У меня были некоторые заготовки по написанию своего велосипеда, в более ООП стиле, подробнее изучу ваш код, свяжемся. Мне кажется очень полезно было бы анонсировать модуль на оф. форуме коханы
Очень интересно, спасибо. Поковырялся в исходниках немного, вот тут наверное стоит немного по-другому сделать, чтобы обезопаситься от возможных ошибок. Вместо substr() сделайте trim() символа '/', т.е. примерно так:

Route::set(
   'static_files', 
   trim(Kohana::config('staticfiles.url'), '/').'/<file>', 
   array('file'=>'.*')
)->...


Т.е. в конфигах можно будет не париться, поставил слэши в начале/конце параметра или нет.
В данном случае не соглашусь с Вами, так как это тоже можно считать соглашением и оно используется не только для разбора входящего урл, но и для его формирования, а также для формирования путей сохранения развертываемой статики.
Поэтому конфиг надо писать ожидаемый системой, а не в произвольном виде.
Почему бы это значение не считать один раз из конфига, обработать (проверить на соответствие соглашению, допилить если что) и сохранить в свойствах класса? Далее юзать его, а не конфиг.
Соглашусь, спасибо за отзыв.
я бы сделал примерно так:
public function action_index()
{
    Static::instance('css')
        ->css(Kohana::config('staticfiles.url').'news/style.css')
        ->static('news/style.css')
        ->static('css/cssf-base.css');
    
    Static::instance('js')
        ->static('js/common.js');
        
    Static::instance('css')
        ->inline('
            .lb-1 .corners { background: #818181; }
            .lb-2 .corners { background: #9a9a9a; }
            .lb-3 .corners { background: #b4b4b4; }
            .lb-4 .corners { background: #dadada; }
        ');
    
    Static::instance('js')
        ->inline('CornersInit();')
        ->onload('alert(123);');
}
chain-методы — это, конечно, здорово, только интерпретатор едва ли прожует такой класс
<?php
class Static{
    function static(){
        
    }
}
?>

Да и не вижу смысла совмещать в одном классе белое и острое (я про CSS&JS), другое дело — совместить в одном пакете/модуле!
И как то роднее мне, когда имя метода содержит в себе глагол addCss(), а не как в Вашем примере: css()
Для Windows пути на диске тоже будут с прямыми слэшами?
Тоже. В пхп \ и / (и в коде и в конфигах) работают одинаково.
Имхо, статику должен все-таки обрабатывать веб-сервер, наподобие nginx, и без привлечения PHP.
Объединять и сжимать статичные файлы можно и нужно, но явно не в момент обработки запроса от пользователя.
НЛО прилетело и опубликовало эту надпись здесь
>> должен лежать
Не должен. Дело хозяйское как хранить вендорские либы.

>> 4. Отсутствует стандартная кохановская проверка "<?php defined('SYSPATH') or die('No direct script access.');"
Она вообще бессмысленная. Никакой полезной нагрузке в этой строке нет.
1. Давайте начнем с того, что сменим тон, если Вам не нравится оформление кода (которые, как я обратил внимание, увы, мало соблюдает) или что то еще — Ваше право не использовать его.
Но думаю гораздо важнее упаковки то, что находится внутри, я прав? Функциональности лично мне более чем достаточно. если это будет важно и интересно еще кому то, я выделю пару выходных и доделаю и тесты, и документацию — пока я такого не увидел.

2. Ниже в комментариях привели модуль с частично-подобной функциональность, как ни странно наблюдаю там путь до вендора
github.com/gahgneh/minify-kohana/blob/master/minify/classes/jsmin.php

3. Увы, тестов нет, как и банальной документации.

4. Не считаю особо умным решение выкладывать
— modules
— classes
— system
в DOCUMENT_ROOT, чтобы потом защищаться проверками времен phpnuke, даже если это и стандарт коханы. То, что будет вызван напрямую файл вида
<?php
class StaticJs{
  ...
}
не вижу ничего криминального. будет получена просто пустая страница, или Вы не согласны с этим?
Думаю дух закона важнее буквы? вот в init.php это может быть и критично, так как могут вывалиться ошибки, но там эта проверка есть:
github.com/aberdnikov/kohana-static-files/blob/master/init.php

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

Предыдущий комментатор не прав, начиная с синтаксиса, заканчивая тем, что в его случае не работает автокомплит в IDE
<?php
Static::instance('js')
НЛО прилетело и опубликовало эту надпись здесь
А контакты по которым обращаться? :-)
Вы внимательно читали мои «хотелки»?
Не спорю, может быть модуль minify и хорош, не смотрел детально, но уже на первой моей «хотелке» он бы сдался.
А мой модуль устраивает меня на все 100%
Столкнулся с неприятной проблемой, которая не видна с первого, и даже воторго, взглада.
Если нет статического файла по запрашиваемому URL-у, то выполняется контроллер, который ищет нужный файл и копирует его в папку 'cache'. Так вот беда подкралась именно при попытке создать нужные папки перед тем как скопировать туда файл. Функция mkdir не часто, но с завидной периодичностью, выкидывает исключения с ошибкой 'File exists', и даже после проверки на существования этой папки. Нужно учесть то, что браузер тянет несколько статических файлов одновременно и выстреливают случаи (и довольно часто), когда file_exists вернул false, а при выполнении mkdir папка уже была создана.

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.