Любите загадки? Событие еще доступно на сайте.
Александр Черняев

С ремеслом дружу

Подготовьтесь к взлёту: Новый раздел для веб-ремеслеников 🚀

Сегодня, в честь Дня Космонавтики, хочу поздравить всех вас, кто работает с Laravel и PHP! Это не только повод для праздника, но и время для вдохновения и новых возможностей.

Не могу не подчеркнуть, насколько важно постоянно развиваться и совершенствовать свои навыки. И именно поэтому рад объявить о запуске нового раздела, который поможет нам всем стать ещё лучше в разработке, особенно в Laravel, независимо от уровня опыта.

Хотите быть среди первых, кто погрузится в этот новый раздел и опередит коллег? Тогда примите участие в игровом событии, переходя по ссылке:

Тяга к знаниям двигает нас к звёздам | Laravel Russian Community

https://laravel.su/vostok

Пусть эта дата вдохновляет нас на новые открытия и смелые шаги в неизведанные просторы Вселенной.

Не забудьте, что нужно набрать как можно больше количество очков для открытия всех секретов этого раздела! Давайте вместе достигнем новых вершин! 🌟

1
Limon96

Если вы видите это, значит, я еще не придумал, что написать.

Подключение к Yandex.Cloud MySQL на Laravel

При развертывании базы данных на серверах Yandex.Cloud может возникнуть проблема с подключением.

Managed Service for MySQL предоставляет два варианта подключения:

  1. Через интернет, если вы настроили публичный доступ для нужного хоста. К таким хостам подключиться можно только используя SSL-соединение.
  2. С виртуальных машин Yandex Cloud, расположенных в той же облачной сети. Если к хосту нет публичного доступа, для подключения с таких виртуальных машин необязательно использовать SSL-соединение.

Документация Yandex.Cloud

Пример подключения:

config/database.php

'mysql' => [
    'driver' => 'mysql',
    'url' => env('DATABASE_URL'),
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'unix_socket' => env('DB_SOCKET', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'prefix_indexes' => true,
    'strict' => true,
    'engine' => null,
    'options' => [
        PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
        PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false,
    ],
],

В options пишем параметры:

 PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
 PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false,

В файле .env добавляем параметр:

MYSQL_ATTR_SSL_CA="./CA.pem"

Где “./CA.pem” – это путь к файлу полученному от Yandex.Cloud:

https://storage.yandexcloud.net/cloud-certs/CA.pem
0

Создание собственных функций помощников

Laravel предоставляет множество удобных вспомогательных глобальных функций, которые облегчают работу с массивами, путями к файлам, строками и маршрутами, а также любимая всеми функция dd().

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

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

Создание файла

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

  • app/helpers.php
  • app/Http/helpers.php

Я предпочитаю хранить мои в app/helpers.php в корне пространства имен приложения.

Автоматическая загрузка

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

require_once ROOT . '/helpers.php';

Сейчас у нас есть гораздо лучшее решение – Composer. Если вы создадите новый проект Laravel, вы увидите ключи autoload и autoload-dev в файле composer.json:

"autoload": {
    "classmap": [
        "database/seeds",
        "database/factories"
    ],
    "psr-4": {
        "App\\": "app/"
    }
},
"autoload-dev": {
    "psr-4": {
        "Tests\\": "tests/"
    }
},

Если вы хотите добавить файл с вспомогательными функциями, Composer предоставляет ключ files (который является массивом путей к файлам), который вы можете определить внутри autoload:

"autoload": {
    "files": [
        "app/helpers.php"
    ],
    "classmap": [
        "database/seeds",
        "database/factories"
    ],
    "psr-4": {
        "App\\": "app/"
    }
},

После добавления нового пути в массив files, вам нужно обновить автозагрузчик:

composer dump-autoload

Теперь файл helpers.php будет загружаться автоматически при каждом запросе, потому что Laravel использует автозагрузчик Composer в public/index.php:

require __DIR__.'/../vendor/autoload.php';

Определение функций

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

if (! function_exists('env')) {
    function env($key, $default = null) {
        // ...
    }
}

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

Пример вспомогательной функции

Мне нравятся функции путей и URL из Rails, которые вы получаете при определении ресурсного маршрута. Например, маршрут photos предоставит функции new_photo_path, edit_photo_path и т. д.

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

create_route($model);
edit_route($model);
show_route($model);
destroy_route($model);

Вот как вы могли бы определить show_route в файле app/helpers.php (остальные будут выглядеть похожим образом):

if (! function_exists('show_route')) {
    function show_route($model, $resource = null)
    {
        $resource = $resource ?? plural_from_model($model);
 
        return route("{$resource}.show", $model);
    }
}
 
if (! function_exists('plural_from_model')) {
    function plural_from_model($model)
    {
        $plural = Str::plural(class_basename($model));
 
        return Str::kebab($plural);
    }
}

Функция plural_from_model() – это просто повторяющия функция которую используют другие функции маршрутов для предсказания имени маршрута на основе kebab-case от множественного числа имени модели.

Например, вот пример имени ресурса, полученный из модели:

$model = new App\LineItem;
plural_from_model($model);
// => line-items
 
plural_from_model(new App\User);
// => users

Используя это соглашение, вы можете определить ресурсный маршрут следующим образом в routes/web.php:

Route::resource('line-items', 'LineItemsController');
Route::resource('users', 'UsersController');

Затем в шаблонах Blade вы могли бы сделать следующее:

<a href="{{ show_route($lineItem) }}">
    {{ $lineItem->name }}
</a>

Что приведет к созданию примерно такого HTML:

<a href="http://localhost/line-items/1">
    Line Item #1
</a>

Пакеты

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

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

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

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

Узнать больше

Ознакомьтесь с документацией по автозагрузке Composer, чтобы узнать больше о включении файлов и общей информации об автозагрузке классов.

0