Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Я использую OpenServer, потому для каждого проекта у меня настроен свой виртульный хостинг типа http://exmaple.dev/. Только что настроил Live Reload с помощью Browser Sync:
gulp.task('Watch Laravel project by Browsersync', () => {
browserSync.init({
proxy: 'http://exmaple.dev/',
watch: true
});
browserSync.watch(PROJECT_FILE_SYSTEM.LARAVEL_FILES_SELECTION_WILL_BE_WATCHED).on('change', browserSync.reload);
});
Теперь автоматическая перезагрузка доступна по адресу http://localhost:3000/. Если вывести URL типа
URL::current()
, то будет, естественно, //localhost:3000, а не http://exmaple.dev/. Вопрос такой: возможно ли какое-нибудь отрицательное влияние всвязи с этим? Вроде как Laravel прекрасно анализирует роуты и преобразует пути к абсолютным, но всё же.
При выполнении приведённого ниже SQL-запроса из Eloquent-модели компьютер зависает, потому что сервер Apache забирает все системные ресурсы. То есть эффект такой же, как и при запуске бесконечного цикла.
class PageVisit extends Model {
public static function getFirstDataBaseRecordByIpAddress() {
return self::where('IP_Address', '123.4.5.6');
}
}
Соединение с базой данных есть — всё нормально. Причём сначала всё работало, а потому при непонятных условиях перестало работать.
Впервые имею дело с юнит-тестами; основную документацию уже прочитал, тем не менее пока не понятно как сделать какие-то элементарные вещи. В этом простом с точки зрения логики тесте я бы хотел проверить, записались ли значения utm-параметров в соответствующие поля класса.
class TopPageController extends Controller {
public function render(): void {
$this->utm_source = request()->utm_source;
$this->utm_term = request()->utm_term;
}
}
class ExampleTest extends TestCase {
public function exampleTest() {
$response = $this->get('/?utm_source=google&utm_term=keyword1%20keyword2');
$this->assertTrue(/* В TopPageController->render() все значения переменных не пустые? */);
}
}
С точки зрения PHP это нереалезуемо: в общем случае поля $this->utm_source и $this->utm_term не обязаны быть открытыми, потому в методе exampleTest() доступа к ним быть не должно. Тем не менее, эта проблема должна быть как-то решена в юнит-тестировании.
Благодарю Вас за ответ!
Я, должно быть, не совсем к месту применил слово "конфигурация". Правильнее было бы сказать не "конфигурация", а "статические строковые данные", такие как имена полей ввода в HTML-формах, имена таблиц и их колонок в базах данных и так далее. Смысл этого всего в том, чтобы избежать хардкодинга и чтобы изменение этих значений было быстрым и безболезненным. Вообще вопрос о том, как лучше организовать хранение этих данных, я вынес в отдельную тему, здесь же мы обсуждаем, будет ли проигрыш в производительности, если эти строковые данные хранить не в PHP-классах, как это организовано в конфигурации Laravel, а в удобных для человека файлах JSON, JSON5 и YAML.
Я уделяю много внимания слежению за отсутствием хардкодинга и выношу статические данные (имена таблиц и их полей базы данных, имена полей ввода в html-формах, имена маршрутов и т. д.) в отдельные файлы. Хотел бы улучшить качество организации этих файлов и качество их написания. Что Вы можете порекомендовать почитать по данной теме?
Вижу, Laravel использует php-файлы для конфигурации (папка config). Но я бы хотел использовать более простой синтаксис для собственных конфигураций, и в первую очередь это JSON5. Какой проигрыш в производительности будет из-за чтения внешнего не-php файла и парсинга JSON?
Известно, что запросы к БД можно делать через Eloquent-модель (всё реализовано в родительских классах). Но я бы хотел вынести все SQL-запросы из контроллера в модель, то есть делать запросы из самой Eloquent-модели, а в контроллер возвращать лишь готовые выборки данных по определённым параметрам.
На данный момент я думаю сделать запросы через фасад DB. Как ещё можно сделать запросы к БД из Eloquent-модели?
Благодарю Вас за ответ! Значит, модели не следует хранить внутри HTTP, правильно?
К созжалению, из названия папки Http в директории app неочевидно, зачем она нужна. Известно только то, что по умолчанию там хранятся контроллеры, посредники и kernel.php. Хотел бы это узнать истинное назначение папки Http для дальнейшей организации файлов проекта.
Посмотрел новую документацию на Laravel и удивился: требуют чуть ли не самую новую версию PHP — PHP >= 7.1.3. А… как вообще обстоит дело с поддерживаемостью этой версии PHP на современных хостингах? Или это имеет значение только на стадии разработки? (хотя спрашивая, понимаю, что едва ли). Можно ли теперь продолжать делать сайты на свежей версии Laravel или он просто не будет работать ни на каких хостингах?
У меня в контроллере стало слишком много SQL-запросов. В смысле, самих запросов-то не так много, но они довольно длинные. Думаю о том, куда бы их лучше вынести из контроллера. Может, создать модель главной страницы и вынести туда?
Только убедительная просьба - не отвечайте абстрактно типа "это можно сделать самыми разными способами, всех и не перечесть". Пожалуйста, предложите конкретное решение, которое Вы считаете лучшим.
Когда я увидел приведённый ниже пример, то подумал, что в качестве параметра URL AJAX-запроса можно передавать выражения в двойных фигурных скобках, какие используются в blade-шаблонах:
$.ajax({ type: "POST", url : "{{ url('/api/login') }}", contentType: 'application/json', dataType: 'json', data: JSON.stringify({ user : user, passwd : passwd }) : });
Я подумал, что раз laravel понимает {{ url() }}, то поймёт и {{ route() }}, и сделал такой запрос:
{{ route("admin.GetFragmentViaAjax", ["fragment" => "statistic_top"]) }}
GET http://example.loc/%7B%7B 404 (Not Found)
Я думаю, с приведённым в начале вопроса примера какое-то недоразумение.
Предлагаю Вам работу на следующих условиях:
Предлагаю Вам работу на следующих условиях:
Метод с длинным, но однозначным названием abortRequestIfAnotherOneWithSameIdExistsInDatabase() должен прервать выполнение скрипта, если в БД будет зайдена запись с таким же ID визита сайта (то есть два запроса подряд за один визит сайта не позволено). return redirect() к прерыванию не приводит, и все методы после abortRequestIfAnotherOneWithSameIdExistsInDatabase() выполняются, чего быть не должно. Естественно, я не могу вставить exit; после return, так как всё, что после return, не будет выполнено.
Что можно сделать в качестве альтернативы?
<?php
public function submitConsultationRequest(){
$this -> abortRequestIfAnotherOneWithSameIdExistsInDatabase();
// другие методы
}
private function abortRequestIfAnotherOneWithSameIdExistsInDatabase(){
$queryResult = DB::table('requests') ->
where( 'visitId' => request() -> session() -> get('visitId'),
]) -> first();
if (!is_null($queryResult)) {
return redirect() -> route('top');
}
}
Редирект-то сделать можно, и я его делаю после успешной отправки сообщения, но нам нужно предотвратить то, чтобы кто-то, введя в поисковую строку соответствующий URL, попал на страницу благодарности — это может быть ошибочный засчёт конверсии.
И, кстати, я забыл добавить небольшой кусок кода в конец сообщения. Исправил это.
Прошу прощения за заголовок — не хватило символов.
Как пропустить на страницу «Спасибо за заявку» только тех, кто заполнил и успешно отправил форму обратной связи?
Мои маршруты (актуальные в данном вопросе):
// Отправка заявки
Route::post('/submit-request', [
'as' => 'submitConsultationRequest',
'uses' => 'Open\FeedbackController@submitConsultationRequest'
]);
// Страинца благодарности
Route::get('/thanks', [
'as' => 'thanksForConsultationRequest',
'uses' => 'MainController@renderThanksForConsultationRequestPage'
]);
Если сделать это таким образом, как приведено ниже, то URL::previous() будет являться не post-запрос отправки сообщения (thanksForConsultationRequest), а URL той страницы, с которой произошла отправка сообщения.
if (URL::previous() !== URL::route('submitConsultationRequest')) {
return redirect() -> back();
}
В одном из ответов на другой свой вопрос я узнал, что в версии Laravel, начиная с 5.5, драйвер mail больше недоступен. В попробовал рекомендуемые настройки (приведены ниже, но на этот раз другая ошибка:
stream_socket_enable_crypto() SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed
MAIL_DRIVER=smtp MAIL_HOST=smtp.gmail.com MAIL_PORT=587 MAIL_USERNAME=myemail@gmail.com MAIL_PASSWORD=somePassword1234 MAIL_ENCRYPTION=tls
Не знаю, влияет это или нет, но в Open Server я сделал такие же настройки.
С шифрованием SSL тоже не работает.
На StackOverflow порекомендовали такое решение (добавить в файл config/mail.php)’:
'stream' => [ 'ssl' => [ 'allow_self_signed' => true, 'verify_peer' => false, 'verify_peer_name' => false, ], ]
С шифрованием TLS попытка отправки происходит, но выдаёт ошибку
Expected response code 250 but got code "535", with message "535-5.7.8 Username and Password not accepted.
С шифрованием ssl ошибка будет:
Expected response code 220 but got code "", with message ""
Получил email от Google. Google считает, что кто-то пытается использовать мой пароль. Впрочем, оно и понятно: если бы не было такой защиты, то тот, кро выкрал пароль, получит возможность делать рассылку спама с моего адреса. Но как-то же надо протестировать функцию отправки электронной почты, перед тем, как выкладывать сайт на сервер…