Задать вопрос
@likeapimp
web dev, web design

Что переместить в модель Kohana?

Здравствуйте! Взялся активно изучать PHP и Kohana. Решим написать небольшую CMS для интернет-магазина.

Заработался и оказалось что все модели и меня почему-то пустые.. Максимум что они содержат, это:
<?php defined('SYSPATH') or die('No direct script access.');

class Model_Product extends ORM {	
	
}


Все-все у меня почему-то находиться в контроллере.. наверное при роботе проигнорировал логику MVC:
<?php defined('SYSPATH') or die('No direct script access.');
 
class Controller_Products extends Controller_Common {
 
    public function action_index() {
		
        $content = View::factory('prodAll')
			->bind('products', $products);
		
		// получаем данные из таблицы "products"
		$products = ORM::factory('product')->find_all();
		
		$this->template->title = 'Все товары'; 
		$this->template->description = 'Список всех товаров'; 
		$this->template->content = $content;
		
		// пагинация
		$count = ORM::factory('product')->count_all();
		$content->pagination = Pagination::factory(array('total_items' => $count));
		$products = ORM::factory('product')
			->limit($content->pagination->items_per_page)
			->offset($content->pagination->offset)
			->find_all();
    }
	
	public function action_cart() {
	
		$content = View::factory('cartView');
		$this->template->title = 'Корзина покупок'; 
		$this->template->description = 'Список ваших товаров'; 
		$this->template->content = $content;
		$content->inCart = FALSE;
		$content->inCart = $this->session->get('product2');
	}
 
    public function action_product() {	
	
		//узнаем id материала
		$id = (int) Request::initial()->param('id');
		
		// получаем данные из таблицы "products"
		$product = ORM::factory('product', $id);
 
        $content = View::factory('prodView')
                        ->bind('product', $product);
		
		$this->template->title = $product->title;
		
        $this->template->content = $content;
		
		$content->inCart = FALSE;
		
		if(isset($_POST['Submit'])) {
			$clientName    = Arr::get($_POST, 'Name', '');
			$clientPhone = Arr::get($_POST, 'Phone', '');
			$clientAdress = Arr::get($_POST, 'Adress', '');
			$orderNumber = Arr::get($_POST, 'Number', '');
			
			$_POST = array(
				'name' => $product->name, 
				'number' => $orderNumber, 
				'url' => $product->url, 
				'client_name' => $clientName, 
				'client_phone' => $clientPhone,
				'client_adress' => $clientAdress
			);
				
				ORM::factory('order')
				   ->values($_POST)
				   ->save();
				   
			Controller::redirect('main/ordered');
		}
		
		if(isset($_POST['InCart'])) {
			$this->session->set('product2', $product->name);
		}
    }    
} // Products


Вроде бы как (насколько я понимаю) половина этого контроллера, должны быть в моделе (подключение к БД, например).

Прошу помощи: как правильно распределить код между контроллером и моделью? Спасибо.
  • Вопрос задан
  • 2996 просмотров
Подписаться 2 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 1
Учитывая, что в приведенном выше коде не используется query builder ни от Database ни от ORM (что одно и то же с точки зрения query builder, практически), то в модель ORM, которая наследуется от ORM - перемещать нечего.

Проблема глубже - она в вашем понимании.
Модель в бизнес логике это не только ORM и прочие способы доступа к БД и харнилищам, это полное описание бизнес логики.
По сути classes в Кохане можно использовать для хранения иерархии просто классов, а папку Model для простых и ORM моделей.
Вам надо логику перемещать в простые классы, которые следует создавать по соображениям сущности, которую реализует класс. Тогда будет иерархия классов, взаимодействие объектов, а в контроллере просто их вызов.

Еще раз, главный посыл - модель это не только доступ в БД. :)

В модели БД можно выносить кастомные sql запросы или какую-то пред или пост обработку данных.

Почитайте про ООП и Паттерны.

UPD.

Отрефакторил код. Написал бы как-то так. У вас запутно все. У меня проще.
<?php

defined('SYSPATH') or die('No direct script access.');

class Controller_Products extends Controller_Base
{

    public function action_index()
    {
        // пагинация
        $count      = ORM::factory('product')->count_all();
        $pagination = Pagination::factory(array('total_items' => $count));
        $products   = ORM::factory('product')
                ->limit($pagination->items_per_page)
                ->offset($pagination->offset)
                ->find_all();

        $content = View::factory('prodAll')
                ->set('products', $products);

        //используется в шаблоне?
        $content->pagination = $pagination;

        $this->template->title       = 'Все товары';
        $this->template->description = 'Список всех товаров';
        $this->template->content     = $content;
    }

    public function action_cart()
    {

        $content = View::factory('cartView');

        $content->inCart = FALSE;
        $content->inCart = $this->session->get('product2');

        $this->template->title       = 'Корзина покупок';
        $this->template->description = 'Список ваших товаров';
        $this->template->content     = $content;
    }

    public function action_product()
    {
        //узнаем id материала
        $id   = $this->request->param('id');
        $post = $this->request->post();

        // получаем данные из таблицы "products"
        $product = ORM::factory('product', $id);
        $content = View::factory('prodView')
                ->set('product', $product);

        $this->template->title   = $product->title;
        $this->template->content = $content;
        $content->inCart         = FALSE;

        if (isset($post['Submit'])) {
            $this->processOrder($post, $product);

            Controller::redirect('main/ordered');
        }

        if (isset($post['InCart'])) {
            $this->session->set('product2', $product->name);
        }
    }

    /**
     * 
     * @param array $post
     * @param Model_Product $product
     */
    protected function processOrder($post, $product)
    {
        $clientName   = Arr::get($post, 'Name', '');
        $clientPhone  = Arr::get($post, 'Phone', '');
        $clientAdress = Arr::get($post, 'Adress', '');
        $orderNumber  = Arr::get($post, 'Number', '');

        $post = array(
            'name'          => $product->name,
            'number'        => $orderNumber,
            'url'           => $product->url,
            'client_name'   => $clientName,
            'client_phone'  => $clientPhone,
            'client_adress' => $clientAdress
        );

        ORM::factory('order')
                ->values($post)
                ->save();
    }

}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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