Добрый день. Совсем недавно стал заниматься ооп программированием на пшп ну и тестовые куски кода не заставили себя ждать. Если вам не трудно, я то я выложу код, а вы посмотрите на него скажите своё мнение, мб какие то поправки замечания к подходу и правильно ли я двигаюсь в соответсвии с паттерном MVC. index.php 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: <?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: <?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: <?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: [url=http://soc.net]http://soc.net[/url]"); } } 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: [url=http://soc.net]http://soc.net[/url]"); } } public function action_del(){ $id = isset($_GET['id'])?$_GET['id']:''; $articles = new Model_Articles(); $articles->deleteArticle(abs((int)$id)); header("location: [url=http://soc.net]http://soc.net[/url]"); parent::Onoutput(); } } Модель: articles.php 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: <?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: <?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'); } } Извините, я не нашёл спойлеров тут. Заранее благодарю.
я вобще это не писал не понимаю зачем городить велосипед если есть нормальный фреймворки заточенные под мвц
Что-то не радушный приём... Вы считаете, что я должен первый скрипт должен был написать идеальным? Я бы тогда не пришёл сюда и не попросил прокоментировать и что я тут вижу? недотроллей, мне некоторых из вас жаль. vikrorpert Для лучшего понимания работы фреймворков. Зачем изобретать велосипед? А как по другому мне в никнуть в детали ООП прогрграммирования? Я и так 2 месяца работаю с фреймворком кохана, без знаний ООП и мне в некоторых моментах трудновато. Апельсин Понятно откуда у тебя 3000+ сообщений, одни facepalm наверное. P.S. При следующих постах прочитайте пожалуйста названия раздела и мой первый пост по внимательней, прежде чем оффтопить это мне не поможет.
Это пиз*ц. Зачем так делать если можно так: $func = 'action_' . $type; $this->{$func}(); или так: call_user_func(array(&$this, $func)); Идиотский стиль. Нужно выбрасывать исключения или хотя бы возвращать ошибки. По дурацки. Нужно использовать объекты фреймворка вместо таких хардкорных функций. Задавать в каждом экшене такую строку - глупо, я считаю. Нужно возвращать или устанавливать объект вьювса у которого вызывать потом метод render в этом случае. А не выводить в самом контроллере. т.е рендерить себя должен уметь вьювс а не контроллер Нормальный рутер реализовать не осилил? Ну хотябы скрой реализацию в отдельном классе. Потом уже расширишь его или модифицируешь. Подобные настройки нужно выносить в инициализацию приложения (bootstrap) Используй автолоадер или опять же в инициализацию приложения все это выносить. Чтобы было в одном месте Или потом тебе будет мозг выносить подобные строки кода в каждом отдельном файле. Вот и хорошо - лучше потрать время на более подробное изучение этого фреймворка. Вместо реализации и правки своего велосипеда.
pohapecoder Спасибо, хоть и резки были комментарии, но лучше тех которые выше. Я ещё не всё знаю не всё понимаю, по этому и написал используя свои знания. Да вы правы зачем изобритать свой велосипед когда куча готовых, но мне просто удобно понимать так как работает этот велосипед.
зачем писать сайты если уже есть написанные? например мой фреймворк который я для себя написал, делает то что мне нужно, и работает быстрей любого другого, потому что в ём нет не чего лишнего чем бы я не пользовался. Я не говорю что я мега спец и крутой фреймворк написал, я о том что мой фреймворк решает только необходимые в общем случае задачи, и не каких дополнительных, кода не много, работает очень быстро. вот такие велосипеды и получаются. ну а если вы не любитель городить велосипеды не пишите сайты вообще, движков полно, пользуйтесь только тем что уже есть. да ладно, а в данном примере ошибку не выведет? а зачем продолжать скрипт если всё равно запрос не выполнился, если он вам не нравится ещё не значит что стиль идиотский. Да, в нормальном фреймворке будет так как вы написали, но зачем писать что это стиль идиотский? просто напишите что это стиль больше для процедурного программирования а не для ооп. ну да, нужно подключить ради одного отправки заголовка, целый фреймворк, это же совершенно необходимо! а вам написали что человек учится, не чего так высказывать, нужно написать что вот это лучше реализовать так то, но не писать с подколом, типа "что слабо да? " вы наверное родились гением программирования. лучше для чего? для того что бы начать писать сайты? или для изучения программирования? может этот человек напишет фреймворк самый лучший в мире, когда научится.
Правильный ООП код состоит из паттернов. В первую очередь надо изучать паттерный программирования. Без знания паттерной нефиг (бесполезно) лезть в фреймворки.
ну так человек учится, а на него сразу с наездами, что за хрень, что за идиотизм и прочее все когда то начинали.
Я тебе открою страшную тайну - фреймворки наоборот предназначены для упрощения разработки и рассчитаны на персонал более низкой квалификации. Так как задают уже готовую архитектуру и стандарты. Остается только разобратся в принципах работы.
pohapecoder, вот вы же сами пишите я как раз это и хотел сказать последним предложением очень жаль, раз написали что это это глупость, то извольте объяснить, а то я так в неведении и проживу ну может вы и правы, не было бы критики, не кто не старался бы сделать лучше
Сходил купил кингу "php Объекты, Шаблоны и Методики программирования 2 издание" Автор: Мэтт Зандстра Будем читать, Всем спс.
очень хорошая книга кстати как раз советовал в соседней теме. и как раз там написано что не стоит сувать шаблоны проектирования везде куда только сможете, а даже наоборот, суйте их только если уверены что он вам тут нужен.
Да я зашёл в магаз, а там выбор небольшой и не шарят, какая книга лучше взял ту которая больше понравилась, но приехав домой в нете прочитал, что есть 3 издание, чутка огорчился... Ну я думаю я тоже наступлю на эти грабли и кто-то вроде вас мне посоветует этого не делать ) Опыт решает.
А что я советовал не делать? я наоборот советую учить программирование а не фреймворки а будите знать программирование, сможете и сами написать фреймворк и разобраться как другие работают
Спасибо учитель, паттерны существуют для этой же цели. И более того, все нормальные фреймворки (ZF, Yii и т.п.) стремятся жестко придерживаться паттернов. Разобравшись в пятерке самых распространенных паттернов, вы не будете смотреть на новый компонент фреймворка как баран на новые ворота.
Easy Ну вы кому то сегодня уже советовали, вот и я предположил, что наступлю на такие же грабли и мне кто-то вроде вас посоветует.[/quote]