Тот самый PHP-фреймворк для веб-ремесленников

REST-маршрутизация

Route::get('/', function()
{
  return 'Привет, мир!';
});

Простая работа с данными

Post::with('comments')
  ->where('public', 1)
  ->orderBy('created_at')
  ->get();

Расширенные шаблоны

@foreach ($users as $user)
  <p>{{{ $user->name }}}</p>
  @include('user.info', $user)
@endforeach
Может войдёшь?
Черновики Написать статью Профиль

Статьи

Laravel и ULID

В прошлой статье мы разобрались как в Laravel работать с UUID. Но он не решает всех проблем распределенных систем. Один из новых подходов к генерации уникальных идентификаторов это ULID — Universally Unique Lexicographically Sortable Identifier (универсальный уникальный лексографически сортируемый идентификатор).

Сравнение UUID и ULID

Во многих случаях использование UUID неоптимально:

  • Это не самый эффективный способ кодирования 128-битной случайности
  • UUID v1/v2 непрактичен во многих средах, так как требует доступа к уникальному стабильному MAC-адресу
  • UUID v3/v5 требует уникального начального числа и генерирует случайно распределенные идентификаторы, которые могут вызвать фрагментацию во многих структурах данных
  • UUID v4 не предоставляет никакой другой информации…

Eloquent и Blade: советы по повышению производительности

перевод Eloquent blade

Одна из самых распространенных проблем с производительностью, которую я видел в Laravel - это использование методов Eloquent и отношений из шаблонов Blade, создание ненужных дополнительных циклов и запросов. В этой статье я покажу различные сценарии и способы их эффективного использования.

Сценарий 1. Загрузка отношения belongsTo(): не забудьте про «жадную загрузку»

Типичный случай — вы перебираете записи через @foreach, и, в каком-то столбце, вам нужно показать родительскую запись с определенным полем.

@foreach ($sessions as $session)
<tr>
  <td>{{ $session->created_at }}</td>
  <td>{{ $session->user->name }}</td>
</tr>
@endforeach

И, конечно, Session принадлежит User, в app/Session.php :

public function user()
{
    return $this->belongsTo(User::class)…
SeaSnake

По поводу collection vs array, например — https://www.reddit.com/r/laravel/comments/44a2p2/laravel_collection_vs_array_performance/

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

По поводу вьюх и моделей мое мнение, что слой БД отдельно, слой представлений отдельно — не должны вьюхи обращаться с БД. Если уж никак не позволяет ситуация разрешить создание данных в контроллере, то значит нужен какой-то компонент (сервис) для вьюх. Но лучше решать это на уровне контроллера, сервисов. В некоторых случаях можно наверное для удобства сделать модели данных (не Eloquent). Вобщем ситуации бывают разные, но вьюха к бд не обращается — неправильная архитектура.

Да и в целом, многие понимают паттерн MVC слишком буквально как по мне. Холивары «тонкий контроллер-толстая модель» и наоборот гремят с неослабевающей силой. Но как по мне, тонкими должны быть оба — single responsibility. А контроллер распределяет логику между сервисами (компонентами), ивентами и пр. частями приложения и отдает уже полученные от них данные в виде переменных во вьюху. Напрямую контроллер у меня не часто «знает» про модель.

Что касается «жадных загрузок», вьюх, Eloquent — вообще если данные будут использоваться в цикле (не только вьюха), то конечно только «жадная». Миллион не миллион, но даже например 500 обращений к БД в цикле — уже караул какой-то (а 500 ведь не предел). Но это понимание наверное придет с практикой, некоторые например запихивают какой-то select в цикл, вместо того чтоб выбрать нужные данные перед циклом и потом копаться уже в массиве или коллекции. Хотя ситуации бывают разные как говорится =)

Создаем сайт на Lumen (Laravel) - Установка

Lumen Установка

Веб-программирования для меня - это хобби. Поэтому я могу переключиться на что-то другое и не заниматься web-разработкой в течении длительного времени. Когда я возвращаюсь к этому, то некоторые моменты приходится вспоминать заново. Эта статья - это инструкция для меня, а также, надеюсь помощь кому-то из вас.

У меня несколько сайтов и в очередной раз я решил обновить их. В качестве основы выбрал Lumen. Это PHP-микрофреймворк написанный на основе компонентов Laravel его автором. Он достаточно простой и шустрый, как раз то, что мне нужно.

Установка Open Server

Локальную версию сайта я запускаю на Open Server, использую версию 5.2.9…

Fauther

Если честно, очень мало статьей по настройки на том же докере, своем виртуальном сервере.
В боевых практиках это больше пригодится, чем «опен-сервер».

Знакомимся с Laravel Orchid

laravel5 orchid

Для нашего любимого фреймворка существует с десяток различных админок и ещё больше генераторов, выбор может показаться настолько запутанным, что некоторые пишут исключительно свои решения. Я не работал со всеми и не могу утверждать, что какие то лучше/хуже, но могу рассказать об ORCHID и как с ней работать ~ за 10 минут.

Всегда начинайте с данных

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

Создадим новую модель "Проекты":

php artisan make:model Project -m

Используя флаг -m, будет создан…

Arams

в файле ProjectListScreen вместо

// use Orchid\Screen\Input;
// use Orchid\Screen\Layouts;
// use Orchid\Screen\Screen;

нужно использовать

use Orchid\Screen\Fields\Input;
use Orchid\Screen\Layouts;
use Orchid\Screen\Screen;

а в функции layout вместо

 InputField::make('project.name')
   ->type('text')
   ->title('Название проекта')

вот это

Input::make('project.name')
   ->type('text')
   ->title('Название проекта')

в рутах вместо

$this->screen('projects', ProjectListScreen::class)->name('platform.projects');

нужно использовать

$this->router->screen('projects', ProjectListScreen::class)->name('platform.projects');

Сайт на Laravel. Nginx + Apache

laravel request_uri nginx

Решил поделиться, т.к. настройка nginx зачастую съедает кучу нервов и времени, может кому-нибудь поможет.

Итак, ситуация: Есть сайт на laravel, разработанный, работающий. Но под управлением только apache, разработчики привычно копипастят в .htaccess сие

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} !(/$|\.)
    RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>

и всё тип-топ.

До тех пор пока не возникает задача…

nailfor

Мысль у меня возникает только одна «Дядя Вова, ты..?»
В смысле нафига? И доколе? php-fpm, не?

Выполняем тестовое задание (Мини блог) — Часть 4

laravel 5 Тестовое задание

Всем привет, кто читает мою статью.
Продолжаем выполнение тестового задания. Выполним пункт 3-5.

3) Добавить возможность удалять статьи в мягком режиме
. При этом сделать возможность обновить систему со старой версии (из первого задания) на новую без полного сброса БД.
Для возможности удаление статей в мягком режиме из таблицы «articles» создадим миграцию :

  1. php artisan make:migration ChangeArticleSoftTable --table=articles

В созданной миграции в методе up() опишем softDeletes.

seqond
PHP
public function isAuthor(User $user)
{
        return 
$this->users->contains($user);
}

Так еще проще.

Выполняем тестовое задание (Мини блог) — Часть 3

laravel 5 Тестовое задание

Всем привет, кто читает мою статью.
Продолжаем выполнение тестового задания. Выполним пункт 2.

— Расширить модель User, чтобы она имела поля, соответствующие форме index.html.
Создаем миграцию, в которой вносим изменения в таблицу «users» необходимые для расширения модели User:

  1. php artisan make:migration ChangeUserTable --table=users

В созданной миграции в методе up() опишем создаваемые поля:

PHP
class 
seqond

Зачем использовать множественные get / post маршруты для profile если можно использовать 1 запись resource?

Route::resource('profile', 'UserController')

Выполняем тестовое задание (Мини блог) — Часть 2

laravel 5 Тестовое задание

Всем привет, кто читает мою статью.
Создадим проект, начальную базу для дальнейшей работы. Используемые программные средства:
• IDE — Sublime Text.
• Laragon Wamp 4.0.
• Git.
• Laravel 5.5.
• Bootstrap 4.

Используемые дополнительные библиотеки:
laravelcollective/html — v 5.4.
intervention/image — v 2.4.
stechstudio/laravel-php-cs-fixer — v 1.0.

yiimar

Зачастую в качестве primary key для связующей таблицы для связи many-many лучше использовать составной ключ (user_id, article_id), без id.

Выполняем тестовое задание (Мини блог) — Часть 1

Laravel 5.х Тестовое задание

Всем привет, кто читает мою статью.
Очень много можно философствовать с чего начать изучение Laravel. Без теории никуда, но и практика нужна. Начнем с малого. Разработаем маленький тестовый проект.
Путешествуя по просторам интернета, я наткнулся на «Тестовое задание по Laravel», спасибо worldofswift. Ссылка на Git.
Задание:
1) Дано:
· Модель User без кастомных полей.
· Модель Article с полем text.
· Относятся как многие ко многим.
· Написать свойство articles в первой модели, которое вернёт все статьи…

Локализация роутера под SEO

route seo

В этой статье я расскажу о том, как сделать копию сайта на втором языке по отдельному пути, используя существующий сайт, встроенную локализацию и маршруты.

Дано: после почти полной готовности проекта на Laravel, заказчик хочет, чтобы локализация была реализована не просто переключением языка и отображением нужной версии сайта в соответствии с тем, что указано в сессии. Нужно было реализовать два сайта: русская и английская версия — которые лежали бы по разным путям. Для SЕО-продвижения не должно быть двух разных страниц по одному URL. И индексироваться русская и английская версия сайта должны отдельно…

WarLight

Отличное дополнение) Хотя реализация чуть другая)

Жаль вовремя не нашлись нужные библиотеки.

← Назад | ДальшеДвижется на Habravel