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

Съгласен съм. Не оставай с впечатлението че отричам фреймуорците. Ако става въпрос за фирма и екипна работа, естествено по-доброто решение е някой от големите в бранша.
 
Като цяло модела ти е извън всякаква логика.

Модела трябва(или поне е желателно) да отговаря на таблица в базата ти данни. Това ти е основната част за връзка с база данни.
В модела се правят методи, които извличат данни, записват данни, правят проверки, връщат грешки и т.н.
Контролера е двигателния процес, който трябва да прихване тези грешки. Разбира се, говорим за грешки, които са на ниво потребител.

Когато връщаш с return се уверявай, че това е булева стойност. Не е добра практика да пращаш текстов низ чрез return.

Примерна имплементация(сложил съм ги на едно за по-удобно):
PHP:
<?php

class User {
	
	public static function is_logged($user_id) {
		// заявка
		
		if ( count(..) ) {
			return 1;
		}
		
		return 0;
	}
}

class UserController {
	
	public function show() {
		
		if ( User::is_logged(..) ) {
			return view(...);
		}
	}
}

Друг вариант е да използваш изключения и да ги прихващаш с try-catch блока.
Например, ако потребителя въведе верни данни за вход, то провери дали IP-то му е баннато, дали акаунта му е баннат, дали акаунта му е зключен и т.н. Ако някое от тези се издъни, прихващаш съобщението му и го извеждаш на екрана.

Но, ако смяташ да задълбаваш в MVC Frameworks, по-добре се насочи към някой готов.
 
Благодаря за отговора. Както става ясно от по горните постове фремуорк си имам и си работи идеално. За да стане по ясно ще обясня още веднъж. Този модел наследява базов клас за работа с базата. Взимам сесията на юзъра, сравнявам я със записа в базата и дали е логнат. Това което съм пуснал е само един иф. Не пуснах целия код с цел да останат нещата лесни за четене. Ситуацията е такава. Всеки юзър ще може да се разхожда из сайта и да си разглежда, но само логнати ще могат да свалят или да качват разни работи. Този модел ми трябва за да може където и да се намира юзъра, в момента в който опита да свали нещо аз да проверя дали е логнат. Естествено после въз основа на това което върне този модел дадения контролер ще прецени какво трябва да се направи и ще си извика някое вю.

Ако разбирам правилно от вашите коментари най-добре е да връщам булева стойност и класа да е статичен?
 
Понеже и аз съм на такава вълна (mvc), не ползвам фреймуърк, но системата е mvc и преди време си реших един от проблемите с логина по следния начин:
В ControllerBase класа, който наследяват всички контролери, има една константа REQUIRE_LOGIN, която по default е false - всеки контроллер може да каже require_login=true.
В ControllerBase има и метод static checkIfAccessible, който според необходимостта от логин (reqiore_login === true) и логин-статуса връща bool. Във frontController-а извиквам checkIfAccessible и ако върне true, инстанциирам контролера, в противен случай 404.
За да се предпазя от това евентуално да не е проверено предварително за права, в ControllerBase има конструктор, който извиква checkIfAccessible и прави throw exception при false. (до тази ситуация не би трябвало да се стигне, но го сложих за допълнителна защита, даже за по-сигурно този конструктор трябва да е final)
Искам да попитам дали този подход е правилен, защото не съм го срещал досега, но пък ми се вижда елегантно, защото в контролерите не се занимавам с проверки и неща, а само казвам require_login = true и готово.
 
Интересно решение :) . Както се казва има повече от един начин да бъдеш прав. По принцип до колкото знам е добре всеки обект да изпълнява строго определена работа. Един вид не е работа на контролера да държи константи и изобщо каквато и да е информация. Но пък по някой път може да се нарушат малко правилата за сметка на удобството. И последно да кажа че само си умувам и може изобщо да не съм прав :D .
 
teroristd каза:
Интересно решение :) . Както се казва има повече от един начин да бъдеш прав. По принцип до колкото знам е добре всеки обект да изпълнява строго определена работа. Един вид не е работа на контролера да държи константи и изобщо каквато и да е информация. Но пък по някой път може да се нарушат малко правилата за сметка на удобството. И последно да кажа че само си умувам и може изобщо да не съм прав :D .
Идеята е, че всеки контролер обработва конкретна част от заявките. Например контролерът PostController би имал методи edit, upload, remove, markSpam и т.н. Въпросът е, че при инстанциирането си PostController трябва да провери дали има право да съществува, тоест в конструктора трябва да стои код, който проверява дали потребителят е логнат, и ако не е, по някакъв начин да спре създаването си... Което в конструктор няма как да стане освен с Exception. По-рано @FakeHeal го спомена:

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

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

А това за рутера - някакси не стигнах до там... взех идеята за frontController и там сложих зареждането на останалите контролери. Това грешно ли е?
 
Аз имах предвид че не е правилно в контролера да слагаш константи или да извличаш информация. За това трябва да си направиш примерно някакъв конфигурационен файл, който си е един вид модел. Във фронт контролера или в базовия контролер вече въз основа на информацията върната от модела взимаш решението как да подходиш по на там.
 

Back
Горе