Връзки между класовете

teroristd

Registered
Здравейте, интересува ме как е правилно да се изгради един сайт по MVC патерна. Например имам LoginController, LoginModel и LoginView. В модела правя връзка с базата, проверявам дали има такъв имейл и като отговор връщам стринг от типа return 'email exist'. После в контролера проверявам какъв стринг е върнат и според него извеждам някакво подходящо View. Това правилно ли е? Добра практика ли е? Кажете как бихте го направили вие и защо? Друго нещо което, искам да попитам е как работите със сесиите? В отделна таблица ли ги складирате? Каква информация записвате в сесиите на потребителите? Как проверявате дали някой е логнат? Например имам форма за качване на снимки, но може да качват само логнати потребители. Как ще вземете информация за това кой точно потребител се опитва да качи снимка, и къде записвате после дадените снимки? Мисълта ми е трябва ли да има таблица за логин, таблица за снимки, таблица за сесии, каква трябва да е структурата? Май множко станаха въпросите :D дано не съм ви объркал тотално.
 
Според мен:
Например имам LoginController, LoginModel и LoginView.
Папки:
controllers/
-LoginController.php
models/
-Login.php
views/
-login/
-index.php

В модела правя връзка с базата,
Папка:
config/
-connection.php

Модел да връща името на таблицата.

проверявам дали има такъв имейл и като отговор връщам стринг от типа return 'email exist'.

Направи функция в модела . Обърни внимание на реалността,че имаш две условия - съществува / не съществува , така че може да се ориентираш към true & false .

После в контролера проверявам какъв стринг е върнат и според него извеждам някакво подходящо View.

Да , един вид , но практиката ще покаже :D

Каква информация записвате в сесиите на потребителите? Как проверявате дали някой е логнат?

Прочети в интернет за сесиите и бисквитките моля те : ))

Например имам форма за качване на снимки, но може да качват само логнати потребители. Как ще вземете информация за това кой точно потребител се опитва да качи снимка, и къде записвате после дадените снимки? Мисълта ми е трябва ли да има таблица за логин, таблица за снимки, таблица за сесии, каква трябва да е структурата?

Users
id
username
password
email

Images
user_id
name


Images ще е релация много към 1 т.е. един потребител може да качва много снимки

примерен запис в Images
1 wtf.jpg
2 web.png
1 fkao.jpg

Извод потребител с ID 1 има 2 качени снимки , потребител с ID 2 има 1 качена снимка

Това е базово . Трябва да го разшириш доста още
 
Цитат:
проверявам дали има такъв имейл и като отговор връщам стринг от типа return 'email exist'.


Направи функция в модела . Обърни внимание на реалността,че имаш две условия - съществува / не съществува , така че може да се ориентираш към true & false .

Със стринг според мен имам по голям контрол над кода, защото така знам точно какво е върнато, от къде и защо. Това с имейла е само една част от всички проверки които правя. Например каква е позволената мин/макс дължина, какви символи са разрешени, дали някое от полетата е празно и т.н. Ако връщам навсякъде само true/false после в контролера как ще ги разгранича за да си викам определеното View?
 
teroristd каза:
Със стринг според мен имам по голям контрол над кода, защото така знам точно какво е върнато, от къде и защо. Това с имейла е само една част от всички проверки които правя. Например каква е позволената мин/макс дължина, какви символи са разрешени, дали някое от полетата е празно и т.н. Ако връщам навсякъде само true/false после в контролера как ще ги разгранича за да си викам определеното View?
Обърни внимание на начина, по който PDO работи с константите. Това може би е най-добрия вариант. :?:
 
anonimen каза:
teroristd каза:
Със стринг според мен имам по голям контрол над кода, защото така знам точно какво е върнато, от къде и защо. Това с имейла е само една част от всички проверки които правя. Например каква е позволената мин/макс дължина, какви символи са разрешени, дали някое от полетата е празно и т.н. Ако връщам навсякъде само true/false после в контролера как ще ги разгранича за да си викам определеното View?
Обърни внимание на начина, по който PDO работи с константите. Това може би е най-добрия вариант. :?:

Дай някакъв пример че съм руска печка и бавно загрявам :D .
 
teroristd каза:
[Дай някакъв пример че съм руска печка и бавно загрявам :D .

Сигурно вече си стоплил, но:

PHP:
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt->setFetchMode(PDO::FETCH_NUM);

Както виждаш не се налага да работиш със стрингове, а с константи (които всъщност ако ги дъмпнеш, ще видиш, че са числа).
Което е много по-удобно, защото IDE-то ти ще ти дава хинтове и т.н.

Или ако още се чудиш :D

PHP:
class Login {
    const LOGIN_OK = 0, LOGIN_INCORRECT = 1, SESSION_EXPIRED = 2, WHAT_ELSE_YOU_CAN_THINK_OF = 3, AND_SO_ON = 4;
    ...
    return self::LOGIN_INCORRECT;
    ...
    return self::LOGIN_OK;
}

switch ($login->check()) {
    case Login::LOGIN_OK: /* ... */ break;
    case Login::SESSION_EXPIRED: /* ... */ break;
    /* .. */
}
 
Интересна идея, не съм виждал до сега такова нещо, но сигурно не съм достатъчно запознат. Изниква ми един въпрос. Тези константи могат ли да се достъпят извън класа и не се ли нарушава капсулацията?
 
teroristd каза:
... Тези константи могат ли да се достъпят извън класа и не се ли нарушава капсулацията?
Разбира се, че могат, нали са public :Д че ако не можеха за какво щяха да са ти? Нали идеята е да ги ползваш извън класа вместо стрингове :)
 
Никога не връщай текст. Текста да е само, когато хвърляш изключения. Контролера ти е да те прати на правилното място. Подаваш правилните данни към View-то, което викаш и там си правиш гимнастиките какво точно да изведеш.


Идеята е следната. Правиш заявка към модела, модела обработва данните, при грешка хвърляш изключение. В контролера чрез try-catch блока прихващаш тази грешка и от там решаваш какво да правиш. Да спреш изпълнението или да подадеш на конкретното View данни за съобщение, което ще изведеш. Но с контролера не връщаш грешки, особено систематични(например грешна парола при вход и т.н.).


Model
PHP:
class AccountModel 
{
        public function isLocked() {
            if ( $this->locked == 1 ) {
                throw new \Exception('Your account is locked!");
            }
       }
}

Controller
PHP:
class AccountController 
{
     public function loginAction() {
          // взимам данни от пост и т.н.
          $user = AccountModel::findFirst(тука-някакво-условие-за-съвпадения-на-мейл-и-парола);
          if ( $user != false ) { //при грешка връща false
                  try {
                           $user->isLocked();
                  }
                  catch ( \Exception $e ) {
                          $this->view->message($e->getMessage());
                          //викаш View-то
                           return;
                  }
          } 
    }
}

View
HTML:
{{ message }} 
<!-- Според зависи при теб как се викат подадените променливи ->
 
isSomething, като видя такъв метод, си мисля чр връща true/false... Изключенията са хубаво нещо, но мисля че тук са използвани грешно.
 
Revelation каза:
Никога не връщай текст. Текста да е само, когато хвърляш изключения. Контролера ти е да те прати на правилното място. Подаваш правилните данни към View-то, което викаш и там си правиш гимнастиките какво точно да изведеш.

Точно това правя. Просто от модела връщам стринг към контролера, правя проверка, какъв точно стринг е дошъл, и според това викам дадено вю.

Код:
Модел:
if(alabala){
return 'string1';
}
elseif(alabala){
return 'string2';
}

Контролер:
if($result == 'string1'){
display('views/view1');
}
elseif($result == 'string2'){
display('views/view2');
}
 
anonimen каза:
teroristd каза:
... Тези константи могат ли да се достъпят извън класа и не се ли нарушава капсулацията?
Разбира се, че могат, нали са public :Д че ако не можеха за какво щяха да са ти? Нали идеята е да ги ползваш извън класа вместо стрингове :)

Само че стринговете ги достъпвам само защото съм дал return, а тези константи могат да се достъпват отвсякъде, ако съм разбрал правилно. Един вид са нещо като статични свойства.
 
teroristd каза:
anonimen каза:
teroristd каза:
... Тези константи могат ли да се достъпят извън класа и не се ли нарушава капсулацията?
Разбира се, че могат, нали са public :Д че ако не можеха за какво щяха да са ти? Нали идеята е да ги ползваш извън класа вместо стрингове :)

Само че стринговете ги достъпвам само защото съм дал return, а тези константи могат да се достъпват отвсякъде, ако съм разбрал правилно. Един вид са нещо като статични свойства.
Точно така. А ти не искаш да са видими навсякъде ли? Защоо? :idea:
 
За каква капсулация говориш? :idea: Предполагам идеята е всяко нещо да си има собствена област на видимост, а че с константите това се нарушава...
Ами не е точно така, защото константите всъщност са числа.
Ако трябва да избирам между това да връщам стрингове и числа - по-добре числа.
Защото на стринга все ще объркаш някоя буква и после ще се чудиш защо не работи... Докато ако объркаш името на константа веднага ще гръмне. Това е разбира се доста частен пример, но със сигурност има и още предимства. (каквито не виждам в стринговете)
 
Как така константите са числа? До колкото разбирам могат да бъдат и стрингове, просто не можеш да им смениш стойността някъде из кода за разлика от обикновените променливи. А числа мога да връщам и без да са константи. Въпроса е каква е практиката като се изгражда някакъв сайт? Как правите вие един логин например?
 
Забелязвам че, големите фреймуорци използват нещо, да го наречем form helper. Един вид вместо да се пише чист html използват разни функции които, генерират формата. Чудя се има ли смисъл да си направя такъв хелпер? Гледам Symfony и се оказва че е много по трудоемко и сложно да направиш една форма, отколкото да си напишеш чист html, особено ако не я искаш както е по default.
 

Back
Горе