Показаны сообщения с ярлыком PHP. Показать все сообщения
Показаны сообщения с ярлыком PHP. Показать все сообщения

1 декабря 2025 г.

идеальная структура проекта на CodeIgniter 4.6 с разделением ответственности по слоям

 

✅ 1. CONTROLLER — только HTTP и передача данных

Задачи контроллера:

  • Принять запрос (GET/POST)

  • Создать DTO из запроса: RealEstateDTO::fromRequest($request)

  • Передать DTO в Service

  • Получить результат от Service

  • Передать данные в View

  • Никакой бизнес-логики, никаких where(), никаких запросов к модели

Контроллер — тонкий.


✅ 2. DTO — извлечение и валидация входных данных

Задачи DTO:

  • Прочитать входные данные из Request

  • Привести типы: string → int, пустое → null

  • Сформировать:

    • $filters

    • $sort

    • $pagination

    • $price_range

    • $city, $city_id

  • Создать эономические методы:

    • getFilters()

    • getSortOrders()

    • getPage()

    • getPerPage()

    • buildCanonicalUrl()

    • buildPriceRange()

DTO — фильтрация и нормализация данных + правила конвертации.
Никаких запросов к базе.


✅ 3. SERVICE — бизнес-логика

Задачи сервиса:

  • Принять DTO

  • Передать DTO → Filter → Repository

  • Выполнить бизнес-операции:

    • создание объекта

    • обновление объекта

    • сортировка

    • тумблеры (toggle)

    • привязка изображений

  • Конвертация DTO → entity → модель (insert/update)

Service — мозг приложения.


✅ 4. FILTER — подготовка query builder

Filter — это слой, который превращает DTO в SQL-запрос.

Задачи Filter:

  • Принять $dto->getFilters()

  • Применить:

    • where

    • like

    • between

    • orderBy

    • join

  • Поддержка:

    • $filter->where('city_id', 3)

    • $filter->orderBy('price','DESC')

    • $filter->paginate($page, $perPage)

Ничего не знает о Request, Service, Validation.

Filter — это SQL-конструктор.


✅ 5. MODEL — простая связь с конкретной таблицей

Задачи Model:

  • Точка входа в Query Builder

  • Описание таблицы

  • Soft deletes / timestamps

  • Методы:

    • getEntity($id)

    • isOwnedBy($id, $userId)

    • search()

  • Модель — это врата к базе, но не бизнес-логика.

Model — минимальная логика, только про таблицу.


✅ 6. REPOSITORY — доступ к данным

Repository — толстый слой для работы с базой.

Задачи Repository:

  • Выполнить Filter и Builder

  • Возвратить данные:

    • find

    • findAll

    • paginate

    • save/update

    • delete

  • Отвечает за работу со связями:

    • join cities

    • join users

    • eager loading (в будущем)

Repository — это слой, который заменяет работу с Model напрямую.

Слой Что делает Что не делает
Controller только request → DTO → service → view логика, SQL
DTO параметры, фильтры, сортировка, canonical SQL, бизнес-логика
Service операции над сущностями, вызывает Repository не обращается к Request
Filter строит SQL условие не знает о Request
Repository общение с Model и БД бизнес-правила
Model доступ к таблице, PK, timestamps бизнес-логика


11 февраля 2025 г.

CodeIgniter 3.1.13 и версии PHP: с чем он совместим?

CodeIgniter 3.1.13 – это последняя версия популярного PHP-фреймворка третьего поколения. Хотя CodeIgniter 4 уже давно вышел и активно развивается, третья версия остается востребованной благодаря своей простоте, стабильности и легкости в освоении. Однако, чтобы обеспечить бесперебойную работу проекта на CodeIgniter 3.1.13, важно понимать, с какими версиями PHP он совместим. В этой статье мы рассмотрим, какие версии PHP поддерживаются и какие могут возникнуть сложности при использовании более новых или старых версий.

Установка NGINX PHP 8 PHP-FPM PHPMyAdmin MySql на Ubuntu

1. Обновляем Ubuntu:

apt-get update && apt-get upgrade

 

31 января 2025 г.

Laravel - Полиморфная связь

 

$table->morphs('noteable'); — это метод в Laravel, который создает два столбца в таблице базы данных для реализации полиморфной связи (polymorphic relationship). Полиморфная связь позволяет одной модели быть связанной с несколькими другими моделями через единый интерфейс.

Что делает morphs?

30 января 2025 г.

Установка Shopware

Shopware – это современная eCommerce-платформа с открытым исходным кодом, которая отлично подходит для создания интернет-магазинов. Она построена на Symfony и Vue.js, поддерживает API-first подход и имеет гибкую модульную архитектуру.

В этой статье разберем процесс установки Shopware 6.

Системные требования

Перед установкой убедитесь, что ваш сервер соответствует минимальным требованиям:

  • PHP 8.1 или выше (с расширениями intl, pdo_mysql, gd, zip, bcmath, opcache, mbstring, curl)
  • Composer 2.2 или выше
  • MariaDB 10.3+ / MySQL 8.0+
  • Node.js 18+ и npm 8+ (если будете кастомизировать фронтенд)
  • Web-сервер Nginx или Apache

Клонирование проекта


composer create-project shopware/production .

Настройка прав

После установки необходимо задать правильные права на файлы и папки:

Настройка прав

После установки необходимо задать правильные права на файлы и папки:

chmod -R 775 var chmod -R 775 public chmod -R 775 config chmod -R 775 custom/plugins chmod -R 775 files chmod -R 775 logs 
 
 
 

16 декабря 2024 г.

Разработка PHP и MySQL с использованием Docker

Современные веб-разработчики часто сталкиваются с проблемами настройки окружения для проектов. Docker помогает стандартизировать и ускорить процесс развертывания приложений, изолируя их зависимости и конфигурации в контейнерах. В этой статье мы рассмотрим, как настроить окружение для разработки PHP и MySQL с помощью Docker.

Преимущества использования Docker

  • Изоляция: Каждое приложение работает в своём контейнере, что предотвращает конфликты между версиями зависимостей.

  • Мобильность: Контейнеры можно запускать на любом сервере, поддерживающем Docker.

  • Скорость: Быстрое развертывание и обновление приложений.

  • Консистентность: Все разработчики используют одинаковую среду.

4 октября 2021 г.

Генератор кода Symfony PHP

 Список доступных команд:

php bin/console list make 


Создание Сущности

php bin/console make:entity



Создание Сущности  User  системы аутентификации Symfony Security, 

symfony console make:user


сгенерировать шаблон с формой входа, а также создать аутентификатор

symfony console make:auth


Создание контроллера

php bin/console make:controller


Создание crud контроллера для Сущности

bin/console make:crud {entityname}


Подробности по конкретной команде, напр. для создания контроллера:

php bin/console make:controller --help



Создание формы

php bin/console make:form


Очищаем базу полностью

bin/console doctrine:schema:drop  --full-database --force



Создание базы данных на основе настроек

php bin/console doctrine:database:create


Создание миграции на основе созданных  Сущностей

php bin/console make:migration


Выполнение миграции

php bin/console doctrine:migrations:migrate


Список всех маршрутов приложения

php bin/console debug:router


Очистка кеша

php bin/console cache:clear

30 августа 2020 г.

Как выбрать php фреймворк 2020. часть 1

В 2020 для улучшения качества кода, хорошей структуры проекта, и возможно

увеличение скорости разработки обязательно использовать PHP фреймворк.

Как выбрать PHP фреймворк?

Какой лучший  фреймворк  PHP в 2020 году ?

Занимаясь активно разработкой проектов на пхп, а также просматривая "чужой код" на php, решил написать краткую заметку, с моим мнением.


Мое знакомство с фреймворка началось примерное в 2008 году, и тогда, я выбирал между CakePHP,  CodeIgniter, Zend Framework.

Zend Framework мне показался сложным, а на CI и CakePHP. Я сделал несколько проектов. В CakePHP мне понравился принцип DRY – Don't repeat yourself – принцип призывает Вас не повторяться при написании кода. Т.е уже когда по урлу четко понимаешь, в какой контроллер идти и где у тебя находится view. В CI для этого приходилось писать несколько "лишних" строк типа return view('welcome_message'). немного не нравилось... хотя такое повеведение, можно было просто доработать и в CI, я его даже делал тогда, и предложил на одном форуме, но не всем этот принцип понравился.  Кроме того в CakePHP можно было в моделях делать связи типа МНОГИЕкоМНОГИМ и так далее, но это конечно приводило в более мендленной работе , но в некоторых случаях ускоряло разработку. После все плюсов и минусов тогда я сделал все таки выбор в пользу CI, хотя он был более "беден" по функционалу, но это легко исправлялось подключением дополнительных библиотек.


 

6 апреля 2020 г.

Отлов ошибок, error handler в php



register_shutdown_function(function ()
{
$error = error_get_last();
if ($error && ($error['type'] == E_ERROR || $error['type'] == E_PARSE

|| $error['type'] == E_COMPILE_ERROR)) {
if (strpos($error['message'], 'Allowed memory size') === 0)

{

// если кончилась память
ini_set('memory_limit', (intval(ini_get('memory_limit'))+64)."M");
// выделяем немножко что бы доработать корректно
Log::error("PHP Fatal: not enough memory in ".$error['file'].":".$error['line']);
} else {
Log::error("PHP Fatal: ".$error['message']." in ".$error['file'].":".$error['line']);
}
// ... завершаемая корректно ....
}
})

4 декабря 2019 г.

QR-код для оплаты в биткоин на PHP

Была задача добавить или интегрировать оплату в биткоинах на сайт. Были некоторые ньюансы, но задача довольно быстро была решена с использованием АПИ от Blockchain.info. Для оплаты они генерируют для каждого заказа новый биткойн адрес,но все полученные BTC попадают в основной кошелек. Для удобства оплаты был добавлен также QR code с использованием решения от chart.googleapis.com. Рассматривался также для QR code плагин для jquery, но он не показал стабильной работы.

.

4 декабря 2014 г.

PHP как вырезать несколько слов из строки

довольно часто возникает задача на пхп вырезать одно, два или несколько слов из строки. для решения этой задачи я написал небольшую функцию subwords. в ней 2 парментра, первый это сама строка, второй, количество слов которые нужно получить на выходе т е вырезать. пользуйтесь.
function subwords($str,$count = 1)
{
 $str = trim($str);
 $posblank = 0;
 for ($i = 0; $i < $count; $i++)
 {
  $posblankcurrent = strpos($str,' ',$posblank);
  if($posblankcurrent != false)
  {
   $posblank = $posblankcurrent + 1;
  }
 }
 if ($posblank)
  $str = substr($str,0,$posblank-1);
 return $str;
}

стандартизированные форматы для обмена информацией о недвижимости

  Да, для обмена информацией о недвижимости существуют стандартизированные форматы , в основном XML и JSON, которые позволяют системам (порт...