Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Привет!
Пишу обработку сервером ajax-запроса. Ларка дает возможность провалидировать данные еще до передачи их в контроллер в слое Request. Очень удобно. Собственно, написал тестовый код и столкнулся с одной проблемой.
namespace App\Http\Requests;
use App\Http\Requests\Request;
class SomeRequest extends Request
{
public function authorize()
{
return auth()->check();
}
public function rules()
{
return [
'name' => 'required',
];
}
public function messages()
{
return [
'name.required' => 'Заполни поле, дружок!!',
];
}
}
Через ajax передаю не форму, а заранее собранный из инпутов объект в формате json.
$.ajax({
url: "[url]https://v-pope-kaki.net[/url]",
async: false,
headers: { 'X-CSRF-Token': $('#token').val() },
type: "POST",
cache: false,
data: JSON.stringify(object), // {name: 'lupa pupkins'}
dataType: 'json',
...
});
Проблема в том, что указанное в правилах поле существует в передаваемом объекте, но валидатор его не видит и выдает ошибку, что, мол, давай, вводи-ка поле, дальше не пущу. Очень не хочется отсылать именно форму. У меня проводится первичная валидация еще на стороне клиента в js прямо перед ajax-запросом. По мне логично передавать именно законченный объект вместо сухой формы. Есть способ как-то это обойти?
Привет!
Вот сижу и недоумеваю. Работаю с blade'ми. нужно наложить слой. Прописываю
@extends('layouts.app')
Все сработало и вывело.
Пошел править шаблон. Поправил. Не выводит. Говорит, что ошибка без дебага.
Беру этот 'app', перемещаю его из папки layouts в корень к основному блейду, в который его и инклудю, меняю
@extends('layouts.app')
на
@extends('app')
Все работает.
Интересно то, что слетели все страницы, куда инклудится 'app'. При том, что другие файлы не тронуты.
Папки проверил. Кодировки - тоже. Хоть убейте, не пойму в чем дело. Ларка 5.2.
Здравствуйте!
Пишу на laravel 5.2 собственного бота. Бот должен отвечать на запросы пользователей по командам на клавиатуре. Собственно, клавиатуру я представляю им тоже. За основу бота была скачена либа, предоставляющая фасад с классами упрощенного взаимодействия с ботом, а именно мне не приходится вручную формировать POST-запрос - либа делает это сама.
Команды к боту делятся на типы. Типы собраны в одну из нескольких клавиатур - каждая на свой тип. Эти клавиатуры объединяет главная клавиатура - меню.
Когда на сайт поступает сообщение с сервера телеграм, то после записи сообщения в базу, сообщение отправляется в главный файл бота - Core.php. Его код выглядит так:
<?php
namespace App\TelegramBot;
use Telegram;
use App\Http\Controllers\UserController;
use App\TelegramBot\MessageParser;
use App\TelegramBot\Commands\Команда1Command; //тип А
use App\TelegramBot\Commands\Команда2Command; //тип А
use App\TelegramBot\Commands\Команда3Command; //тип А
use App\TelegramBot\Commands\Команда4Command; //тип Б
use App\TelegramBot\Commands\Команда5Command; //тип Б
use App\TelegramBot\Commands\Команда6Command; //тип В
use App\TelegramBot\Commands\Команда7Command; //тип В
// + еще с десяток юзов
class Core
{
public static function main($message) {
if(!self::auth($message)): // Проверяем есть ли такой пользователь в базе. Нужно для того, чтоб 'левые' люди не имели доступа к
// пользованию ботом
return;
endif;
$result = MessageParser::parse($message); // Парсим регуляркой тип команды из текста сообщения. Это своего рода определитель команды
$action = false; // Создаем переменную, в которую поместим объект на исполнение команды
switch($result)
{
case 'Команда 1':
$action = new Команда1Command($message);
break;
case 'Команда 2':
$action = new Команда2Command($message);
break;
case 'Команда 3':
$action = new Команда3Command($message);
break;
// + еще с десяток команд
default:
$action = new КомандаНеОпределенаCommand($message);
}
if($action) $action->run();
}
На данный момент команд очень мало, но в перспективе их будет много. В тексте кода уже видно, что подгружать каждую команду вручную неудобно - слишком много юзов. Поэтому возникла идея реструктуризировать бота, пока он несложен.
Изначально любая команда или действие описывалась абстрактным классом Command и держалась в папке Commands/, но держать все типы команд в одной папке неудобно. Поэтому возникла идея усложнить структура, но сделать ее более читаемой и простой на расширение. А именно сделать так:
Создать абстрактный класс Action, описывающий любой тип команд к боту. Поместить этот класс в свою папку Actions/ - она будет содержать все типы действий и обращений к боту, требующих ответа. Внутри папки Actions/ создать несколько папок, определяющих свои команды. Каждая из команд будет наследоваться от Action.
На данный момент имею это:
TelegramBot/
|--> Core.php
|--> MessageReceiver.php
|--> MessageParser.php
|--> Commands/
|--> Command.php - абстрактный класс, описывающий команды. Представлю его ниже.
|--> КомандаACommand.php
|--> КомандаБCommand.php
|--> КомандаВCommand.php
|--> ...
Хочется иметь это:
TelegramBot/
|--> Core.php
|--> MessageReceiver.php
|--> MessageParser.php
|--> Actions/
|--> Action.php - тот же класс Command
|--> Keyboards/Команды на предоставление клавиатуры, описываемые классом Action
|--> Options/Команды опций, описываемые классом Action
|--> Reports/Команды на отчет, описываемые классом Action
|--> ...
<?php
namespace App\TelegramBot\Commands;
abstract class Command
{
private $message;
private $answer;
public function __construct($message)
{
//
}
public function run()
{
//
}
}
Проблема в том, повторюсь, что подгружать каждый файл в Core.php крайне неудобно. Моих знаний ларавеля, как и ООП, недостаточно, чтоб правильно реализовать данную задачу. Как я понимаю, необходимо создать что-то на подобии автолоадера, который будет автоматом подгружать каждый класс из каждой папки и переносить их в Core. Тут я уже не соображаю.
Вообще, интересна критика данной структуры. Я только начинаю более менее нормально кодить. Жажду прогресса.
Прошу помощи, ссылки, совета - приму все, что поможет. Надеюсь, изложил все внятно, но при необходимости дам разяснения.
Спасибо.
Собственно, необходимо отправлять построенный график в телеграм. Раньше до laravel использовал библиотеки pchart, с помощью которых и клепал графики. Сейчас же не нашел адаптацию к laravel. Видел, что существуют другие системы, но они создают график уже непосредственно в браузере, а мне нужно вписать создание графика именно в бэкэнд. Подскажете чего?
Добрый день! Не совсем понимаю как решить задачу по организации структуры работы приложения.
Ежеминутно отрабатывает задача, по которой извне приходит набор данных в виде ассоциативного массива, который необходимо пропустить через фильтр на регулярках. Как и куда будет правильным прописать фильтры? В middleware? В другую задачу? Может есть примеры реализации подобного?
Да, все понятно. Здесь, наверное, логичнее использовать очереди. Пойду в них. Спасибо за помощь!
Приветствую.
Могу ли написать Вам в ЛС и немного у вас проконсультироваться по поводу построения логики работы приложения?
Приветствую.
Благодарю за ответ! Информации много, а дельную отличать все еще сложно. Ответы людей для меня на вес золота.
SmsController я задумывал как контроллер, включающий в себя только методы работы с таблицей sms. Загрузить, выгрузить и т.п. SmsUpdaterController же должен являться некой общей точкой с логикой именно для загрузки новых смс. Смс берутся с чужой базы с доступом на чтение. Как правильно к ней подключаться пока не знаю, но предполагаю, что придется создавать отдельную модель под чужую таблицу. Если есть что посоветовать, то с радостью приму совет к сведению.
Далее
Немного о смысле программы. Сами смс - не цель. Цель - информация в них. Она шаблонна и требует фильтра на регулярках. Без последних никак не обойтись. Проходя через фильтр, информация сортируется и записывается в другую таблицу, которая одна для всех типов информации.
Идея в том, чтобы разделить цикл от получения смс до ее обработки на несколько этапов, где будут отрабатывать свои контроллеры. Первый этап - загрузка СМС в базу. Второй - обработка. Контроллер обработки берет необработанные СМС из соответствующей таблицы, пропускает через фильтр и записывает информацию в другую таблицу.
Как и на первом, так и на втором этапе нужен доступ к таблице sms, соответственно и контроллер работы с ней. То, что я вынес логику первого этапа в отдельный контроллер обусловлено разделением обязанностей контроллеров.
Ваше замечание по этому я понял. Видимо, я не до конца понимаю смысл контроллеров и моделей. Поэтому вынес логику в отдельные контроллеры.
Буду благодарен за объяснения своих недочетов и промахов. Вот то, что есть на данном этапе разработки:
class SmsController extends Controller
{
public static function getById($id) {
}
public static function insert($sms) {
Sms::insert($sms);
}
}
class SmsUpdater extends Controller
{
public function main() {
// получаем лист с новыми смс
$smsList = OtherDBController::getSmsList();
// передаем лист смс в контроллер работы с базой и записываем новые смс
SmsController::insert($smsList);
}
}
class OtherDBController extends Controller
{
public static function getSmsList() {
$smsList;
$sms1 = ['text'=>'Sms text 1', 'sender'=>'Sms sender 1', 'receiver'=>'Sms receiver 1', 'dateTime'=>'2020-02-19 12:08:05'];
$smsList[] = $sms1;
$sms2 = ['text'=>'Sms text 2', 'sender'=>'Sms sender 2', 'receiver'=>'Sms receiver 2', 'dateTime'=>'2020-02-19 12:08:05'];
$smsList[] = $sms2;
$sms3 = ['text'=>'Sms text 3', 'sender'=>'Sms sender 3', 'receiver'=>'Sms receiver 3', 'dateTime'=>'2020-02-19 12:08:05'];
$smsList[] = $sms3;
return $smsList;
}
}
class Sms extends Model
{
protected $table = 'sms';
protected $primaryKey = 'id';
public $incrementing = 'id';
}
Версия laravel 5.2
День добрый! Программирую давно, а ларавель, как и ООП-подход начал изучать недавно. Собственно, и в мир "большого" программирования еще на стадии вливания. Прошу не кидать камнями за, возможно, глупый вопрос, ответ на который я наверняка искал недостаточно усердно.
К делу.
Есть проект по сбору и обработке информаци из СМС сообщений. Не буду вдаваться в ненужные подробности о проекте, перейду сразу к сути.
Задача реализовать загрузку СМС сообщений в мою базу в таблицу 'sms'. MVC осваивать начал только с ларавелем, поэтому некоторые моменты еще не ясны. Итак, есть таблица, к ней приделана модель 'Sms'. Работа с таблицей осуществляется через эту модель и через 'SmsController'. Их задачи, в целом, понятны. Модель нужна для взаимодейстия таблицей, как с объектом, а контроллер для взаимодействия с таблицей уже через модель. Вроде верно. Поправьте если не так.
Так как смс приходят много, то они требуют постоянной подгрузки. Посему был создан еще один контроллер с названием "SmsUpdateController", который является неким центром, через который отрабатывает весь механизм загрузки. В нем мною определен основной метод main(), который отрабатывает по запросу через роутинг (потом посажу на крон). И все бы хорошо. Да вот проблема.
Я рассматриваю само смс-сообщение, как объект с полями 'text', 'sender', 'receiver' и 'datetime'. Собственно, они же и есть в таблице. Поэтому мне кажется логичным создать класс Sms, описывающий объект смс и "строчку" из таблицы. Мой коллега так не считает и предланает использовать ассоциативный массив и передввать его на всех циклах отработки загрузочного модуля. Я считаю это нелогичным, а посему решил все-таки создать класс Sms... и тут начплись проблемы.
Куда его прописывать? Создать папку Library в App? А как правильно подключить класс? Очень не хочется его втупую инклудить через 'use'. Может можно его как-то подгружать автоматически, чтоб он был виден автоматом везде в папке 'Controllers'. Или я ошибаюсь и так делать не нужно вовсе? Вообще и далее по ходу разработки понпдобятся собственные классы. Например, класс с регулярками для разбора смс хотел вынести в отдельный и подключать его в посредник-фильтер.
Вопрос на засыпку, стоит ли хранить системную информацию об объекте смс в отдельной таблице sms_meta? Или же пару лишних полей не испортят таблицу sms?
Страницы 1