Очередной тупой вопрос ООП PHP MVC - помогите.

Bbldlo_Coder

Новичок
И так, я долго кодил "лапшой", потом перешел на функциональное программирование... сейчас пытаюсь понять преимущества ООП подхода при построении WEB-приложений в стиле MVC.

Собственно хотелось понять в том ли направлении я вообще иду и правильно ли понимаю идею ООП и MVC шаблонов проектирования.

И так в "стиле MVC" , для меня означает следующее:
Что есть минимум три "скрипта", №2 получает данные из БД, №3 получив данные, строит страницу (этакий билдер тегов строит страницу заполня их переданными ему данными), а №1 рулит процессом.

Третий исполняет следующее: раcпарсил URL, вызвал скрипт тянущий из БД: "Эй Гарсон мне там вот 10 тем форума, начиная с 55-ой". Далее все что "принес гарсон" направил к (билдеру тегов) с указанием, типа нужной страницы.

Ну как тут прилепить AJAX, я не понимаю,.. ну это не важно на данном этапе. В силу слабого понимая механизма защиты от кроссплатформенных атак, я вообще AJAX пока видал в гробу.

Не понятен механизм, как №1 должен указывать тип страницы для №3 Как? Как Они это должны знать? Какой механизм передачи эти данных? Это так сказать первое, что как мне кажется не понимаю - должно быть есть "магия", которой я не знаю.

Ну понятное дело, что если на примере разобрать будет понятнее. Ставим следующую задачу написать class TaskManager. Суть класса в том, что бы распределять задания по типу и времени исполнения, по исполнителям в зависимости от их очереди и возможностей. Например такой класс может понадобиться при распределение писем в тех поддержку из общей очереди по операторам. Или распределения чего либо, между чем либо в зависимости от параметров этого чего-то и его насыщенностью на текущий момент.

PHP:
class TaskManager
  {
      // Массив  исполнителей / и их навыков
      private static $_arr_users_skil;

    // функция установки значений массива выше или добавления, если массив не пустой
    public static function set_arr_u($arr_u)
      {

      }
      
    // функция выбора исполнителя, в зависимости от его навыков и длинны текущей очереди
    public static function switcher($arr_task, $arr_users)
      {

      }
  }
Используется это так:

1) Установил массив значений $arr_skill[user_id][id_skill]=0/1; (умения пользователей)
Понятное дело, что эти данные редко меняются, установил и забыл. Не установил, тоже не беда))

2) Вызвал где-то у себя (в контроллере) метод switch засунул туда два массива (типа первого) только там другие данные: (id_user/query_lenght) и (id_task/id_skill).
Метод получил эти два массива: 1) ID пользователя + длинна очереди, в каких-то еденицах и 2) ID задания + ID типа задания.
А метод вернул массив ID_TASK/ID_USER, выбрав юзера у котрого меньше всего навыков и самая короткая очередь, ну и разумеется этот юзер вообще имеет ID такого навыка. Если вообще установлен массив с навыками юзеров.

Можно сделать например и методы не статичные, чтобы использовать например этот класс для распределения и почты и распределения заказов в одном приложении. Хотя манагер и оператор тех, поддержки точно пользователи с разным ID, так что можно и так оставить.

Сдается мне, что я свои функции группирую в классы, а суть то не меняется. Так что надеюсь добрые люди мне сейчас помогут понять всю "мощь ООП" и как с этой мощью реализовать простейшую систему в духе MVC.

Реализация самих методов мне не нужна, нужна общая концепция реализации веб-приложений на PHP.

П.С.
Понятно все объяснил, как мне кажется.
Хватит тролить))
 
Последнее редактирование:

Bbldlo_Coder

Новичок
Картинки это хорошо... меня не отпускает мысль, что я чего-то не понимаю, но оно где-то рядом, так что давайте посерьезней))

Как реализовывать правильно архитектуру приложения? Как передавать данные между контроллером, вьювером? В каком виде/формате?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
билдер тегов? не, такого никто не делает, только в автогенераторах, почитай про шаблоны
скрипт, который рулит процессом - такого тоже нет
"раcпарсил URL" - это делает четвертый скрипт, называется роутер
бери фреймвори и учи лучше, изобретатель-самоучка
 

Bbldlo_Coder

Новичок
а почему бы не подглядеть куда нибудь? есть статейка плавный переход из лапши
http://symfony.com/doc/current/book/from_flat_php_to_symfony2.html может поможет
Прочитал, все что идет до использования Symfony понятно, так и делал вообщем. После вот этого кода:


PHP:
// index.php
require_once 'vendor/autoload.php';

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
// не понятно откуда я должен знать про существование класса Request и метода createFromGlobals(); 
//и что он вернет ? Может есть механизм - метод, которым можно узнать о всех возможностях класса или созданного объекта?

$request = Request::createFromGlobals();

$uri = $request->getPathInfo();
// видимо он вернул объект, у которого есть метод getPathInfo(). Ну от куда мне знать что есть этот метод?
if ('/' == $uri) {
// откуда (строчка ниже) взялось list_action() мне вообще не понятно.
    $response = list_action();
// что здесь есть query? почему именно query,а не qr? (строка ниже) тоже не ясно (хотя суть понятна, проверяют наличие параметра id в строке запроса)
} elseif ('/show' == $uri && $request->query->has('id')) {
    $response = show_action($request->query->get('id'));
} else {
    $html = '<html><body><h1>Page Not Found</h1></body></html>';
// тут почему то решили создать объект, причем передали в него переменную и "Response::HTTP_NOT_FOUND" - константу из класса Response?
// все это крайне не понятно, почему так а не как-то иначе
    $response = new Response($html, Response::HTTP_NOT_FOUND);
}

// echo the headers and send the response
// Почему любой из этих объектов, каким-то магическим методом send обработается.  
$response->send();
Идет описание как реализовать то же самое на Symfony. В силу того что кое-что в коде не понятно, а так же привязка к Symfony все же требует изучения этого Symfony. Мне вообще кажется этот путь какой-то не совсем правильный, использовать что-то, что как-то работает, а как не совсем понятно.

Как я понял код, я написал прямо в коде вместе с вопросами, которые меня беспокоят. Так что любые разъяснения данного кода и вообще, будут очень кстати.
 

peon

Lok'tar ogar
Ну как тут прилепить AJAX, я не понимаю,.. ну это не важно на данном этапе. В силу слабого понимая механизма защиты от кроссплатформенных атак, я вообще AJAX пока видал в гробу.
1)
ты ошибся, Сross Site Request Forgery

ajax получает то, что ты можешь получить зайдя через браузер на эту страницу
часто в виде записи в формате json (погода в лондоне http://api.openweathermap.org/data/2.5/weather?q=London,uk) или в том же html если данные объемные, их быстрее вставить в страницу сформированными в html, чем обрабатывать тот же json, xml, сsv

ajax это компонент javascript сценария, обычно через контроллер указывается, что в запрашиваемую страницу нужно подключить тот или тот или иной скрипт

если скриптов мало, проще самому прописать к ним пути в шаблоне.

и реализация механизма защиты от CSRF не должна вызывать сложности
хорошо, что ты этим интересуешься

2)
Если хочешь разобраться в остальных вопросах, то прямая дорога сюда http://cidocs.ru/213e/index.html
CodeIgniter очень простой фреймворк на паттерне MVC и дружелюбный к новичкам. Там в документации эта "магия" MVC разъясняется.
Открой верхнее меню и обязательно прочитай разделы: Установка, Введение и Учебник
Но советую, сделать простенький велосипед реализующий MVC самому
 

Bbldlo_Coder

Новичок
билдер тегов? не, такого никто не делает, только в автогенераторах, почитай про шаблоны
скрипт, который рулит процессом - такого тоже нет
"раcпарсил URL" - это делает четвертый скрипт, называется роутер
бери фреймвори и учи лучше, изобретатель-самоучка
Да, самоучка... не зная об ob_sart() "билдер тегов" это самое разумное, что пришло в голову.
"который рулит процессом" - контроллер (я так понимаю)
роутер у меня был, как функция контроллера... вообщем видимо надо разделять.

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

Bbldlo_Coder

Новичок
1)
ты ошибся, Сross Site Request Forgery

ajax получает то, что ты можешь получить зайдя через браузер на эту страницу
часто в виде записи в формате json (погода в лондоне http://api.openweathermap.org/data/2.5/weather?q=London,uk) или в том же html если данные объемные, их быстрее вставить в страницу сформированными в html, чем обрабатывать тот же json, xml, сsv

ajax это компонент javascript сценария, обычно через контроллер указывается, что в запрашиваемую страницу нужно подключить тот или тот или иной скрипт

если скриптов мало, проще самому прописать к ним пути в шаблоне.

и реализация механизма защиты от CSRF не должна вызывать сложности
хорошо, что ты этим интересуешься

2)
Если хочешь разобраться в остальных вопросах, то прямая дорога сюда http://cidocs.ru/213e/index.html
CodeIgniter очень простой фреймворк на паттерне MVC и дружелюбный к новичкам. Там в документации эта "магия" MVC разъясняется.
Открой верхнее меню и обязательно прочитай разделы: Установка, Введение и Учебник
Но советую, сделать простенький велосипед реализующий MVC самому
1) Спасибо. AJAX и атаки тема то сопутствующая, но отдельная все же. Ну такое использование ajax как "погода в Лондоне" понятно что нестрашно. А как быть с более конфиденциальной информацией?
Тот же чат в ВК, я же не могу читать чужие сообщения? А переписка же AJAX-ом вытягивается.

2) Вот как раз велосипед я и хочу сделать)) Потому, что в моем велосипеде будет руль в определенной ширины, а скоростей мне допустим не надо. К слову тот же
Symfony поймет и "/index.php/show" и "show/index.php/" (как я понял из статьи по ссылке выше), а луше бы он и не понимал, с точки зрения сео-оптимизации дубли страниц - плохо. Если он конечно редиректит на правильный вариант - большой молодец этот Symfony. За ссылку спасибо, поизучаем.
 
Последнее редактирование:

peon

Lok'tar ogar
// не понятно откуда я должен знать про существование класса Request и метода createFromGlobals();
//и что он вернет ? Может есть механизм - метод, которым можно узнать о всех возможностях класса или созданного объекта?
http://api.symfony.com/2.0/Symfony/Component/HttpFoundation/Request.html#method_createFromGlobals

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

AmdY

Пью пиво
Команда форума
Ты говоришь об ООП и MVC, а оперируешь массивами. Переведи это на нормальный язык.
PHP:
// есть пользователи, у пользователей есть скилы.
// у пользователей есть задачи.
class Task {}
class Skill {}
class User {
    public function getTasks() {
        // выбираем откуда-то задачи
    }
    public function getSkills() {
        // выбираем откуда-то задачи
    }
    // теперь проверим может ли пользователь взять задачу.
    // он должен обладать нужным скилом и быть свободным
    public function addTask(Task $task) {
        if ($this->getSkills()->contains( $task->getSkill() )) {
           thow new Exception('Пользователь не обладает нужным скилом');
       }
       if ($this->getTasks()->count() > User::MAX_TASKS) {
           thow new Exception('Пользователь не может брать задач больше ' . User::MAX_TASKS);
       }
       $this->getTasks()->add($task);
       return $this;
    }   
}
У тебя всё разбито на сущности, каждая из которой оперерует своей логикой, если нужна логика другого объекта передаёшь этот объект в качестве параметра. Это смысл MVC - независимые компоненты занимающиеся своей работой и взаимодействующие между собой, а не всякое мракобесие типо вид-модель-контроллер-база данных-шаблонизатор.....
 

peon

Lok'tar ogar
1) Спасибо. AJAX и атаки тема то сопутствующая, но отдельная все же. Ну такое использование ajax как "погода в Лондоне" понятно что нестрашно. А как быть с более конфиденциальной информацией?
Тот же чат в ВК, я же не могу читать чужие сообщения? А переписка же AJAX-ом вытягивается.
AJAX отправляет HTTP запрос, так же как ты открываешь страницу ВК и твой браузер отсылает куки для идентификации, также и AJAX шлет заголовок с куками
 

Bbldlo_Coder

Новичок
AJAX отправляет HTTP запрос, так же как ты открываешь страницу ВК и твой браузер отсылает куки для идентификации, также и AJAX шлет заголовок с куками
Мда... что-то тут я не подумал совсем, что кроме ID пользователя и ID "контента" можно послать еще что-то - поэкспериментируем.
 

peon

Lok'tar ogar
2) Вот как раз велосипед я и хочу сделать)) Потому, что в моем велосипеде будет руль в определенной ширины, а скоростей мне допустим не надо. К слову тот же
Для академических целей я имел ввиду. Конечно, на первых порах у твоего велосипеда не будет седла, и часто будет слетать цепь, но ты будешь знать как устроена втулка колеса, что важно.

А так фреймворки не бойся, они будут удобными, безопасными и быстрыми велосипедом.
 

Bbldlo_Coder

Новичок
Ты говоришь об ООП и MVC, а оперируешь массивами. Переведи это на нормальный язык.
PHP:
// есть пользователи, у пользователей есть скилы.
// у пользователей есть задачи.
class Task {}
class Skill {}
class User {
    public function getTasks() {
        // выбираем откуда-то задачи
    }
    public function getSkills() {
        // выбираем откуда-то задачи
    }
    // теперь проверим может ли пользователь взять задачу.
    // он должен обладать нужным скилом и быть свободным
    public function addTask(Task $task) {
        if ($this->getSkills()->contains( $task->getSkill() )) {
           thow new Exception('Пользователь не обладает нужным скилом');
       }
       if ($this->getTasks()->count() > User::MAX_TASKS) {
           thow new Exception('Пользователь не может брать задач больше ' . User::MAX_TASKS);
       }
       $this->getTasks()->add($task);
       return $this;
    }  
}
У тебя всё разбито на сущности, каждая из которой оперерует своей логикой, если нужна логика другого объекта передаёшь этот объект в качестве параметра. Это смысл MVC - независимые компоненты занимающиеся своей работой и взаимодействующие между собой, а не всякое мракобесие типо вид-модель-контроллер-база данных-шаблонизатор.....
Сейчас возможно будет пару дурных вопросов.

1) Сам TaskManager сущностью быть не может?
2) Допустим есть класс User, допустим у нас есть и объект этого класса. Он может иметь метод получения заданий (все какие на него повесили). Как-то можно сделать так, чтобы метод получил задания не обращающаяся непосредственно к базе данных? (мне всегда казалось, что суть MVC в том что бы код отвечающий за логику приложения, был отделен от работы с базой, и кода отображающего саму страницу.
3) По коду сверху. Т.е. где-то в другом месте, я буду пытаться "распихивать" задния по юзерам, вызывая addTask? Правильно понимаю?

Честно говоря заставить мозг думать сущностями пока очень сложно...
 

AnrDaemon

Продвинутый новичок
Для работы с базой данных существует отдельный интерфейс. И объект "юзер" обращается к этому интерфейсу в поисках недостающей информации.
 

Bbldlo_Coder

Новичок
Для работы с базой данных существует отдельный интерфейс. И объект "юзер" обращается к этому интерфейсу в поисках недостающей информации.
Пример, или статья, или глава книги, на тему создания и работы таким интерфейсом есть? Если речь про https://php.net/manual/ru/language.oop5.interfaces.php
То тут сама реализация в коде класса, который "наследует" интерфейс.
 
Сверху