Как е по-правилно?

teroristd

Registered
Няма да пускам целия код само частта която е свързана с питането ми.

Имам модел в който проверявам дали даден юзър е логнат. В единия случай връщам стринг и в контролера проверявам за стринга така:

Код:
Модела
class IsLogged {

    public function logged() {

        if ($this->log == 'logged') {
            return 'logged';
        }
    }

}

Контролера
class Index {

    public function index() {

       $isLogged = new \models\IsLogged();
       $log = $isLogged->logged();

        if ($log == 'logged') {
            header("Location: link");
        } 

}


В другия случай тролвам ексепшън в модела а в контролера ползвам try catch

Код:
Модела
class IsLogged {

    public function logged() {

        if ($this->log == 'logged') {
            throw new \Exception('logged', 200);
        }
    }

}

Контролера
class Index {

    public function index() {

       $isLogged = new \models\IsLogged();

        try {
            $isLogged->logged();
        } catch (\Exception $ex) {
            if ($ex->getMessage() == 'logged') {
                header("Location: link");
            }
        } 

}

Та питането ми е как да действам. Ако има по-добър вариант, моля да го споделите. По принцип може и с true/false или 0/1, но става по объркано според мен и предразполага за грешки :D .
 
Fakeheal каза:
Аз бих проверила едно ниво по-нагоре дали е логнат или не. Не бих оставила да влезе в контролера или модела ми.

Не те разбрах. Дай някакъв пример ако може :) .
 
Можеш ли да дадеш целия ти цикъл на приложението?

Кое е първото, което се зарежда/инстанциира/прави в приложението ти?
Как се зареждат контролери/модели/view-та? (предполагам следва MVC pattern-a)?

И евентуално кода на този IsLogged модел.
 
Fakeheal каза:
Edit: Защо имаш модел isLogged()?

Еми нали от някаде трябва да се вземе инфото за юзъра, което е в база данни и доколкото знам е правилно е модел да се разправя с базата.
 
Fakeheal каза:
Можеш ли да дадеш целия ти цикъл на приложението?

Кое е първото, което се зарежда/инстанциира/прави в приложението ти?
Как се зареждат контролери/модели/view-та? (предполагам следва MVC pattern-a)?

И евентуално кода на този IsLogged модел.

Да следва MVC. На gatakka фрейма си ползвам в момента, като съм оправил някои бъгчета и съм си добавил разни работи. Целия код ако го пусна ще е много и докато стигнеме до въпроса ми ще трябва да обяснявам много кое за какво е :) .
 
Не знаеш кой е gatakka? Или не знаеш какво представлява фрейма който, е написал? Или и двете? А може би това е начин да ме попиташ защо не ползвам laravel или някой подобен фреймуорк :) .
 
Не че нещо, но това

PHP:
      if ($this->log == 'logged') { 
            return 'logged'; 
        }

за мен е пълна глупост. Поне да връщаше булева стойност... и това е стойност, която по принцип би трябвало да се вади от сесията.
 
teroristd каза:
Не знаеш кой е gatakka? Или не знаеш какво представлява фрейма който, е написал? Или и двете? А може би това е начин да ме попиташ защо не ползвам laravel или някой подобен фреймуорк :) .

Знам кой е, просто не съм попадала на негов framework. Also, нямам намерение да питам защо не ползваш community made framework. Исках просто да зная каква му е структурата и да дам някаква релевантна информация и да споделя знаение, тъй като модел-а който си посочил не изглежда като правилно имплементиране на функционалност.
 
lamerko каза:
Не че нещо, но това

PHP:
      if ($this->log == 'logged') { 
            return 'logged'; 
        }

за мен е пълна глупост. Поне да връщаше булева стойност... и това е стойност, която по принцип би трябвало да се вади от сесията.

Всъщност това го вадя точно от сесията. Тук просто съм пуснал само проверката.
 
Fakeheal каза:
teroristd каза:
Не знаеш кой е gatakka? Или не знаеш какво представлява фрейма който, е написал? Или и двете? А може би това е начин да ме попиташ защо не ползвам laravel или някой подобен фреймуорк :) .

Знам кой е, просто не съм попадала на негов framework. Also, нямам намерение да питам защо не ползваш community made framework. Исках просто да зная каква му е структурата и да дам някаква релевантна информация и да споделя знаение, тъй като модел-а който си посочил не изглежда като правилно имплементиране на функционалност.

Ако имаш време и желание :) може да влезнеш и да погледнеш в блога му. MVC framework му е тага.
 
Фрейм-а на Гатака е е концептуално объркан и има твърде много недомислици. Личното ми мнение е, че той го е писал с единствената цел да си води курсовете по възможно най-разбираем начин, за което трябва нещо съвсем олекотено. За съжаление доста хора се подлъгват и започват да си играят върху него, като запълват разни дупки и т.н., а манджата става още по-оплескана.

Колкото за проверката дали си логнат - хубаво е нещата да бъдат максимално опростени. Вече си споменал Ларавел - добра идея е да взимстваш от там например. В случая - имаш един един статичен клас (понеже работиш данни, независещи от текущата инстанция, то няма смисъл да правиш инстанция на клас, който ще връща винаги едно и също) и "бърз метод за проверка. При Ларавел имаш if (Auth::check()) {...} Същия клас ти дава достъп и до информацията за потребитела като потребителско име, имейл, id и т.н. Всичко това са СТАТИЧНИ данни...
 
Както и да е, това, което исках да предложа е нещо от сорта на:

Имаш router (някакъв), който разпределя URL-ите от кои ресурси имат нужда. И още преди да зареждиш самата страница да направиш проверката дали изобщо клиента има достъп до ресурса. Някакъв middleware или нещо подобно.

Това обаче много зависи от workflow-a на целия framework. Как зарежда моделите/контролерите/view-тата.

Няма нужда да инициализираш всичко и в крайна сметка да няма смисъл от това, защото клиента няма достъп до ресурса.

Edit:
lamerko каза:
В случая - имаш един един статичен клас (понеже работиш данни, независещи от текущата инстанция, то няма смисъл да правиш инстанция на клас, който ще връща винаги едно и също) и "бърз метод за проверка. При Ларавел имаш if (Auth::check()) {...} Същия клас ти дава достъп и до информацията за потребитела като потребителско име, имейл, id и т.н. Всичко това са СТАТИЧНИ данни...

Не съм съгласна с това. Няма статичен клас. Има фасада, която дава "статичен" интерфейс към даден клас.

Auth::check е един вид shortcut към Illuminate\Auth\Guard и AuthManger-a в същия неймспейс. Като респективно Guard-a зарежда определения driver, който си специфирал в config/auth.php. Като всеки driver трябва да имплементира UserProviderInterface и съпътстващите го методи. Laravel не store-ва по default User обекта в сесия. Има си метод, който при Auth::check() и Auth::user() се вика (retrieveById() или retrieveByCredentials() - зависи от случая), който използва Model-a за да fetch-не информацията. (модела пак се описва в config/auth.php, като по default e User).
 
Относно структората, имам си папка със самия фрейм, в който има базов клас(ядро), клас за рутиране, клас за бази данни, за сесии, за помощни функции, фронт контролер(базов контролер), аутолоадинг, за визуализиране и др. Други папки извън папката с фрейма са модели, вю-та, контролери, публична, библиотека, грешки. В публичната имам файл индекс, в който викам стартиращия метод за приложението, който вика фронт контролера, който пък вика рутирането и така :) . В крайна сметка се зарежда да кажем главната страница и потребителят има право да се логне или не, но ако иска да достъпи дадена функционалност(да направи нещо да кажем да свали файл) трябва да е логнат. Там се включва този странен модел за който говориме.

Сори че пускам мненията със закъснение :oops: ама съм на бачкане и така се получава.
 
MVC е принцип, но няма задължителна имплементация.
VIEW(UI) - с нея крайният потребител комуникира с приложението. В тази компонента, няма или НЕ трябва да има никаква логика
MODEL(Logic) - тук се намира логиката. Всички логични операция - преобрзувание, заявки и т.н. се намират в този слой
CONTROLLER - както му се вика, тук двата предходни слоя се "женят". Този "слой" служи само за предаване (връзка, комуникация) между VIEW и MODEL ( Периферия и Бизнес логика)

Кой, как решава проблема си e абсолютно негово решение!!! Принципа е един, решението (ИМПЛЕМЕНТАЦИЯТА) e ваша
 
lamerko каза:
Фрейм-а на Гатака е е концептуално объркан и има твърде много недомислици. Личното ми мнение е, че той го е писал с единствената цел да си води курсовете по възможно най-разбираем начин, за което трябва нещо съвсем олекотено. За съжаление доста хора се подлъгват и започват да си играят върху него, като запълват разни дупки и т.н., а манджата става още по-оплескана.
.

Не съм съгласен че е "концептуално объркан". Не споря че е далече от големите фремуорци, дори не знам дали влиза и в графата микро фреймуорк. Самия gatakka си казва че не е готов за продукшън. Обаче за мене си е идеален. Има си аутолоадинг с неймспейсове(перфектен), има си рутиране(можеш да си пишеш и собствени рурери), има си клас за работа с базата(можеш да работиш с повече от една база, също и да си джаснеш някой ОРМ ако искаш), има си клас за работа със сесии(дефаултов и за база данни), има си конфигурация, има си класове за валидация и нормализация, има си клас за визуализация(можеш да работиш и със темплейти и без) и др. Какво повече ми трябва? Това е така да се каже ядрото на един фреймуорк. Да няма функцийка за всяко едно нещо. Ако искам форма за контакти трябва да си я напиша, но за мене това е предимство а не недостатък. Така имам много по-голям контрол и свобода на действие. Така мисля аз, не ангажирам никого с моето мнение.
 
Fakeheal: не говорех за конкретната реализация в Laravel, а принципа на викането. Въпросния фрейм на Гатака е много далеч като сруктура и сложност - говорим си за съвсем опростена система :)

teroristd: именно, че не е готов за продукшън. И изглежда никога няма да е готов, понеже той самия залитна по Ларавел. Сега за всяко едно нещо трябва да го дописваш, разширяваш и т.н. - цялото време ще ти минава по работа за нещо, което е предзнаначено да ти улесни работата, а не да я създава :)
 
Това за статичния клас е добра идея. Не се бях замислял че може да се направи така :) . А за дописването, аз вече съм си дописал това което ми е нужно. Колкото едно нещо е по-сложно, толкова е по вероятно да допуснеш грешки. За почти всички сайтове които ще правиш, не са ти нужни никакви толкова комплексни функционалности. Дори в много случаи разните орм-и и други "помагала", само ти забавят приложението. Друго нещо е и самото изучаване на дадения фреймуорк. Ако не си се занимавал с такъв и седнеш тепърва да пишеш, става дълга и широка. Дори да са ти ясни концепциите за пхп и ооп, пак трябва да се запознаеш с всяка една функцийка, и всяко едно нещо. По някой път дори прости неща могат да ти направят голям проблем. Пък да не говориме за темплейтната система където нито пишеш пхп, нито хтмл, а нещо незнайно и за рутирането където всяко едно линкче трябва да го описваш. Какво ми помага това? Както викат старите ора :D то това вече не е пхп. Само викаш някакви функции. Ако някой седне и се научи директно на laravel, и после му го вземеш и кажеш а са напиши ми една проста система за новини и е до там. Ще ходи и ще се самоубие :D .
 
То всичко хубаво, ама трябва и малко бизнес обмисляне :)

На първо място избора на фреймуърк (или липсата на такъв) трябва да се съчетае с идеята, че по дадения проект е възможно да работят повече от един програмист, както и последвалата поддръжка от трети леца впоследствие. Ти би се оправил сравнително лесно из твоето творение, но това не важи за човек, който след година решат да му възложат да добави един бутон за 10 минути - тепърва ще трябва да се "учи" на система, за която документация НЯМА. Естествено къстъм фреймовете обикновенно се създават насочени към конкретна реализация и ако впоследствие трябва да се разшири проекта - много е възможно да се налага по-сериозно дописване. С други думи ти изключваш екипната работа. И между другото - темплейтната технология е нещо много хубаво. :)

Колкото до личните умения - те са си строго лични и изучаването на даден фреймуърк не замества нещо друго.
 

Горе