Очевидно, что Database() можно вынести в отдельную модель, типа ActiveRecordобъект для работы с СУБД никоим образом не относится к паттерну AR. AR не должна наследоваться от объекта СУБД.
и просто наследовать еёhttps://refactoring.guru/ru/replace-inheritance-wi...
Мне не комфортно, что приходится создавать объект в __construct, чтобы пользоваться им в классе.это ваши проблемы. точнее это вообще не проблема, что в конструкторе создаются объекты.
Здравствуйте, решил все-таки научиться хоть немного программировать по-взросломупрочти хотя бы 1/3 этой книги
foreach ($validatorAttrs as $validator_property_key => $validator_property_value) {
// Проверка на наличие в классе таких свойств.
try {
$reflection->getProperty($validator_property_key);
} catch (\ReflectionException $e) {
throw new \InvalidArgumentException(
get_class($this) . ": Bad call validator settings on property `$key`: " . $e->getMessage()
);
}
// Устанавливаем свойства валидатора, установленные клиентом.
$o->$validator_property_key = $validator_property_value;
}
- старое доброе расширение mysql. В 5-й версии нудит нотисами о том, что устарело, а из 7-й уже удалено совсем. Плюс форменная истерика в интернетах на её счёт (абсолютно беспочвенная при этом. Бандерлоги так и не научились правильно ей пользоваться, но все свои проблемы решили свалить на неё).все "радости" разработчиков по поводу PDO - от незнания. PDO - жутко неудобная, недоделанная хрень. Просто ничего другого нет. Поэтому мы пишем самописные обертки для упрощения работы с базой.
- mysqli. Эта библиотека не предназначена для испрользования напрямую в коде. А только как строительный материал для создания библиотеки более высокого уровня. Напрямую же ей пользоваться невозможно. Легче пережить небольшую атомную войну, чем попытаться привязать несколько переменных в оператор IN().
- PDO - тупо методом исключения: ничего другого все равно больше не остаётся. Тем более, что это такой недо-DAL, который делает много того, что должна делать библиотека для работы с SQL (но ещё больше она не делает, о чем речь пойдёт ниже)
Можно конечно записывать в куки захэшированный пароль, чтобы каждая страница проверяла соответствие куки - логин == бд.логин && пароль == бд.пароль, но я не уверен что это правильно.
SELECT * FROM `user` WHERE `id` = ID_из_куки
Хотя любой корректный PHP-код может находиться внутри пространства имен, только классы (включая абстрактные и трейты), интерфейсы, функции и константы зависят от него.php.net/manual/ru/language.namespaces.definition.php
namespace Code1{
function sayHi(){
print "Передаю привет из code1";
}
CONST A = 1;
}
namespace Code2{
function sayHi(){
print "Передаю привет из code2";
}
CONST A = 2;
}
namespace {
print "файл general.php успешно подключен";
Code2\sayHi();
print "<br>" . Code2\A;
}
1) В чем смысл фрейморков?За тебя уже все написано. Каркас, CRUD/ORM и масса плюшек.
2) Какой учить первый?никто не даст ответа. Индустрия сходит с ума, территория PHP проклята - одному работодателю нужен один фреймворк, другому - другой. Угнаться за всем этим - нереально. В идеале - искать работодателей, готовых вас "вырастить", т.е. взять лишь с минимальным набором знаний, например, теоретических. Все фреймворки знать невозможно. А если и возможно, то это лишь временно - нереально всю жизнь знать все возможности десятка пхпшных фреймворков.
3) Почему способ с самописным роутером, плохой?Фреймворк - это не только роутер. Можно перефразировать вопрос и спросить:
Почему способ с самописным фреймворком плохой?Самописный фреймворк - это не плохо. Как получение опыта - очень даже хорошо. Для себя можешь писать. Но что бы в команду устроиться работать, тебе твой фрейм самописный не поможет. Команде нужна унификация, для этого и существуют фреймворки.
Думаю если немного его усложнить, то и с более сложными проектами справится.бесспорно. реально справится. только он будет заточен только под тебя. и будет ограничен функционал - тебе не хватит жизни, что бы написать то, что делают команды фанатиков.
Как сохранить пользователя авторизованным на сайте?
/**
* Аутентификация пользователя на основании данных из COOKIE.
*
* @param void
* @return Mvs\Module\User\Model\User
*/
public function processAuthentication()
{
if ($this->request->getCookie(self::ID_COOKIE_NAME, 'string') &&
$this->request->getCookie(self::HASH_COOKIE_NAME, 'string')
) {
$user = $this->mapper->findModelById($this->request->getCookie(self::ID_COOKIE_NAME, 'string'));
if (is_object($user) &&
md5($user->getLogin() . $user->getPassword() . Mvs\Registry::getInstance()->SECURITY['AUTHORIZATION_SALT'])
=== $this->request->getCookie(self::HASH_COOKIE_NAME, 'string')
) {
$user->setVisitdate(new Mvs\Type\Datetime());
$user->setIp($_SERVER['REMOTE_ADDR']);
$this->mapper->saveModel($user);
return $user;
} else {
$this->logout();
}
}
return $this->mapper->findModelById(-1);
}
1. При загрузке сразу обрезать изображения и ложить их в рабочие директории под нужными разрешениями, при этом появилась необходимость сразу же и сохранять информацию о изображении в БД не привязывая к какому либо посту (для того, чтобы кроном, периодически удалять те картинки, которые пользователи так и не сохранили вместе с постом).я точно также сделал у себя.
проблема в том, что между этими двумя действиями редко, но может сработать крон, и удалить нужные изображения вместе с ненужнымипроблемы никакой быть не должно - записывай дату добавления изображения и кроном ищи изображения старше часа, например:
$sql = 'SELECT * FROM t
WHERE post_id IS NULL
AND file_date < (NOW() - INTERVAL 60 MINUTE)
ORDER BY id ASC LIMIT ?i';