Русскоязычный форум, посвященный фреймворку Kohana

Все о фреймворке Kohana. Обсуждение уроков, документации.
Текущее время: 20 апр 2024, 01:58

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: 25 июл 2013, 03:18 
Не в сети
Бывалый

Зарегистрирован: 14 июн 2013, 17:19
Сообщения: 82
Нужен совет, что лучше использовать для того, что на "языке Джумлы" называется модулем. Или блоком просто... Делать отдельный контроллер или использовать, например статический метод? Просто контроллеры загружают роуты и в них сложно передавать параметры(опять нужно мучать роуты). Я больше склоняюсь переписать код и заменить их статическими методами. Есть ли тут подводные камни?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 июл 2013, 15:23 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 02 апр 2013, 16:26
Сообщения: 474
Откуда: Сергиев Посад
ну так в конечном итоге тебе все равно нужен будет контроллер где будет вызываться статичный класс, вообще статики по возможности лучше избегать т.к. она постоянно висит в памяти и жрет лишние ресурсы.

для упрощения составления запросов можно методы обертки сделать, аля:
Код:
/**
 * Wrapper for request to widget controller
 *
 * @param   string  $uri           Request uri(widget name)
 * @param   array   $data          Send data
 * @param   string  $method        Request method
 * @param   boolean $auto_render   Execute request and return body?
 * @return  mixed(string|Request)
 * @uses    Request::factory
 * @uses    HTML::chars
 * @throws  Request_Exception
 */
public static function widget($uri, array $data = NULL, $method = Request::GET, $auto_render = TRUE)
{
   // Create request
   if ( ! $widget = Request::factory('widget'.DIRECTORY_SEPARATOR.$uri))
   {
      throw new Request_Exception('Request to widget :uri failed', array(':uri' => $uri));
   }
   // Set data
   switch ($method)
   {
      case Request::GET:
         $widget->query($data);
         break;
      case Request::POST:
         $widget->post($data);
         break;
      default:
         throw new Request_Exception('Unknown method :method of widget :uri', array(':method' => $method, ':uri' => $uri));
   }
   // Set data sending method
   $widget->method($method);
   // Return result as string or Request object
   return ($auto_render ? $widget->execute()->body() : $widget);
}

_________________
Майкл Джордан играет в баскетбол. Чарльз Мэнсон убивает людей. Я пишу код. У каждого свой талант.


Последний раз редактировалось WinterSilence 16 авг 2013, 17:13, всего редактировалось 3 раз(а).

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 26 июл 2013, 09:09 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 03 июн 2013, 00:18
Сообщения: 32
Контроллеры юзать не стоит, это против принципов MVC (тонкий контроллер, толстая модель) - их сложно тестить, сложно переносить на другой фреймворк, если в последствии возникнет такая необходимость, вы справедливо написали.
Делайте отдельными классами.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 26 июл 2013, 10:25 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 02 апр 2013, 16:26
Сообщения: 474
Откуда: Сергиев Посад
slider23 если убрать контроллеры, то это будет в духе mvc?

_________________
Майкл Джордан играет в баскетбол. Чарльз Мэнсон убивает людей. Я пишу код. У каждого свой талант.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 26 июл 2013, 17:35 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 03 июн 2013, 00:18
Сообщения: 32
Ну, у Laravel в туториалах такое практикуют - там код, который обычно находится в контроллерах, содержится в замыканиях роутов. :)

Контроллеры, конечно, нужны, но они, как завещали нам 37signals, в идеале должны принимать данные от веб-сервера, вызывать модели с логикой и передавать данные во вьюхи. Чем больше разного другого делает контроллер - тем больше вероятность проблем в будущем. А если планируется охватывать сайт тестами - вероятность перерастает в уверенность.

Ссылка по теме: http://habrahabr.ru/post/175465/


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 26 июл 2013, 18:07 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 02 апр 2013, 16:26
Сообщения: 474
Откуда: Сергиев Посад
речь тут совсем о другом: в джумле модуль это не набор моделей как в кохане(речь о модулях из "коробки"), а скорее аналог триады в кохане. И тот и иной вариант имеют место на существование при разный в рамках проектов на базе коханы.
не совсем понял кто такие эти 37signals и какое они отношение имеют к мvс? не покажешь ли свои тесты для какого-либо сайта? очень интересно посмотреть это охватывание

_________________
Майкл Джордан играет в баскетбол. Чарльз Мэнсон убивает людей. Я пишу код. У каждого свой талант.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 27 июл 2013, 01:10 
Не в сети
Бывалый

Зарегистрирован: 14 июн 2013, 17:19
Сообщения: 82
Решил так... Сделал абстрактный класс, добавил его в свой "Common" и вызываю классы(создаю объекты) через new и имя наследника этого абстрактного класса. Подгружаю сами классы в самом текущем контроллере(после класса контроллера).

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 30 июл 2013, 16:39 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 11 апр 2013, 14:09
Сообщения: 162
Я использую контроллеры только для приема переменных из request и $_POST и последующей подготовки переменных в ВИД. Саму же подготовку этих переменных осуществляю через Model_Uses (я его так обозвал). Допустим, из формы я получил значение $_POST['a'] = 1; и $_POST['b'] = 2, в ВИД мне нужно передать переменную, которая будет результатом сложения этих двух переменных, тогда мой код будет выглядеть так:
Код:
class Controller_Summ extends Controller_Template {

public function before(){
parent::before;
}

public function action_index(){
$summ = new Model_Uses();
if($summ->get_summ($_POST['a'], $_POST['b'])):

$data['summ'] = $summ->result;
$data['sum_ok'] = '';
else:
$data['summ'] = '';
$data['summ_error'] = '';
endif;

$this->template->summ = View::factory('summ', $data);
}
}

в Model_Uses
есть такой метод:
Код:
class Model_Uses {
   public function get_summ($a, $b){

      $this->result = $a + $b;
      
      return TRUE;
   }


Ну как-то так. Мб. я не прав?

upd: для особо придирчивых, замечу я намерено убрал все проверки БИНДЫ и прочие атрибуты "хорошего кода" для наглядности.

_________________
Они плакали и кололись, но продолжали есть кактус!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 авг 2013, 20:59 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 03 июн 2013, 00:18
Сообщения: 32
WinterSilence, 37signals - это авторы концепции толстых моделей и фреймворка Ruby on Rails, который стал стандартом, который так или иначе пытаются повторить в php-фреймворках.
По тестам - тут соображения простые. Проще тестировать методы класса, передавая в них данные в виде аргументов, чем методы контроллера, передавая в них данные через POST, GET и т.п. запросы при помощи общения с веб-сервером.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 07 авг 2013, 01:18 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
WinterSilence по сути прав. Нужен отдельный класс для создания, удаления, отображения и пр. для таких блоков и контролёр, где ты сможешь использовать (возможно даже статически) методы этого класса. То, что тебе нужно очень напоминает класс виджетов.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Все о фреймворке Kohana  | 
Powered by phpBB® Forum Software © phpBB Group