Задать вопрос
@kiranananda

Как правильно реализовать кэширование модели для rules?

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

Что то всю голову сломал, как корректно сделать.

Есть у меня куча различных rules валидации и часть из них проверяет данные в одной и той же модели. И если в каждом правиле я делаю запрос модели из базы, да потом еще и делаю запрос этой модели из контроллера, то получаю, в данный момент 3 одинаковых запроса в бд. Что не есть хорошо. Как бы правильно это реализовать? Или это нормально так делать?
  • Вопрос задан
  • 124 просмотра
Подписаться 3 Простой 5 комментариев
Решения вопроса 2
@kiranananda Автор вопроса
Реализовал так, поправьте если можно проще или правильнее...
Сервис провайдер
class DriverLoginServiceProvider extends ServiceProvider
{
	// protected $defer = true;
	
    public function register()
    {
    	$this->app->singleton(DriverLogin::class, function ($app) {
	    	return DriverLogin::where('phone', Request::input('phone', 'none'))->first();
		});
    }

    public function provides()
    {
        return [DriverLogin::class];
    }    
}

Контроллер
public function loginCheckPhone(CheckDriver $request, DriverLogin $driver)
    {
    	// Проверяем можно ли делать повторную отправку.
    	if ( ($checkSend = Sms::checkSend($driver->verify_code)) !== true ) {
    		return response()->json( $checkSend, 403);
    	}

    	$driver->verify_code = Sms::send($driver->phone, 'Ваш код авторизации в личном кабинете: %code');

    	$driver->save();
    }

Самое правило валидации
public function passes($attribute, $value)
    {	
       return (app()->get(DriverLogin::class)) ? true : false;
    }

Наследовение оригинальной модели. У меня 2 сервис провайдера, один при входе, другой уже когда человек авторизовался. Вот для этого наследование.
<?php

namespace App\Models;

class DriverLogin extends \Backend\Driver\Models\Driver
{

}

?>


В итоге эта схема чуть сложна для данной ситуации, в реале сделал просто так вот

<?php

namespace App\Services;

use Backend\Driver\Models\Driver;
use Request;

class DriverLogin
{
	private static $model = null;

	public static function get() 
	{
		if (DriverLogin::$model === null ) {
			$phone = Request::input('phone', '');
			DriverLogin::$model = (iconv_strlen($phone) != 12) 
				? false 
				: Driver::where('phone', $phone)->first();
		}
    	return DriverLogin::$model;
  	}
}

?>


И из нужных мест получаю резултат запроса...
Ответ написан
@NubasLol
public function rules()
    {
        $model = Model::firsy();

        return [
            'phone' => new Rule($model),
            'phone1' => new Rule1($model),
            'phone2' => new Rule2($model),
        ];
    }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы