Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 Laravel 5.x » Валидация данных. Laravel 5.2 » 04.08.2020 02:17:37

Remover_4000_pro
Ответов: 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-запросом. По мне логично передавать именно законченный объект вместо сухой формы. Есть способ как-то это обойти?

#2 Laravel 5.x » Не отрабатывает extends() с указанием папки » 11.04.2020 11:58:59

Remover_4000_pro
Ответов: 0

Привет!
Вот сижу и недоумеваю. Работаю с blade'ми. нужно наложить слой. Прописываю

@extends('layouts.app')

Все сработало и вывело.
Пошел править шаблон. Поправил. Не выводит. Говорит, что ошибка без дебага.
Беру этот 'app', перемещаю его из папки layouts в корень к основному блейду, в который его и инклудю, меняю

@extends('layouts.app')

на

@extends('app')

Все работает.
Интересно то, что слетели все страницы, куда инклудится 'app'. При том, что другие файлы не тронуты.
Папки проверил. Кодировки - тоже. Хоть убейте, не пойму в чем дело. Ларка 5.2.

#3 Laravel 5.x » Как заменить много use'ов одним или правильная организация структуры. » 08.03.2020 13:56:15

Remover_4000_pro
Ответов: 1

Здравствуйте!

Пишу на 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. Тут я уже не соображаю.

Вообще, интересна критика данной структуры. Я только начинаю более менее нормально кодить. Жажду прогресса.

Прошу помощи, ссылки, совета - приму все, что поможет. Надеюсь, изложил все внятно, но при необходимости дам разяснения.

Спасибо.

#4 Общий раздел » Существуют ли пакеты для laravel для создания графиков на php без js? » 01.03.2020 16:56:52

Remover_4000_pro
Ответов: 1

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

#5 Хорошие практики (FAQ) » Куда и как прописывать фильтрацию данных при отработке задачи? » 09.02.2020 12:12:15

Remover_4000_pro
Ответов: 2

Добрый день! Не совсем понимаю как решить задачу по организации структуры работы приложения.

Ежеминутно отрабатывает задача, по которой извне приходит набор данных в виде ассоциативного массива, который необходимо пропустить через фильтр на регулярках. Как и куда будет правильным прописать фильтры? В middleware? В другую задачу? Может есть примеры реализации подобного?

#6 Re: Laravel 5.x » Работа с базой и объекты. Куда прописать свои классы? » 06.02.2020 15:57:31

Да, все понятно. Здесь, наверное, логичнее использовать очереди. Пойду в них. Спасибо за помощь!

#7 Re: Laravel 5.x » Работа с базой и объекты. Куда прописать свои классы? » 06.02.2020 13:51:50

Приветствую.

Могу ли написать Вам в ЛС и немного у вас проконсультироваться по поводу построения логики работы приложения?

#8 Re: Laravel 5.x » Работа с базой и объекты. Куда прописать свои классы? » 06.02.2020 12:33:49

Приветствую.

Благодарю за ответ! Информации много, а дельную отличать все еще сложно. Ответы людей для меня на вес золота.

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';

}

#11 Laravel 5.x » Работа с базой и объекты. Куда прописать свои классы? » 04.02.2020 01:08:27

Remover_4000_pro
Ответов: 8

День добрый! Программирую давно, а ларавель, как и ООП-подход начал изучать недавно. Собственно, и в мир "большого" программирования еще на стадии вливания. Прошу не кидать камнями за, возможно, глупый вопрос, ответ на который я наверняка искал недостаточно усердно.

К делу.

Есть проект по сбору и обработке информаци из СМС сообщений. Не буду вдаваться в ненужные подробности о проекте, перейду сразу к сути.

Задача реализовать загрузку СМС сообщений в мою базу в таблицу 'sms'. MVC осваивать начал только с ларавелем, поэтому некоторые моменты еще не ясны. Итак, есть таблица, к ней приделана модель 'Sms'. Работа с таблицей осуществляется через эту модель и через 'SmsController'. Их задачи, в целом, понятны. Модель нужна для взаимодейстия таблицей, как с объектом, а контроллер для взаимодействия с таблицей уже через модель. Вроде верно. Поправьте если не так.

Так как смс приходят много, то они требуют постоянной подгрузки. Посему был создан еще один контроллер с названием "SmsUpdateController", который является неким центром, через который отрабатывает весь механизм загрузки. В нем мною определен основной метод main(), который отрабатывает по запросу через роутинг (потом посажу на крон). И все бы хорошо. Да вот проблема.

Я рассматриваю само смс-сообщение, как объект с полями 'text', 'sender', 'receiver' и 'datetime'. Собственно, они же и есть в таблице. Поэтому мне кажется логичным создать класс Sms, описывающий объект смс и "строчку" из таблицы. Мой коллега так не считает и предланает использовать ассоциативный массив и передввать его на всех циклах отработки загрузочного модуля. Я считаю это нелогичным, а посему решил все-таки создать класс Sms... и тут начплись проблемы.

Куда его прописывать? Создать папку Library в App? А как правильно подключить класс? Очень не хочется его втупую инклудить через 'use'. Может можно его как-то подгружать автоматически, чтоб он был виден автоматом везде в папке 'Controllers'. Или я ошибаюсь и так делать не нужно вовсе? Вообще и далее по ходу разработки понпдобятся собственные классы. Например, класс с регулярками для разбора смс хотел вынести в отдельный и подключать его в посредник-фильтер.

Вопрос на засыпку, стоит ли хранить системную информацию об объекте смс в отдельной таблице sms_meta? Или же пару лишних полей не испортят таблицу sms?

Подвал раздела