Иногда меня просят сравнить «такой-то PHP-фреймворк» с Laravel. Поскольку я использовал только несколько фреймворков, в этой статье я расскажу, что такого прекрасного в Laravel, а вы сравните его с другими PHP-фреймворками, которые знаете.
Laravel — очень особенный фреймворк с сильным брендингом, поэтому почти всё особенное в Laravel имеет уникальное название. В статье я коснусь не только кода, но и фреймворка, сообщества и экосистемы.
Composer
Composer — менеджер зависимостей для PHP. Он не предназначен конкретно для Laravel, но Laravel без него не работает.
Composer (с Packagist) содержит тысячи PHP-пакетов от сообщества, большинство из которых имеют минимум зависимостей и могут быть просто и без проблем добавлены в ваше приложение. Поэтому вам не нужно изобретать велосипед, а фреймворк не будет мешать вам использовать существующие решения.
Composer обрабатывает автозагрузку PHP-классов, используя любую конфигурацию из карты классов, файлов, PSR-0 или PSR-4.
Поскольку Composer использует версионность, вы легко можете зафиксировать версии пакетов для вашего приложения. Так вы будете уверены, что везде, где вы разворачиваете своё приложение, будет запускаться одинаковый код.
Начать работать с Laravel очень просто, достаточно установить Composer и выполнить:
shcomposer create-project laravel/laravel
PHP 5.4
Laravel 5 требует PHP 5.4, а Laravel 4 требует PHP 5.3. И когда я говорю «требует», это значит, что Laravel полностью использует все новые возможности PHP, такие как функции-замыкания, пространства имён, типажи и другие.
Laravel отнюдь не является одним из фреймворков для PHP 4, адаптированных для использования классов PHP 5. Он разработан в строгом соответствии с парадигмами ООП, и вы действительно можете использовать новейшие возможности PHP.
То, что для Laravel требуется PHP, также означает, что ваш код получит улучшенную производительность новой среды выполнения PHP.
Dotenv
Где вы храните секретную информацию вашего приложения, такую как пароль от БД, логин для email и другие вещи? Laravel 5 использует хорошо известный файл .env, который также используют многие фреймворки для других языков программирования. Это файл, в котором вы определяете пары ключ-значение для любой вашей секретной информации.
Например, ваш файл .env может выглядеть так:
APP_ENV=production
DB_HOST=127.0.0.1
DB_DATABASE=laraveldb
DB_USERNAME=laravelapp
DB_PASSWORD=str0ngP4sw0rd
И вы можете заполнить ваши файлы настроек вот так:
'connections' => array(
'mysql' => array(
'driver' => 'mysql',
'host' => getenv('DB_HOST'),
'database' => getenv('DB_DATABASE'),
'username' => getenv('DB_USERNAME'),
'password' => getenv('DB_PASSWORD'),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
),
Вы можете создать этот файл локально и ещё один на вашем рабочем сервере и затем обновлять ваше приложение, не беспокоясь о БД и других важных секретных данных.
Загрузка файла .env автоматически обрабатывается Laravel с помощью библиотеки Dotenv.
PSR-4
Laravel — первый фреймворк, поддерживающий PSR-4. Прямо из коробки Composer автоматически загрузит все классы из каталога app, используя стандарт автозагрузки PSR-4.
Это значит, что у вас может быть одно пространство имён для вашего приложения, и вы можете структурировать его, как захотите и как посчитаете логичным. Laravel не требует от вас размещения определённых файлов в определённых папках.
Это каталог приложения по умолчанию с пространством имён App:
app
├── Console
│ └── InspireCommand.php
├── Http
│ ├── Controllers
│ │ ├── Auth
│ │ │ ├── AuthController.php
│ │ │ └── PasswordController.php
│ │ └── HomeController.php
│ ├── Middleware
│ │ ├── AuthMiddleware.php
│ │ ├── BasicAuthMiddleware.php
│ │ ├── CsrfMiddleware.php
│ │ ├── GuestMiddleware.php
│ │ └── MaintenanceMiddleware.php
│ └── Requests
│ └── Auth
│ ├── LoginRequest.php
│ └── RegisterRequest.php
├── Providers
│ ├── AppServiceProvider.php
│ ├── ArtisanServiceProvider.php
│ ├── ErrorServiceProvider.php
│ ├── EventServiceProvider.php
│ ├── LogServiceProvider.php
│ └── RouteServiceProvider.php
└── User.php
Как видите, здесь есть некоторые вещи по умолчанию, но вы можете разместить классы там, где захотите, и это делается очень просто.
Вы всегда можете изменить пространство имён приложения с помощью команды:
shphp artisan app:name YourNamespace
Эта команда пройдёт по всем вашим файлам и изменит в них объявление пространства имён.
IoC-контейнер — расширения ядра
Контейнер обратного управления в Laravel — мощный инструмент для управления зависимостями классов. Внедрение зависимостей представляет собой способ снятия жестко закодированных зависимостей класса. Вместо этого зависимости внедряются во время выполнения, обеспечивая большую гибкость, так как реализация зависимостей может быть легко изменена.
Вы можете использовать IoC-контейнер в вашем приложении, чтобы сделать всё внедряемым и легко тестируемым с помощью объектов-заглушек.
IoC-контейнер может извлекать классы без какой-либо настройки. Например:
class FooBar {
public function __construct(Baz $baz)
{
$this->baz = $baz;
}
}
Как видите, класс PHPBaz
автоматически внедрён в класс PHPFooBar
. На практике это будет использоваться в контроллерах вот так:
class OrderController extends BaseController {
public function __construct(Order $orders)
{
$this->orders = $orders;
}
public function getIndex()
{
$all = $this->orders->all();
return View::make('orders', compact('all'));
}
}
В этом примере вы видите, что класс PHPOrder
внедрён в PHPOrderController
без какой-либо дополнительной настройки.
Но в новом Laravel есть кое-что ещё более замечательное, и называется оно — внедрение методов. Это внедрение зависимостей на основе методов.
Например, этот класс может быть ещё проще:
class OrderController extends BaseController {
public function getIndex(Order $orders)
{
$all = $orders->all();
return View::make('orders', compact('all'));
}
}
Вы можете добавить столько зависимостей на основе классов или методов, сколько пожелаете, а IoC-контейнер извлечёт их для вас.
Поскольку всё в Laravel внедряемо, вы легко можете подменить что-нибудь в ядре фреймворка.
Запросы форм
В Laravel есть эта восхитительная возможность, которая называется запросами форм. Это проверка запросов для ваших контроллеров. Это не просто проверка данных, а полная обработка запроса.
Запросы форм комбинируются с функциональностью внедрения методов, чтобы добавить бесшаблонный способ проверки пользовательского ввода. Например, класс PHPRegisterRequest
:
<?php namespace App\Http\Requests;
class RegisterRequest extends FormRequest {
public function rules()
{
return [
'email' => 'required|email|unique:users',
'password' => 'required|confirmed|min:8',
];
}
public function authorize()
{
return true;
}
}
У этого запроса есть правила для проверки данных и функциональность авторизации, которая определяет, кто может использовать этот запрос. В этом примере это может быть кто угодно, поэтому любой может зарегистрироваться, используя поля email и password.
Чтобы использовать этот запрос, вам надо только намекнуть на объект запроса в вашем контроллере, и вы получите проверку запроса очень простым путём:
<?php namespace App\Http\Controllers\Auth;
use Illuminate\Routing\Controller;
use Illuminate\Contracts\Auth\Guard;
use App\Http\Requests\Auth\LoginRequest;
use App\Http\Requests\Auth\RegisterRequest;
class AuthController extends Controller {
protected $auth;
public function __construct(Guard $auth)
{
$this->auth = $auth;
}
public function register(RegisterRequest $request)
{
// Форма регистрации прошла проверку, создать пользователя...
$this->auth->login($user);
return redirect('/');
}
}
Вы видите, что в этом контроллере нет какого-либо связующего кода или кода проверки, всё сделано раздельно и чисто.
У запросов форм есть функциональность перенаправления для случаев ошибок проверки ввода, сообщений для представлений и т.д.
Eloquent
Eloquent ORM, включённая в Laravel, — наиболее мощная реализация шаблона ActiveRecord в PHP. Кроме обычных CRUD-операций в ней есть мягкое удаление, области запросов, отношения, методы доступа и мутаторы, мутаторы дат, наблюдатели модели и многое другое.
И знаете что? Вам даже не нужен Laravel, чтобы её использовать. Вы легко можете добавить слой БД Laravel с Eloquent в ваш PHP-проект, сделанный не на Laravel. Перейдите по ссылке database, чтобы настроить её в вашем проекте.
Не говоря уже о сотнях расширений Eloquent, таких как вложенный набор Baum, Translatable, проверка моделей Ardent, Database Backup Manager, MongoDB и многих других.
Цикл версий
У Laravel очень предсказуемый цикл версий. Через каждые шесть месяцев можно ждать очередной версии. Laravel выходит через один месяц после выхода Symfony.
Вы получаете либо версию с новыми функциями, либо версию с совершенно новым номером. Версии с исправлениями ошибок выходят каждые несколько месяцев. Это хорошо, потому что фреймворк разрабатывается очень быстро, и вы можете рассчитывать на получение улучшений безопасности и других улучшений так быстро, как только возможно.
На основные версии особенно легко переходить, и у вас, вероятно, не возникнет вопросов при обновлении. Но поскольку Laravel является отличной основой для чего бы то ни было, вы можете даже оставаться на одной версии в течение всего года и обнаружите, что для этой версии по-прежнему выходят исправления и улучшения.
SSH задачи
В Laravel есть простой способ для SSH-подключений к удалённым серверам и запуска команд, что позволяет вам легко создавать задачи, которые работают на удалённых серверах. С помощью небольшой настройки вы сможете запускать ваши задачи вот так:
SSH::into('production')->run(array(
'cd /var/www',
'git pull origin master',
));
Или вы можете использовать подключение к другому серверу:
SSH::into('staging')->run(array(
'cd /var/www',
'git pull origin master',
));
Вы также можете скачивать файлы:
SSH::into('staging')->get($remotePath, $localPath);
$contents = SSH::into('staging')->getString($remotePath);
SSH::into('staging')->put($localFile, $remotePath);
SSH::into('staging')->putString($remotePath, 'Foo');
Итак, вы увидели, что вы можете создавать с помощью этого инструмента. Вы можете автоматизировать несколько задач, которые нужны вам для развёртывания или обслуживания вашего сервера, или для чего-то ещё.
Flysystem
Flysystem — восхитительный пакет из Лиги выдающихся пакетов для управления файловыми системами. Это файловая система, использующая коннекторы, с помощью которой вы легко можете взаимодействовать с local, awss3, dropbox, rackspace и другими файловыми системами в облаке.
// Запись файлов
File::put('filename.txt', 'contents');
// Чтение файлов
$contents = File::get('filename.txt');
// Проверка существования файла
$exists = File::exists('filename.txt');
// Удаление файлов
File::delete('filename.txt');
// Создание каталога
File::makeDirectory('nested/directory');
// Удаление каталога
File::deleteDirectory('path/to/directory');
И вы можете использовать этот же API для любой файловой системы, которую хотите использовать. Flysystem поставляется встроенным в Laravel, и вы можете использовать класс PHPFile
.
Elixir
Если вы пользовались новейшими технологиями для фронтенда последние несколько лет, то, вероятно, вы использовали препроцессор для ваших файлов CSS и JavaScript. Но если нет, то Laravel об этом позаботится.
Вам нужна максимально оптимизированная онлайн-версия вашего приложения. Это значит, что вам надо уменьшать и комбинировать ваши файлы CSS и JavaScript.
Вместо использования для этого каких-либо PHP-пакетов Laravel предлагает пакет Elixir для исполнителя задач NodeJS Gulp. Поэтому вы можете использовать все те преимущества NodeJS и Gulp, которые вам нравятся.
Вы запускаете Gulp-задачу watch, и Elixir позаботится обо всём для вас. Если вы используете LESS и CoffeeScript, то ваши настройки могут быть такими:
var elixir = require('laravel-elixir');
elixir(function(mix) {
mix.less()
.coffee()
.routes()
.events()
.phpUnit();
});
Эта конфигурация скомпилирует ваши файлы less и coffee, а также просканирует маршруты и события в вашем приложении. Ещё она будет запускать юнит-тесты после каждого изменения PHP-файлов.
Это так просто настроить. Вам надо только поместить ваши файлы less и coffee в папку /resources/assets. Для less — /resources/assets/less, а для coffee — /resources/assets/coffee. Теперь всё настроено.
Далее вы можете ссылаться на созданные файлы в ваших представлениях и создавать файлы позже для рабочего окружения. На самом деле Elixir предоставляет даже больше возможностей, чем показано в примере.
compiled.php
Любой полнофункциональный фреймворк загружается с тысячей файлов и объявлений. По большей части все они обрабатываются автозагрузкой Composer, но для наиболее используемых файлов Artisan может создать файл compiled.php, который загружается при каждом запросе и объединяет все классы, используемые в вашем приложении.
Наиболее используемые файлы и классы компилируются в один единственный файл, который значительно уменьшает время загрузки приложения. Если у вас есть файлы, которые требуется загружать при каждом запросе, вы также можете указать, какие файлы компилировать в compiled.php.
Затем этот файл оптимизируется исполняющей средой PHP, поэтому вы можете избежать снижения производительности при загрузке тысяч файлов в ваше рабочее окружение.
HHVM
Когда вы захотите повысить производительность вашего PHP-кода, вы можете сменить PHP-окружение на высокооптимизированную среду исполнения для PHP от Facebook — HHVM.
Laravel — один из первых фреймворков, поддерживающих HHVM, и он проходит 100% юнит-тестов на HHVM. Поэтому вы можете быть уверены, что легко можете переключить ваше приложение с PHP на HHVM и получить ещё больше производительности.
Homestead
Laravel Homestead — официальная упакованная Vagrant-"коробка", предоставляющая вам удивительную среду разработки, не требуя установки PHP, HHVM, веб-сервера и любого другого ПО на вашу локальную машину.
Это виртуальная машина с установленным ПО, в которое входят:
— Ubuntu 14.04
— PHP 5.6
— HHVM
— Nginx
— MySQL
— Postgres
— Node (с Bower, Grunt и Gulp)
— Redis
— Memcached
— Beanstalkd
— Laravel Envoy
— Fabric + расширение HipChat
Вы просто запускаете vagrant up, заходите на locahost:8000 и видите ваше запущенное приложение. Ваш код локально «расшарен» для виртуальной машины, и вам вообще не надо устанавливать всё перечисленное ПО, а нужен только Laravel и ваш редактор кода.
Позже, когда вы захотите создать VPS-сервер, вы можете использовать проект Laravel Settler для создания точно такого же сервера, как ваше окружение Homestead.
Это просто восхитительно и экономит так много времени, избавляя вас от муторных настроек локального окружения для разработки.
Промежуточное ПО Stack
Laravel использует реализацию Symfony HttpKernel от StackPHP. Это значит, мы можем добавить наше собственное промежуточное ПО в HTTP-слой!
Промежуточное ПО запрашивает обработчики, с помощью которых вы можете добавить функциональность в HTTP-запросы — до, после и даже изменяя запросы и ответы.
Например, посмотрим на PHPMaintenanceMiddleware
:
<?php namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Response;
use Illuminate\Contracts\Routing\Middleware;
use Illuminate\Contracts\Foundation\Application;
class MaintenanceMiddleware implements Middleware {
/**
* Реализация приложения.
*
* @var Application
*/
protected $app;
/**
* Создание нового экземпляра фильтра.
*
* @param Application $app
* @return void
*/
public function __construct(Application $app)
{
$this->app = $app;
}
/**
* Обработка входящего запроса.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ($this->app->isDownForMaintenance())
{
return new Response('Be right back!', 503);
}
return $next($request);
}
}
Вы видите, что функциональность служебной проверки добавлена в каждый запрос внутри метода PHPhandle
. Видите эту строку PHP$next($request)
? Это то, как запрос передаётся следующему классу промежуточного ПО и в конце самому фреймворку.
Вы можете использовать промежуточное ПО для добавления любой необходимой функциональности в ваш HTTP-слой.
По умолчанию в Laravel есть AuthMiddleware, GuestMiddleware, MaintenanceMiddleware, CsrfMiddleware, и вы легко можете добавить ваше собственное промежуточное ПО или использовать одно из доступных здесь, такое как HttpCache, Geoip, CORS, OAuth, Turbolinks и другое.
Cashier
Laravel Cashier обеспечивает выразительный, гибкий интерфейс для услуг биллинговых подписок Stripe. Он обрабатывает почти все шаблонные коды биллинговых подписок, которые вы боитесь написать.
В дополнение к основному управлению подписками Cashier может обрабатывать купоны, подмену подписок, «количество» подписок, периоды скидок, и даже генерировать PDF-файлы счетов.
Это официальный пакет от разработчиков Laravel, не включённый по умолчанию. Посмотрите, как просто использовать Cashier для подписки пользователя:
$user = User::find(1);
$user->subscription('monthly')->create($creditCardToken);
// с купоном
$user->subscription('monthly')
->withCoupon('code')
->create($creditCardToken);
// конец пробного периода
$user->trial_ends_at = Carbon::now()->addDays(14);
$user->save();
// Отмена
$user->subscription()->cancel();
// Итого
$user->subscription('monthly')->resume($creditCardToken);
// Проверка статуса
if ($user->subscribed())
{
//
}
// На пробном периоде
if ($user->onTrial())
{
//
}
// Отменён
if ($user->cancelled())
{
//
}
// В период скидок
if ($user->onGracePeriod())
{
//
}
// Был когда-либо подписан
if ($user->everSubscribed())
{
//
}
// Проверка на каком тарифе пользователь
if ($user->onPlan('monthly'))
{
//
}
Вы можете использовать счета и много других функций Stripe.
Rocketeer
Rocketeer — быстрый и легко развёртываемый инструмент для современных разработчиков. Он вдохновлён Laravel и может быть использован в Laravel, а также в любом PHP-проекте.
Он может развернуть любой проект от маленького HTML/CSS веб-сайта до большого PHP-приложения, или любое приложение на любом языке программирования.
С помощью Rocketeer вы легко можете разворачивать последнее, текущее или промежуточное окружение и откатываться к старым версиям при необходимости.
После небольшой настройки запустить Rocketeer так же легко, как запустить artisan и одну из этих команд:
deploy
deploy:check Проверка готовности сервера получить приложение
deploy:cleanup Удалить старые версии с сервера
deploy:current Вывести текущую версию
deploy:deploy Развернуть веб-сайт
deploy:flush Очистить кэш полномочий Rocketeer
deploy:ignite Создать конфигурацию Rocketeer
deploy:plugin-config Публиковать конфигурацию плагина
deploy:plugin-install Установить плагин
deploy:plugin-list Просмотр списка текущих включённых плагинов
deploy:rollback Откат к предыдущей версии, или к конкретной
deploy:setup Установить удалённый сервер для развёртывания
deploy:strategies Просмотр списка доступных вариантов для каждой стратегии
deploy:teardown Удалить удалённое приложение и существующий кэш
deploy:test Запустить тесты на сервере и вывести результаты
deploy:update Обновить удалённый сервер не создавая новую версию
Здорово использовать такой надёжный и продуманный процесс развёртывания.
Объединяя PHP
Laravel действительно объединяет PHP-сообщество, используя более 23 пакетов от всего PHP-сообщества. Использование «лучших из лучших» PHP-пакетов способствует более тесному взаимодействию Laravel и всего PHP-сообщества. Среди включённых в Laravel пакетов присутствуют:
Dotenv: PHP-версия оригинального dotenv из Ruby, загружает переменные среды.
Carbon: внушительная библиотека для работы с датами от Брайана Несбита (Brian Nesbitt).
Predis: надёжный Redis-клиент, созданный Даниэлем Алесандри (Daniele Alessandri).
Phenstalk: полнофункциональный PHP-клиент для очереди Beanstalked.
SuperClosure: написанная Джереми Линдблумом (Jeremy Lindblom), эта мощная библиотека позволяет вам сериализовывать и десериализовывать функции-замыкания в PHP.
Whoops: выводит красивые страницы ошибок и трассировки стека пока Laravel в режиме разработки.
Monolog: стандарт де-факто среди PHP-библиотек для ведения логов.
Boris: действительно отличный PHP REPL, который поддерживает восхитительную консольную команду “tinker”.
PasswordCompat: обеспечивает защищённое хеширование Bcrypt, которое используется в Laravel по умолчанию.
Symfony HttpFoundation: абсолютно надёжная HTTP-абстракция. Протестированная и проверенная во многих больших реальных приложениях.
Symfony Routing: этот пакет обеспечивает компиляцию маршрутов Laravel в регулярные выражения.
Symfony HttpKernel: содержит HttpKernelInterface, который используется как абстракция нижнего уровня в приложениях Laravel.
Symfony BrowserKit: отличное функциональное тестирование.
StackPHP: этот проект описывает структуру для построения многоразового независимого от фреймворков промежуточного ПО на уровне HTTP-слоя.
Laracasts — Джефри Вэй (Jeffery Way)
Laracasts — это ресурс не только для Laravel-разработчиков, но и для современных PHP-разработчиков в целом. Он предоставляет более 300 видео для решения любой задачи или реализации практически чего угодно с помощью Laravel.
Почти всё, что упомянуто в этой статье, можно узнать на Laracasts. Это изумительный обучающий ресурс, который создал Джефри Вэй. Джефри Вэй! Из Envato! Джефри Вэй — очень уважаемый участник PHP-сообщества и отличный учитель.
С Laracasts сообщество Laravel действительно выделяется из экосистемы PHP, так как нет ничего подобного для других PHP-фреймворков.
Liferaft
Создание запросов на GitHub — лучший способ сообщить о проблеме и получить решение. Но что вы делаете, когда не можете объяснить свою проблему? Что если вы сталкиваетесь с этой проблемой только в коде вашего приложения?
Liferaft (спасательный плот — прим. пер.) — инструмент с интерфейсом командной строки, устанавливаемый с Composer, который обеспечивает лучший способ содействовать Laravel или сообщать о проблемах.
Вы просто запускаете одну из команд Liferaft, и она создаёт приложение Laravel. И вы просто помещаете свой код, который воспроизводит вашу проблему, и запускаете другую команду Liferaft для создания запроса на Github.
shliferaft new my-bug-fix
И воспроизводите проблему в этом приложении. Единственное, что от вас требуется, это заполнить файл liferaft.md описанием вашей проблемы, и вы можете предоставить юнит-тест, показывающий, как это должно работать. И затем:
shliferaft throw
Тогда разработчик сможет запустить ваше приложение и увидеть вашу проблему. Это решает множество проблем и занимает намного меньше времени у разработчиков фреймворка на ответ и решение вашей проблемы.
Вы можете прочитать больше о Liferaft здесь.
Сообщество
Я упоминаю о сообществе в последнюю очередь, потому что сегодня каждый фреймворк имеет большое и дружное сообщество, и Laravel — не исключение. Люди, поддерживающие и разрабатывающие Laravel-пакеты, очень дружелюбны, и вы легко можете участвовать в создании любого пакета, и ваши правки будут приняты очень скоро.
Это способствует расширению сообщества, и вам стоит знать, что Laravel был внесён в список самых популярных PHP-фреймворков в 2013 году, опередив Phalcon, Symfony2 и CodeIgniter. А в августе 2014 года Laravel стал самым популярным и просматриваемым PHP-проектом на GitHub.
Также я должен упомянуть о laravel.io, которым пользуется множество людей, и где вы можете найти обсуждения, ответы на вопросы, вакансии ( [https://larajobs.com] ) и всё, что вам потребуется.
Заключение
Пользователи Laravel знают, что я могу рассказать намного больше особенных вещей о Laravel, но этого должно быть достаточно. Знайте, что вы всегда можете использовать или участвовать в создании Laravel, или даже использовать отдельные части этого отличного PHP-фреймворка.
Комментарии (7)
а что там с выходом 5й версии фрейма?
Начало/середина февраля.
Сделайте нормальную регистрацию на сайте! пишу коммент — если не зарегистрирован, то коммент идет лесом.
По статье — перевод промтом, очень кривой. Про «целый год» на одной версии — просто смешно. Стабильные ветки везде саппортят 3-5 лет. Упоминание компилятора живо напомнило критическую статью про ангуляр на хабре, когда люди чинят то, что сами сломали. Убили производительность тотальным оверинжинирингом — теперь лепим поверх всевозможные кэши и компиляторы. Ну медленно же! В результате, там где в лоб написанное тянет сотку коннектов, «могучий» фреймворк вешает сервер.
Хочется попробовать фреймворк, но вот после такой «рекламы» от него заранее начинает тошнить.
<img src=x onerror=alert(1)>
Проверяйте, проверяйте.
Очень интересная статья, кстати на эту же тему: https://wezom.com.ua/blog/17-preimuschestv-ispolzovanija-laravel-v-it-industrii