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


Привествую друзья, коллеги, случаянно забредшие сюда читатели!

Сегодня расскажу про мой опыт работы с php фреймворками, как я выбирал самый удобный, производительный и поддерживаемый php фреймворк. Вы узнаете особенности фреймворков, так сказать от первого лица. И получите мои рекомендации по выбору

Поехали!




Давным давно, когда создание однотиповых решений мне надоело, захотелось делать что-то уникальное, вроде instagram, trello, mindmup.

Подобные веб приложения не напишешь на wordpress или modx, здесь нужна невероятная гибкость движка в соотношении удобство разработки/результат, и я начал выбирать php фреймворк.



Первым мой выбор пал на

Фреймворк Phalcon

block

Этот фреймворк написан на С++ и устанавливается как дополнение к php, в конфигурации языка надо прописать

extension=php_phalcon.dll

и соответственно скачать и установить сам php_phalcon.dll

Phalcon самый быстрый из всех php фреймворков, вот прям самый

block

Так как он написан на С++, он занимает минимум оперативной памяти, имеет очень большую скорость выполнения, и вообще показывает себя лучше всех

Но, у этого фреймворка минимальный набор функционала, из коробки почти ничего нет

Подходит он в большей степени для ультра сложных и нагруженных приложений, которые должны иметь класс highload



В оринтеровке на скорость, второй на очереди был

Фреймворк CodeIgniter

block

Второй по скорости фреймворк после Phalcon. Такой-же спартанский набор основных функций

Фреймворк как фреймворк, максимально минималистичный, разрабатывать вы на нем можете очень долго, но результат вас порадует своей скоростью.

Иду дальше, так как не увидел удобства разработки, и модулей из коробки, а также везде твердят что у этого фреймворка проблема с безопасностью, и мол сколько версий выходило, все никак не могут залатать дыры



Фреймворк Yii2

block

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

Но походу работы, вот что-то не клеится, постоянно возникают очень странные проблемы, о которых в документации не слова а на форумах сотни вопросов.

Фреймворк конечно быстрый для старта, но костылей вы на нем соберете немерено, взять хотя бы его негибкую систему роутинга, и вшитый в ядро jQuery

Вот таким страшным образом выглядит конфиг yii2

$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'extensions' => require __DIR__ . '/../vendor/yiisoft/extensions.php',
'components' => [
'cache' => [
'class' => 'yii\caching\FileCache',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
],
'log' => [
'class' => 'yii\log\Dispatcher',
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
],
],
],
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=stay2',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
],
],
];



В поисках своего идеала, я наткнулся на

Фреймворк Laravel

block

Попробовал, все как обычно, установил, запустил, полез в код параллельно подглядывая в довольно неплохую документацию



Я - Хм, а как сделать авторизацию?

Документация - попробуй в консоли написать:

php artisan make:auth

Я - И все, серьезно?

Документация - Да, ты отлично выглядишь)

Я - Ты тоже, спасибо



Действительно, в Laravel оказалось все довольно просто, та же туча готовых модулей как у yii2, только все они работают как надо, и да, очень приятный код, действительно, вот пример основного конфига Laravel 5 "config/app.php"

<?php

return [

/*
|--------------------------------------------------------------------------
| Application Name
|--------------------------------------------------------------------------
|
| This value is the name of your application. This value is used when the
| framework needs to place the application's name in a notification or
| any other location as required by the application or its packages.
|
*/

'name' => env('APP_NAME', 'Laravel'),

/*
|--------------------------------------------------------------------------
| Application Environment
|--------------------------------------------------------------------------
|
| This value determines the "environment" your application is currently
| running in. This may determine how you prefer to configure various
| services the application utilizes. Set this in your ".env" file.
|
*/

'env' => env('APP_ENV', 'production'),

/*
|--------------------------------------------------------------------------
| Application Debug Mode
|--------------------------------------------------------------------------
|
| When your application is in debug mode, detailed error messages with
| stack traces will be shown on every error that occurs within your
| application. If disabled, a simple generic error page is shown.
|
*/

'debug' => env('APP_DEBUG', false),

/*
|--------------------------------------------------------------------------
| Application URL
|--------------------------------------------------------------------------
|
| This URL is used by the console to properly generate URLs when using
| the Artisan command line tool. You should set this to the root of
| your application so that it is used when running Artisan tasks.
|
*/

'url' => env('APP_URL', 'http://localhost'),

/*
|--------------------------------------------------------------------------
| Application Timezone
|--------------------------------------------------------------------------
|
| Here you may specify the default timezone for your application, which
| will be used by the PHP date and date-time functions. We have gone
| ahead and set this to a sensible default for you out of the box.
|
*/

'timezone' => 'UTC',

/*
|--------------------------------------------------------------------------
| Application Locale Configuration
|--------------------------------------------------------------------------
|
| The application locale determines the default locale that will be used
| by the translation service provider. You are free to set this value
| to any of the locales which will be supported by the application.
|
*/

'locale' => 'en',

/*
|--------------------------------------------------------------------------
| Application Fallback Locale
|--------------------------------------------------------------------------
|
| The fallback locale determines the locale to use when the current one
| is not available. You may change the value to correspond to any of
| the language folders that are provided through your application.
|
*/

'fallback_locale' => 'en',

/*
|--------------------------------------------------------------------------
| Encryption Key
|--------------------------------------------------------------------------
|
| This key is used by the Illuminate encrypter service and should be set
| to a random, 32 character string, otherwise these encrypted strings
| will not be safe. Please do this before deploying an application!
|
*/

'key' => env('APP_KEY'),

'cipher' => 'AES-256-CBC',

/*
|--------------------------------------------------------------------------
| Autoloaded Service Providers
|--------------------------------------------------------------------------
|
| The service providers listed here will be automatically loaded on the
| request to your application. Feel free to add your own services to
| this array to grant expanded functionality to your applications.
|
*/

'providers' => [

/*
* Laravel Framework Service Providers...
*/
Illuminate\Auth\AuthServiceProvider::class,
Illuminate\Broadcasting\BroadcastServiceProvider::class,
Illuminate\Bus\BusServiceProvider::class,
Illuminate\Cache\CacheServiceProvider::class,
Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
Illuminate\Cookie\CookieServiceProvider::class,
Illuminate\Database\DatabaseServiceProvider::class,
Illuminate\Encryption\EncryptionServiceProvider::class,
Illuminate\Filesystem\FilesystemServiceProvider::class,
Illuminate\Foundation\Providers\FoundationServiceProvider::class,
Illuminate\Hashing\HashServiceProvider::class,
Illuminate\Mail\MailServiceProvider::class,
Illuminate\Notifications\NotificationServiceProvider::class,
Illuminate\Pagination\PaginationServiceProvider::class,
Illuminate\Pipeline\PipelineServiceProvider::class,
Illuminate\Queue\QueueServiceProvider::class,
Illuminate\Redis\RedisServiceProvider::class,
Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
Illuminate\Session\SessionServiceProvider::class,
Illuminate\Translation\TranslationServiceProvider::class,
Illuminate\Validation\ValidationServiceProvider::class,
Illuminate\View\ViewServiceProvider::class,

/*
* Package Service Providers...
*/

/*
* Application Service Providers...
*/
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,

],

/*
|--------------------------------------------------------------------------
| Class Aliases
|--------------------------------------------------------------------------
|
| This array of class aliases will be registered when this application
| is started. However, feel free to register as many as you wish as
| the aliases are "lazy" loaded so they don't hinder performance.
|
*/

'aliases' => [

'App' => Illuminate\Support\Facades\App::class,
'Artisan' => Illuminate\Support\Facades\Artisan::class,
'Auth' => Illuminate\Support\Facades\Auth::class,
'Blade' => Illuminate\Support\Facades\Blade::class,
'Broadcast' => Illuminate\Support\Facades\Broadcast::class,
'Bus' => Illuminate\Support\Facades\Bus::class,
'Cache' => Illuminate\Support\Facades\Cache::class,
'Config' => Illuminate\Support\Facades\Config::class,
'Cookie' => Illuminate\Support\Facades\Cookie::class,
'Crypt' => Illuminate\Support\Facades\Crypt::class,
'DB' => Illuminate\Support\Facades\DB::class,
'Eloquent' => Illuminate\Database\Eloquent\Model::class,
'Event' => Illuminate\Support\Facades\Event::class,
'File' => Illuminate\Support\Facades\File::class,
'Gate' => Illuminate\Support\Facades\Gate::class,
'Hash' => Illuminate\Support\Facades\Hash::class,
'Lang' => Illuminate\Support\Facades\Lang::class,
'Log' => Illuminate\Support\Facades\Log::class,
'Mail' => Illuminate\Support\Facades\Mail::class,
'Notification' => Illuminate\Support\Facades\Notification::class,
'Password' => Illuminate\Support\Facades\Password::class,
'Queue' => Illuminate\Support\Facades\Queue::class,
'Redirect' => Illuminate\Support\Facades\Redirect::class,
'Redis' => Illuminate\Support\Facades\Redis::class,
'Request' => Illuminate\Support\Facades\Request::class,
'Response' => Illuminate\Support\Facades\Response::class,
'Route' => Illuminate\Support\Facades\Route::class,
'Schema' => Illuminate\Support\Facades\Schema::class,
'Session' => Illuminate\Support\Facades\Session::class,
'Storage' => Illuminate\Support\Facades\Storage::class,
'URL' => Illuminate\Support\Facades\URL::class,
'Validator' => Illuminate\Support\Facades\Validator::class,
'View' => Illuminate\Support\Facades\View::class,

],

];

Радует глаз, не правда ли?


Для удобства, в laravel есть консоль artisan, через нее вы можете полностью работать с приложением, создавать миграции, модели, контроллеры, ресурсные контроллеры, и тд, все что надо для работы.

Также вам на помошь приходит шаблонизатор Blade который очень упрощает воспринимаемость php кода а также, laravel прекрасно работает в связке с Vue.js что дает возможность быстро разворачивать грамотные SPA приложения

И главное, никаких проблем, как в документации сказано, так все и работает, и это относится ко всем плагинам Laravel





Заключение

И так, мой выбор остановился на Laravel, на данный момент это самый развитый php фреймворк, хотя и не самый производительный, выбрав этот вариант, вы отгородите себя от ночей проведенных за поиском ошибки которая на самом деле кроется в некачественном коде самого ядра

Выбирайте Yii2 если, вам надо очень быстро запустить проект, хорошая документация и много модулей из коробки делают фреймворк хорошим в плане скорости разработки, но при разрастании приложения код на Yii2 становится тяжело воспринимать и поддерживать

Для сайтов класса highload, глобальных серсивов, соц-сетей, междуранодных приложений лучше всего подойдет Phalcon, он позволяет вам создавать собственную структуру каталогов, имеет базовые функции для разработки, и потребляет минимальное количество ресурсов сервера, но из коробки его функционал минимален





Кстати, у Laravel есть собрат, микро-фреймворк для разработки rest-api - Lumen

block

Если вы знаете Laravel, то вы знаете и Lumen, приятный бонус)