[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Своеобразный подход к MVC[Добавление статей]
alex4715
Добрый день.
Я совсем недавно стал усердно заниматся php ООП. Нашёл какие-то примеры реализующие добавление, удаление, редактирование, просмотр статей написаный с исмользованием MVC.
Попытался повторить, но увы получилось, что-то совсем другое и не пойму лучше я сделал или совсем отдалился от задуманого.
Прошу вас посмотреть код и выразить ваше мнение. В правильном ли направлении я плыву...
index.php
<?php
date_default_timezone_set('Europe/Moscow');
define('APPPATH', realpath('application').DIRECTORY_SEPARATOR);
define('THEME', '/application/views/template'.DIRECTORY_SEPARATOR);
include_once '/application/classes/controller/articles.php';
include_once '/application/classes/controller/accaunt.php';
setlocale(LC_ALL, 'ru_RU.utf-8');
$type = isset($_GET['type'])?$_GET['type']:'';
$controller = new Articles();
switch ($type){
case 'add': $type = 'add'; break;
case 'edit': $type = 'edit'; break;
case 'del': $type = 'del'; break;
case 'article': $type = 'article'; break;
default: $type = 'index';
}
$controller->request($type);

Контроллеры:

controller.php
<?php
defined('APPPATH') or die('No direct script access.');
#####################################
#Главный контроллер #
#####################################



abstract class Controller{
public function request($type){
$this->Oninput($type);
$this->Onoutput();
}
protected function view($fileName, $vars = array()){
// Установка переменных для шаблона.
foreach ($vars as $k => $v)
{
$$k = $v;
}

// Генерация HTML в строку.
ob_start();
include $fileName;
return ob_get_clean();
}
}


base.php
<?php
defined('APPPATH') or die('No direct script access.');
include_once '/application/classes/controller/controller.php';

abstract class Base extends Controller{
private $title;
protected $content;

protected function Oninput(){
$this->title = 'Живи с нами!';
$this->content = '';
}
protected function Onoutput(){
$vars = array('content' => $this->content,'title' => $this->title);
$p = $this->view(THEME.'base.php', $vars);
echo $p;
}
}



articles.php
<?php
defined('APPPATH') or die('No direct script access.');
include_once APPPATH.'/classes/controller/base.php';
include_once APPPATH.'/classes/model/articles/articles.php';

class Articles extends Base{

protected function Oninput($type){
parent::Oninput();
$func = '$this->action_'.$type.'();';
eval($func);
}
protected function Onoutput(){

}

public function action_index(){
$articles = new Model_Articles();
$vars = array('articles' => $articles->getArticlesAll());
$this->content = $this->view(THEME.'articles/articles.php', $vars);
parent::Onoutput();
}
public function action_add(){
if($_SERVER['REQUEST_METHOD'] != 'POST'){
$this->content = $this->view(THEME.'articles/add.php');
parent::Onoutput();
}else{
$title = $_POST['title'];
$article = $_POST['article'];
$articles = new Model_Articles();
$articles->newArticle($title, $article);
header("location: http://soc.net");
}
}

public function action_article(){
$id = isset($_GET['id'])?$_GET['id']:'';
$articles = new Model_Articles();
$vars = array('article' => $articles->getArticle(abs((int)$id)));
$this->content = $this->view(THEME.'articles/article.php', $vars);
parent::Onoutput();
}
public function action_edit(){
$articles = new Model_Articles();
if($_SERVER['REQUEST_METHOD'] != 'POST'){
$id = isset($_GET['id'])?$_GET['id']:'';
$vars = array('article' => $articles->getArticle(abs((int)$id)));
$this->content = $this->view(THEME.'articles/edit.php',$vars);
parent::Onoutput();
}else{
$id = abs((int)$_POST['id']);
$title = $_POST['title'];
$article = $_POST['article'];
$articles->editArticle($id, $title, $article);
header("location: http://soc.net");
}
}

public function action_del(){
$id = isset($_GET['id'])?$_GET['id']:'';
$articles = new Model_Articles();
$articles->deleteArticle(abs((int)$id));
header("location: http://soc.net");
parent::Onoutput();
}
}


Модель:

articles.php
<?php
defined('APPPATH') or die('No direct script access.');
#####################################
#Модель articles #
#####################################

include_once APPPATH.'classes/lib/seccurity.php';
include_once APPPATH.'config/config.php';
//Извлечение статей из бд

//$db = connect();

class Model_Articles extends DB{
function getArticlesAll(){
$res = $this->db->query("SELECT * FROM articles ORDER BY article_id DESC") or die(mysqli_error());
//Извлекаем статьи из бд
while($row = $res->fetch_assoc()){
$row['intro'] = $this->intro_article($row);
$articles[] = $row;
}
return $articles;
}
//Извлечение статьи по индификатору
function getArticle($article_id){
//Преобразуем в число
$article_id = abs((int)$article_id);
$res = $this->db->query("SELECT * FROM articles WHERE article_id = ".$article_id."") or die(mysqli_error());
$article = $res->fetch_assoc();
return $article;
}
//Добавление статьи.
function newArticle($title, $article){
$sec = new Seccurity();
if($title == '' or $article == '')
return false;
$user_id = abs((int)1); //Надо будет дописать таблицу для юзера
$title = $sec->escape($title);
$article = $sec->escape($article);
$dt = date('Y-m-d H:m:s', time());
$sql = sprintf("INSERT INTO articles (
article_id,
user_id,
title,
article,
dataCreated,
dataEdit)
VALUES (
NULL,
%u,
'%s',
'%s',
'%s',
'%s')"
,
$user_id,
$title,
$article,
$dt,
$dt);
//die($sql);
$res = $this->db->query($sql) or die(mysqli_error($res));
//return $res;
}

//Редактирование
function editArticle($article_id, $title, $article){
$sec = new Seccurity();
if($title == '' or $article == '')
return false;
$article_id = abs((int)$article_id);
$user_id = abs((int)1); //Надо будет дописать таблицу для юзера
$title = $sec->escape($title);
$article = $sec->escape($article);
$dt = date('Y-m-d H:m:s', time());
$sql = sprintf("UPDATE articles SET
user_id = %u,
title = '%s',
article = '%s',
dataEdit = '%s'
WHERE article_id = '%u'"
,
$user_id,
$title,
$article,
$dt,
$article_id);
$res = $this->db->query($sql) or die(mysqli_error());
return $res;
}

//Удаление
function deleteArticle($article_id){
$article_id = abs((int)$article_id);
$res = $this->db->query("DELETE FROM articles WHERE article_id = ".$article_id."");
return $res;
}

//Обрезаем
function intro_article($article){
$chars = 600;
$end = '...';
$article = $article['article'];
if((strlen($article) <= $chars) or (strpos($article, ' ', $chars)===false))
return $article;
else {
$article = substr($article, 0,strpos($article, ' ', $chars));
}
return $article.$end;
}
}



seccurity.php
<?php
defined('APPPATH') or die('No direct script access.');
include_once APPPATH.'config/config.php';

class Seccurity extends DB {
function escape($value){
$value = !empty($value)?$value:die("Введите что нибудь");
if (get_magic_quotes_gpc())
$value = stripslashes($value);
if (!is_numeric($value))
$value = $this->db->escape_string($value);
return $value;
}
}



Конфиг:

config.php
<?php
#####################################
#Подключение к бд #
#####################################

class DB{

const HOST = "127.0.0.1";
const LOGIN = "soc_net";
const PASS = "123456";
const DB_NAME = "soc_net";
public $db;
function __construct(){
$this->db = new mysqli(self::HOST, self::LOGIN, self::PASS, self::DB_NAME);
$this->db->query('SET NAMES utf8');
}
}





Спустя 3 часа, 20 минут, 19 секунд (16.07.2011 - 00:22) bodja написал(а):
blink.gif
Ну хоть вспомнил ,за что я не люблю MVC ,ООП и Мускул в придачу. smile.gif

Спустя 1 час, 56 минут, 59 секунд (16.07.2011 - 02:19) Guest написал(а):
первое мнение : используй спойлеры. пролистал.

Спустя 1 час, 21 минута, 13 секунд (16.07.2011 - 03:40) Haotarez написал(а):
Если это первый опыт, то шикарно. Хотя много над чем есть работать, уж очень подробно не вчитывался, но заметил что есть идентично повторяющийся функционал внутри одного класса - помните что в первую очередь использование моделей MVC ориентировано на конвейерную обработку, то есть чем лаконичнее приложение тем проще его расширять, апдейтить и т.д. Дробите его на миллионы методов, документируйте их и старайтесь использовать каждый по нескольку раз в разных частях кода. Например для БД у вас класс, от которого вы вездесуще наследуете другие, те, что работают с БД - это плохо. Напишите какой-нибудь Database Handler и включите его в index.php. Вообще странно видеть в MVC класс для работы с БД самописный, если так не хочется настраивать и ковыряться с фреймворками может попробовать PDO? Ещё странно что совсем нет "мутаторов" getтеров/setтеров хотя для данного приложения они может и не нужны... В общем направление выбрано верно, главное работать и совершенствоваться.

Спустя 1 час, 10 минут, 5 секунд (16.07.2011 - 04:50) alex4715 написал(а):
Цитата
первое мнение : используй спойлеры. пролистал.

Вы наверное заметили, что редактирование поста было, а было оно потому, что спойлеры мне выдовали всё тоже самое, только цвет текста делали белый, я не знаю почему, мб из-за браузера по этому я удалил их.

Haotarez
Да это первый опыт, обычно мои скрипты были написаны на процедурном подходи, да и были малы.
Да я тоже заметил много моментов, когда я лишний раз пишу одну функцию, но это для того, что бы узреть работающий скрипт и в будущем с опытом его оптимизировать. А насчёт БД это вообще запутаная история, я его и через синглтон и просто функцией, а потом сделал так как вы видите...

Насчёт фреймворков, я очень активно использую кохану, в скором будущем пойду тестить юви, а этот скрипт я писал как опыт, чтобы было проще разбиратся и если надо писать самому, мне так проще изучать ООП.

Хотел бы я узнать правильно ли я делаю когда использую eval, а то многие говорят это опасно, но у меня же в еval придёт 100% определёное значение другое кейсы не пропустят.

Спасибо вам, жду ещё комментариев.

Спустя 51 минута, 42 секунды (16.07.2011 - 05:42) Haotarez написал(а):
Цитата
равильно ли я делаю когда использую eval

На счет правильности судить не могу, у каждого свои методы. А вот с т.з. безопасности - это не опасно в вашем коде. Главное extract($_GET) нигде не пользовать : )

Спустя 10 часов, 52 минуты (16.07.2011 - 16:34) alex4715 написал(а):
extract($_GET) ну я не совсем извращениц smile.gif)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.