За последние 24 часа нас посетили 33000 программистов и 1756 роботов. Сейчас ищут 804 программиста ...

Моя пародия на MVC[оцените]

Тема в разделе "PHP для новичков", создана пользователем alex4715, 17 июл 2011.

  1. alex4715

    alex4715 Активный пользователь

    С нами с:
    9 май 2009
    Сообщения:
    35
    Симпатии:
    0
    Добрый день. Совсем недавно стал заниматься ооп программированием на пшп ну и тестовые куски кода не заставили себя ждать. Если вам не трудно, я то я выложу код, а вы посмотрите на него скажите своё мнение, мб какие то поправки замечания к подходу и правильно ли я двигаюсь в соответсвии с паттерном MVC.

    index.php
    PHP:
    1. <?php
    2. date_default_timezone_set('Europe/Moscow');
    3. define('APPPATH', realpath('application').DIRECTORY_SEPARATOR);
    4. define('THEME', '/application/views/template'.DIRECTORY_SEPARATOR);
    5. include_once '/application/classes/controller/articles.php';
    6. include_once '/application/classes/controller/accaunt.php';
    7. setlocale(LC_ALL, 'ru_RU.utf-8');
    8. $type = isset($_GET['type'])?$_GET['type']:'';
    9. $controller = new Articles();
    10. switch ($type){
    11.     case 'add': $type = 'add'; break;
    12.     case 'edit': $type = 'edit'; break;
    13.     case 'del': $type = 'del'; break;
    14.     case 'article': $type = 'article'; break;
    15.     default:  $type = 'index';
    16. }
    17. $controller->request($type);
    18.  
    Контроллеры:

    controller.php
    PHP:
    1. <?php
    2. defined('APPPATH') or die('No direct script access.');
    3. #####################################
    4. #Главный контроллер                    #
    5. #####################################
    6.  
    7.  
    8. abstract class Controller{
    9.     public function request($type){
    10.         $this->Oninput($type);
    11.         $this->Onoutput();
    12.     }
    13.     protected function view($fileName, $vars = array()){
    14.         // Установка переменных для шаблона.
    15.         foreach ($vars as $k => $v)
    16.         {
    17.             $$k = $v;
    18.         }
    19.  
    20.         // Генерация HTML в строку.
    21.         ob_start();
    22.         include $fileName;
    23.         return ob_get_clean(); 
    24.     }
    25. }
    base.php
    PHP:
    1. <?php
    2. defined('APPPATH') or die('No direct script access.');
    3. include_once '/application/classes/controller/controller.php';
    4.  
    5. abstract class Base extends Controller{
    6.         private $title;
    7.         protected $content;
    8.        
    9.     protected function Oninput(){
    10.         $this->title = 'Живи с нами!';
    11.         $this->content = '';
    12.     }
    13.     protected function Onoutput(){
    14.         $vars = array('content' => $this->content,'title' => $this->title);
    15.         $p = $this->view(THEME.'base.php', $vars);
    16.         echo $p;
    17.     }
    18. }
    19.  
    articles.php
    PHP:
    1. <?php
    2. defined('APPPATH') or die('No direct script access.');
    3. include_once APPPATH.'/classes/controller/base.php';
    4. include_once APPPATH.'/classes/model/articles/articles.php';
    5.  
    6. class Articles extends Base{
    7.    
    8.     protected function Oninput($type){
    9.         parent::Oninput();
    10.         $func = '$this->action_'.$type.'();';
    11.         eval($func);
    12.     }
    13.     protected function Onoutput(){
    14.  
    15.     }
    16.     public function action_index(){
    17.         $articles = new Model_Articles();
    18.         $vars = array('articles' => $articles->getArticlesAll());
    19.         $this->content = $this->view(THEME.'articles/articles.php', $vars);
    20.         parent::Onoutput();
    21.     }
    22.     public function action_add(){
    23.         if($_SERVER['REQUEST_METHOD'] != 'POST'){
    24.             $this->content = $this->view(THEME.'articles/add.php');
    25.             parent::Onoutput();
    26.         }else{
    27.             $title = $_POST['title'];
    28.             $article = $_POST['article'];
    29.             $articles = new Model_Articles();
    30.             $articles->newArticle($title, $article);
    31.             header("location: [url=http://soc.net]http://soc.net[/url]");
    32.         }
    33.     }
    34.     public function action_article(){
    35.         $id = isset($_GET['id'])?$_GET['id']:'';
    36.         $articles = new Model_Articles();
    37.         $vars = array('article' => $articles->getArticle(abs((int)$id)));
    38.         $this->content = $this->view(THEME.'articles/article.php', $vars);
    39.         parent::Onoutput();
    40.     }
    41.     public function action_edit(){
    42.         $articles = new Model_Articles();
    43.         if($_SERVER['REQUEST_METHOD'] != 'POST'){
    44.             $id = isset($_GET['id'])?$_GET['id']:'';
    45.             $vars = array('article' => $articles->getArticle(abs((int)$id)));
    46.             $this->content = $this->view(THEME.'articles/edit.php',$vars);
    47.             parent::Onoutput();
    48.         }else{
    49.             $id = abs((int)$_POST['id']);
    50.             $title = $_POST['title'];
    51.             $article = $_POST['article'];
    52.             $articles->editArticle($id, $title, $article);
    53.             header("location: [url=http://soc.net]http://soc.net[/url]");
    54.         }
    55.     }      
    56.     public function action_del(){
    57.         $id = isset($_GET['id'])?$_GET['id']:'';
    58.         $articles = new Model_Articles();
    59.         $articles->deleteArticle(abs((int)$id));
    60.         header("location: [url=http://soc.net]http://soc.net[/url]");
    61.         parent::Onoutput();
    62.     }
    63. }
    Модель:

    articles.php
    PHP:
    1. <?php
    2. defined('APPPATH') or die('No direct script access.');
    3. #####################################
    4. #Модель articles                  #
    5. #####################################
    6. include_once APPPATH.'classes/lib/seccurity.php';
    7. include_once APPPATH.'config/config.php';
    8. //Извлечение статей из бд
    9.  
    10. //$db = connect();
    11. class Model_Articles extends DB{
    12. function getArticlesAll(){
    13.     $res = $this->db->query("SELECT * FROM articles ORDER BY article_id DESC") or die(mysqli_error());
    14.     //Извлекаем статьи из бд
    15.     while($row = $res->fetch_assoc()){
    16.         $row['intro'] = $this->intro_article($row);
    17.         $articles[] = $row;
    18.     }
    19.     return $articles;
    20. }
    21. //Извлечение статьи по индификатору
    22. function getArticle($article_id){
    23.     //Преобразуем в число
    24.     $article_id = abs((int)$article_id);
    25.     $res = $this->db->query("SELECT * FROM articles WHERE article_id = ".$article_id."") or die(mysqli_error());
    26.     $article = $res->fetch_assoc();
    27.     return $article;   
    28. }
    29. //Добавление статьи.
    30. function newArticle($title, $article){
    31.     $sec = new Seccurity();
    32.     if($title == '' or $article == '')
    33.         return false;
    34.     $user_id = abs((int)1); //Надо будет дописать таблицу для юзера
    35.     $title = $sec->escape($title);
    36.     $article = $sec->escape($article);
    37.     $dt = date('Y-m-d H:m:s', time());
    38.     $sql = sprintf("INSERT INTO articles (
    39.                             article_id,
    40.                             user_id,
    41.                             title,
    42.                             article,
    43.                             dataCreated,
    44.                             dataEdit)
    45.                         VALUES (
    46.                         NULL,
    47.                         %u,
    48.                         '%s',
    49.                         '%s',
    50.                         '%s',
    51.                         '%s')",
    52.                         $user_id,
    53.                         $title,
    54.                         $article,
    55.                         $dt,
    56.                         $dt);
    57.                         //die($sql);
    58.     $res = $this->db->query($sql) or die(mysqli_error($res));
    59.     //return $res; 
    60. }
    61.  
    62. //Редактирование
    63. function editArticle($article_id, $title, $article){
    64.     $sec = new Seccurity();
    65.     if($title == '' or $article == '')
    66.         return false;
    67.     $article_id = abs((int)$article_id);
    68.     $user_id = abs((int)1); //Надо будет дописать таблицу для юзера
    69.     $title = $sec->escape($title);
    70.     $article = $sec->escape($article);
    71.     $dt = date('Y-m-d H:m:s', time());
    72.     $sql = sprintf("UPDATE articles SET
    73.                             user_id = %u,
    74.                             title = '%s',
    75.                             article = '%s',
    76.                             dataEdit = '%s'
    77.                             WHERE article_id = '%u'",
    78.                         $user_id,
    79.                         $title,
    80.                         $article,
    81.                         $dt,
    82.                         $article_id);
    83.     $res = $this->db->query($sql) or die(mysqli_error());
    84.     return $res;
    85. }
    86.  
    87. //Удаление
    88. function deleteArticle($article_id){
    89.     $article_id = abs((int)$article_id);
    90.     $res = $this->db->query("DELETE FROM articles WHERE article_id = ".$article_id."");
    91.     return $res;
    92. }
    93.  
    94. //Обрезаем
    95. function intro_article($article){
    96.     $chars = 600;
    97.     $end = '...';
    98.     $article = $article['article'];
    99.     if((strlen($article) <= $chars) or (strpos($article, ' ', $chars)===false))
    100.         return $article;
    101.     else {
    102.         $article = substr($article, 0,strpos($article, ' ', $chars));
    103.     }
    104.     return $article.$end;
    105. }
    106. }
    107.  
    seccurity.php
    PHP:
    1. <?php
    2. defined('APPPATH') or die('No direct script access.');
    3. include_once APPPATH.'config/config.php';
    4.  
    5. class Seccurity extends DB {
    6.     function escape($value){
    7.         $value = !empty($value)?$value:die("Введите что нибудь");
    8.         if (get_magic_quotes_gpc())
    9.             $value = stripslashes($value);
    10.         if (!is_numeric($value))
    11.             $value = $this->db->escape_string($value);
    12.         return $value;
    13.     }
    14. }

    Конфиг:

    config.php
    PHP:
    1. <?php
    2. #####################################
    3. #Подключение к бд                     #
    4. #####################################
    5. class DB{
    6.    
    7.     const HOST = "127.0.0.1";
    8.     const LOGIN = "soc_net";
    9.     const PASS = "123456";
    10.     const DB_NAME = "soc_net";
    11.     public $db;
    12.     function __construct(){
    13.         $this->db = new mysqli(self::HOST, self::LOGIN, self::PASS, self::DB_NAME);
    14.         $this->db->query('SET NAMES utf8');
    15.     }
    16. }
    17.  
    Извините, я не нашёл спойлеров тут.
    Заранее благодарю.
     
  2. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    [​IMG]
     
  3. vikrorpert

    vikrorpert Активный пользователь

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    а можно узнать зачем вы занялись ооп программированием на пшп ?
     
  4. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    vikrorpert, вы очередной человек который утверждает что ооп в пхп нет?
     
  5. vikrorpert

    vikrorpert Активный пользователь

    С нами с:
    13 окт 2010
    Сообщения:
    984
    Симпатии:
    10
    я вобще это не писал
    не понимаю зачем городить велосипед если есть нормальный фреймворки заточенные под мвц
     
  6. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    Ъ-ооп
     
  7. alex4715

    alex4715 Активный пользователь

    С нами с:
    9 май 2009
    Сообщения:
    35
    Симпатии:
    0
    Что-то не радушный приём...
    Вы считаете, что я должен первый скрипт должен был написать идеальным? Я бы тогда не пришёл сюда и не попросил прокоментировать и что я тут вижу? недотроллей, мне некоторых из вас жаль.

    vikrorpert

    Для лучшего понимания работы фреймворков. Зачем изобретать велосипед? А как по другому мне в никнуть в детали ООП прогрграммирования? Я и так 2 месяца работаю с фреймворком кохана, без знаний ООП и мне в некоторых моментах трудновато.

    Апельсин

    Понятно откуда у тебя 3000+ сообщений, одни facepalm наверное.

    P.S. При следующих постах прочитайте пожалуйста названия раздела и мой первый пост по внимательней, прежде чем оффтопить это мне не поможет.
     
  8. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    у чувака совсем нет комплексов :-D
     
  9. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    [​IMG]
    3000++;
     
  10. pohapecoder

    pohapecoder Активный пользователь

    С нами с:
    16 окт 2010
    Сообщения:
    63
    Симпатии:
    0
    Это пиз*ц. Зачем так делать если можно так:

    $func = 'action_' . $type;
    $this->{$func}();

    или так:

    call_user_func(array(&$this, $func));

    Идиотский стиль.
    Нужно выбрасывать исключения или хотя бы возвращать ошибки.

    По дурацки.
    Нужно использовать объекты фреймворка вместо таких хардкорных функций.

    Задавать в каждом экшене такую строку - глупо, я считаю.
    Нужно возвращать или устанавливать объект вьювса у которого вызывать потом метод render в этом случае.
    А не выводить в самом контроллере. т.е рендерить себя должен уметь вьювс а не контроллер

    Нормальный рутер реализовать не осилил?
    Ну хотябы скрой реализацию в отдельном классе. Потом уже расширишь его или модифицируешь.

    Подобные настройки нужно выносить в инициализацию приложения (bootstrap)

    Используй автолоадер или опять же в инициализацию приложения все это выносить.
    Чтобы было в одном месте
    Или потом тебе будет мозг выносить подобные строки кода в каждом отдельном файле.

    Вот и хорошо - лучше потрать время на более подробное изучение этого фреймворка.
    Вместо реализации и правки своего велосипеда.
     
  11. alex4715

    alex4715 Активный пользователь

    С нами с:
    9 май 2009
    Сообщения:
    35
    Симпатии:
    0
    pohapecoder
    Спасибо, хоть и резки были комментарии, но лучше тех которые выше.

    Я ещё не всё знаю не всё понимаю, по этому и написал используя свои знания. Да вы правы зачем изобритать свой велосипед когда куча готовых, но мне просто удобно понимать так как работает этот велосипед.
     
  12. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
  13. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    зачем писать сайты если уже есть написанные?

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

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

    ну да, нужно подключить ради одного отправки заголовка, целый фреймворк, это же совершенно необходимо!

    а вам написали что человек учится, не чего так высказывать, нужно написать что вот это лучше реализовать так то, но не писать с подколом, типа "что слабо да? "
    вы наверное родились гением программирования.



    лучше для чего? для того что бы начать писать сайты? или для изучения программирования? может этот человек напишет фреймворк самый лучший в мире, когда научится.
     
  14. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Правильный ООП код состоит из паттернов. В первую очередь надо изучать паттерный программирования. Без знания паттерной нефиг (бесполезно) лезть в фреймворки.
     
  15. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    ну так человек учится, а на него сразу с наездами, что за хрень, что за идиотизм и прочее :) все когда то начинали.
     
  16. pohapecoder

    pohapecoder Активный пользователь

    С нами с:
    16 окт 2010
    Сообщения:
    63
    Симпатии:
    0
    Я тебе открою страшную тайну - фреймворки наоборот предназначены для упрощения разработки и рассчитаны на персонал более низкой квалификации. Так как задают уже готовую архитектуру и стандарты. Остается только разобратся в принципах работы.
     
  17. pohapecoder

    pohapecoder Активный пользователь

    С нами с:
    16 окт 2010
    Сообщения:
    63
    Симпатии:
    0
    Я просто не будут тут тебе вдалбливть почему ты ошибаешся и отвечать на твои глупые вопросы.
     
  18. pohapecoder

    pohapecoder Активный пользователь

    С нами с:
    16 окт 2010
    Сообщения:
    63
    Симпатии:
    0
    Человек хотел критики и отзывов о своем велосипеде.
     
  19. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    pohapecoder, вот вы же сами пишите
    я как раз это и хотел сказать последним предложением :)

    очень жаль, раз написали что это это глупость, то извольте объяснить, а то я так в неведении и проживу :)

    ну может вы и правы, не было бы критики, не кто не старался бы сделать лучше :)
     
  20. alex4715

    alex4715 Активный пользователь

    С нами с:
    9 май 2009
    Сообщения:
    35
    Симпатии:
    0
    Сходил купил кингу "php Объекты, Шаблоны и Методики программирования 2 издание" Автор: Мэтт Зандстра
    Будем читать, Всем спс.
     
  21. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    очень хорошая книга кстати :) как раз советовал в соседней теме.
    и как раз там написано что не стоит сувать шаблоны проектирования везде куда только сможете, а даже наоборот, суйте их только если уверены что он вам тут нужен.
     
  22. alex4715

    alex4715 Активный пользователь

    С нами с:
    9 май 2009
    Сообщения:
    35
    Симпатии:
    0
    Да я зашёл в магаз, а там выбор небольшой и не шарят, какая книга лучше взял ту которая больше понравилась, но приехав домой в нете прочитал, что есть 3 издание, чутка огорчился...

    Ну я думаю я тоже наступлю на эти грабли и кто-то вроде вас мне посоветует этого не делать :)) Опыт решает.
     
  23. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    А что я советовал не делать? я наоборот советую учить программирование а не фреймворки :) а будите знать программирование, сможете и сами написать фреймворк и разобраться как другие работают :)
     
  24. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Спасибо учитель, паттерны существуют для этой же цели. И более того, все нормальные фреймворки (ZF, Yii и т.п.) стремятся жестко придерживаться паттернов. Разобравшись в пятерке самых распространенных паттернов, вы не будете смотреть на новый компонент фреймворка как баран на новые ворота.
     
  25. alex4715

    alex4715 Активный пользователь

    С нами с:
    9 май 2009
    Сообщения:
    35
    Симпатии:
    0
    Easy

    Ну вы кому то сегодня уже советовали, вот и я предположил, что наступлю на такие же грабли и мне кто-то вроде вас посоветует.[/quote]