Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Добрый день.
Пытаюсь написать парсер, который берет данные со стороннего сайта.
Вот мой код:
public function index()
{
$context = stream_context_create(
array(
"http" => array(
"max_redirects" => 101,
"header" => "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"
)
)
);
$link = '[url]https://url.com[/url]';
// Get html remote text.
$html = file_get_contents($link, false, $context);
dd($html);
}
Код рабочий. Но на одном из сайтов постоянно выдаёт ошибку (в примере, в целях безопасности, указан не реальный url):
ErrorException (E_WARNING)
file_get_contents(https://url.com): failed to open stream: Redirection limit reached, aborting
Также пробовал вариант с follow_location
public function index()
{
$context = stream_context_create(
array(
"http" => array(
"max_redirects" => 101,
"header" => "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36",
'follow_location' => false
)
)
);
$link = '[url]https://url.com[/url]';
// Get html remote text.
$html = file_get_contents($link, false, $context);
dd($html);
}
Выдаёт следующее сообщение:
"""
<HTML><HEAD><TITLE>Loading</TITLE></HEAD><BODY bgcolor="#ffffff"><H3 style="color: #ffffff">Loading</H3></BODY></HTML>
"""
Через браузер страница открывается. Пробовал запускать как локально, так и с сервера. Результат один и тот же.
Подозреваю, что стоит какая-то защита на сайте, т.к. другие сайты парсятся нормально.
Вся надежда на вас, подскажите как решить данную проблему. Заранее спасибо.
Добрый день.
Попробуйте так
axios.post(`/generatesms`, {phone: phone})
.then(response => {
if (response.data.success == 'true') {
document.querySelector('#enterPhone').innerHTML = phone;
navigationEnterMenu(target); //успех
next_sms_time = response.data.data.timer;
enterTimer();
} else {
document.querySelector('#madalEnterPhone').classList.remove('js-modal-enter-content-open');
document.querySelector('.modal-enter-form-phone-text').innerHTML = phone + '<br>Не зарегистрирован!';
document.querySelector('#errorEnter').classList.add('js-modal-enter-content-open');
}
}).catch(error => {
error.response.data.errors;
console.log(error.response.data.errors)
});
Ошибку выдает сервер
Версия: Laravel 8
ОС: Centos 7 (админ панель http://centos-webpanel.com/)
PHP Version 7.4.11
Установил рабочий проект Laravel со стандартными настройками Apache. Когда запускаю метод POST, PUT или DELETE, то выдает ошибку 403. На локальном сервере всё работает.
Подскажите, пож-та, какие есть идеи?
Добрый вечер.
Хорошая практика обновлять версии laravel спустя 1-2 месяца после релиза. Сейчас уже смело можно будет переходить на 8-ку. Лучше сильно не затягивать, т.к. перепрыгивать через версии проблематичней, чем если переходить постепенно.
Кроме новых плюшек новая версия обновляет мин версию php, что существенно увеличивает скорость работы.
Доброго времени суток.
Сейчас разрабатываю api для получения платежей с помощью PayPal.
В гугле много вариантов, но половина либо устаревшая либо не работает на Laravel 8.
Подскажите, пож-та, те кто сталкивался с такой задачей на новых версиях, проверенный пакет для установки на Laravel 8.
Заранее спасибо.
Вопрос закрыт.
Я заменил ShouldBroadcast на ShouldBroadcastNow в событии
<?php
namespace App\Events;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class Notifications implements ShouldBroadcastNow
{
use Dispatchable, InteractsWithSockets, SerializesModels;
/**
* Create a new event instance.
*
* @return void
*/
public $data;
public function __construct($data)
{
$this->data = $data;
}
public function broadcastOn()
{
return ['mi-sbs-notification'];
}
public function broadcastAs()
{
return 'event-pusher';
}
}
После этого всё заработало
Спасибо за ответ.
Я бы дважды проверил .env на продакшене
Я уже 3-ё суток его перепроверяю)))
Пробовал разные комбинации.
Также в файле app/config/broadcasting.php прописывал ключи вручную - не помогло.
Запускал на локалке и сервере команды
$ php artisan tinker
config('broadcasting');
Результаты идентичны
Также заметил особенность. Если на локалке в файле .env указать не верный ключ, то при вызове события выдаёт исключение
Illuminate\Broadcasting\BroadcastException: Pusher error: 400. in file D:\xammp\htdocs\step-by-step.loc\vendor\laravel\framework\src\Illuminate\Broadcasting\Broadcasters\PusherBroadcaster.php on line 121
Если тоже самое сделать на продакшене, то ошибок не выдаёт. Такое ощущение, что на продакшене вообще игнорируется файл app/config/broadcasting.php и сразу все сообщения пишет в log файл.
Кроме того, сделал бы php artisan config:clear и php artisan cache:clear
Запускал и не раз))) Также чистил всё что только можно очистить с помощью команд
php artisan optimize&&php artisan cache:clear&&php artisan route:cache&&php artisan view:clear&&php artisan config:cache&&php artisan config:clear
Help me please!!!
Ещё заметил, что время указанное в логах на продакшене на 2 часа меньше, чем серверное. Даже пробовал менять время на сервере - время в логах всё равно на 2 часа меняется в меньшую сторону
Версия Laravel - 8.1.0
Локальный сервер:
OC Windows
XAMMP 7.4.8
PHP 7.4.8
Рабочий сервер
ОС Linux Centos 7
PHP 7.4.8
Добрый вечер.
Настроил отправку push уведомлений по данной инструкции https://www.tutofox.com/laravel/laravel … ts-pusher/
.env
BROADCAST_DRIVER=pusher
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
PUSHER_APP_ID=code
PUSHER_APP_KEY=code
PUSHER_APP_SECRET=code
PUSHER_APP_CLUSTER=eu
app/config/broadcasting.php
'default' => env('BROADCAST_DRIVER', 'null'),
'pusher' => [
'driver' => 'pusher',
'key' => env('PUSHER_APP_KEY'),
'secret' => env('PUSHER_APP_SECRET'),
'app_id' => env('PUSHER_APP_ID'),
'options' => [
'cluster' => 'eu',
'useTLS' => true
],
],
app/Events/Notifications.php
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class Notifications implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
/**
* Create a new event instance.
*
* @return void
*/
public $data;
public function __construct($data)
{
$this->data = $data;
}
public function broadcastOn()
{
return ['mi-sbs-notification'];
}
public function broadcastAs()
{
return 'event-pusher';
}
}
Команда вызывающая событие
event(new Notifications($message));
На локальном сервере всё отрабатывает нормально, а вот на продакшене все сообщения записываются в лог файлы
[2020-09-14 14:53:58] local.INFO: Broadcasting [event-pusher] on channels [mi-sbs-notification] with payload:
{
"data": {
текст сообщения
},
"socket": null
}
Google и Яндекс уже перерыл. Помогите, пож-та, разобраться
Спасибо.
Больше интересует, процедура формирования и отправки SMS
Добрый день.
Версия Laravel: 8
Задача.
Необходимо сделать авторизацию пользователя через SMS
Суть проблемы.
При регистрации, пользователь заносит в БД свой номер телефона.
В момент авторизации пользователь вводит номер телефона. После этого ему приходит SMS уведомление с числовым кодом. Он должен ввести данный код в нужное поле. Если код правильный, то пользователь становиться авторизованным, если нет, то выводится ошибка.
Подскажите, пож-та, как лучше всего сделать данный функционал. Заранее спасибо
Всем привет.
Для валидации обычно использую файлы Request.
Но столкнулся со следующим видом валидации, который не знаю как описать в файле Request
$validator = Validator::make($request->all(), [
'slug' => [
'required',
Rule::unique(Article::class)->ignore($id),
],
]);
if ($validator->fails()) {
return redirect()->back()
->withErrors($validator)
->withInput();
}
Суть валидации следующая, проверить уникальность значения в БД, игнорируя запись с определенным id.
Та же история.
Уже приспособился, после каждого изменения маршрута запускаю
php artisan optimize
После этого всё работает
Добрый день.
Версия Laravel: 7.14.1
Задача.
Необходимо текст HTML из поля формы сохранить в БД в виде json строки.
Пример html:
<h2>Это заголовок</h2>
<p>Это первый параграф</p>
<p> </p>
<p> </p>
<p> </p>
<blockquote>
<p>это цитата</p>
</blockquote>
<p>Это второй параграф</p>
<hr>
<p>Это третий параграф</p>
<p> </p>
<pre>
<code class="language-plaintext">
Какой-то ещё тег
</code>
</pre>
<p> </p>
Что должно получиться:
[
{
type:h2
value:Это заголовок
},
{
type:p
value:Это первый параграф
},
{
type:p
value:
},
{
type:p
value:
},
{
type:p
value:
},
{
type:blockquote
{
type:p
value:это цитата;
},
},
{
type:p
value:Это второй параграф;
},
{
type:hr
},
{
type:p
value:Это третий параграф
},
{
type:p
value:
},
{
type:pre
{
type:code
value:Какой-то ещё тега;
},
},
{
type:pre
{
type:code
value:Какой-то ещё тега;
},
},
{
type:p
value:
}
]
Структура html всегда разная. Структура json должна повторять структуру html.
Я вижу следующие этапы решения данной задачи:
1 HTML код преобразовать в PHP массив, где название тега - ключ, а содержимое - значение
2 Полученный массив преобразовать в json
Со 2-м пунктом проблем не должно возникнуть. Сейчас застопорился с 1-м пунктом.
Что было проделано:
Пересмотрел в гугле все возможный парсеры html, но все они заточены на поиске конкретного тега или атрибута. В данной задаче мне необходимо распарсить все теги и разместить их в том порядке, в котором они расположены в HTML.
Буду рад любым вариантам, неважно будь-то пакет laravel либо "ванильный" php.
Заранее спасибо.
Laravel 7.6.2
PHP 7.3.4
Добрый день.
Пытаюсь настроить Laravel Passport у себя на проекте.
Для этого использую эту статью
https://medium.com/@martin.riedweg/lara … b909e12528
Сейчас споткнулся на этапе создания middleware, который добавляет в заголовок 'Accept' ='application/json'
http://prntscr.com/s37e0h
Создал middleware http://prntscr.com/s37fht
Добавил его в Kernel http://prntscr.com/s37g33
Пробовал добавить посредник в роуты http://prntscr.com/s37h2c
А также в контроллере http://prntscr.com/s37hzf, но посредник не отрабатывает.
Что это может быть, где я допустил ошибку?
Сколько стоит автомобиль? Ну такой, с 4-мя колесами, руль справа, 4 двери, зеленого цвета.
Ответ: от 0 до бесконечности. Чем больше подробностей, тем точнее сумма.)))
Лучше валидацию проводить в файлах Request.
Для этого:
1 вызываем команду
php artisan make:request NameRequest
После это в app\HTTP появится папка Request с файлом NameRequest
2. Для api, чтобы ответ ошибки возвращался в json формате, добавляем в данную папку файл ApiFormRequest.php
<?php
namespace App\Http\Requests;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Http\JsonResponse;
use Illuminate\Validation\ValidationException;
use Illuminate\Foundation\Http\FormRequest;
abstract class ApiFormRequest extends FormRequest
{
protected function failedValidation(Validator $validator)
{
// все ошибки валидации
$errors = (new ValidationException($validator))->errors();
throw new HttpResponseException(response()->json([
'errors' => $errors
], JsonResponse::HTTP_UNPROCESSABLE_ENTITY));
}
abstract public function authorize();
abstract public function rules();
}
3. В файле NameRequest меняем эти строки http://prntscr.com/rzoluk на эти http://prntscr.com/rzomjy
Здесь http://prntscr.com/rzon19 меняем на true. В блоке rules прописываем правила валидации http://prntscr.com/rzonwd . При необходимости, прописываем варианты ответов http://prntscr.com/rzopxt
4. Теперь в нужном контроллере вызывай данный реквест http://prntscr.com/rzorzp
5. Теперь на стороне клиента ты сможешь получить ошибку в json формате http://prntscr.com/rzouel, с которой сможешь сделать, что пожелаешь нужным
Вот вариант как получить сообщение об ошибке во Vue http://prntscr.com/rzow6q
Спасибо за ответ.
Я знаю про этот метод в php, но как его поместить в мутатор, чтобы в json уже были корректные данные?
Laravel Framework 7.6.1
PHP 7.3.7
Добрый день.
Суть проблемы:
Необходимо форматировать разряды чисел из выборки БД.
Например, есть таблица
id -1
summa- 200000
Мне необходимо получить данные в виде:
[
{
"id": 1,
"summa": 200 000,
},
]
То есть разделить десятки и тысячи пробелами. Данные получаю в json формате для api
Для решения, данной проблемы думаю использовать мутаторы в моделях.
Например,
protected $casts = [
'summa' => какой-то код,
];
Следовательно вопрос, как это можно сделать с помощью мутаторов или другим способом?
Не совсем понятна идея. Можете подробней рассказать?
Разобрался.
Оказывается в выборку достаточно добавить поле, по которому идёт связка таблиц
http://prntscr.com/qel0t1
Спасибо.
Пробовал
/**
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function check_list_variables()
{
return $this->hasMany(CheckListVariable::class,'check_list_question_id','id');
}
Результат тот же. Какие ещё могут быть варианты?