Есть ли способ поймать, когда я использую сессию laravel tinker, чтобы возиться с моделями в классе Observer? - PullRequest
0 голосов
/ 10 мая 2019

У меня есть Observer, настроенный на прослушивание событий Model, чтобы мой Controller был чист от сообщений журнала.Моя реализация выглядит следующим образом:

Во-первых, метод store, который делает именно то, что должен.Создайте и сохраните новую модель из допустимых параметров.

# app/Http/Controllers/ExampleController.php
namespace App\Http\Controllers;

use App\Http\Requests\StoreExample;
use App\Example;

class ExampleController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }

    /**
     * Create and save an Example from validated form parameters.
     * @param  App\Http\Requests\StoreExample  $request
     */
    public function store(StoreExample $request)
    {
        Example::create($request->validated());

        return back();
    }
}

Запрос формы StoreExample не важен.Он просто проверяет и проверяет шлюз для авторизации действия.

Observer Я настроил протоколирование этого действия.

# app/Observers/ExampleObserver.php
namespace App\Observers;

use App\Example;

class ExampleObserver
{
    public function created(Example $example): void
    {
        \Log::info(auth()->id()." (".auth()->user()->full_name.") has created Example with params:\n{$example}");
    }
}

Проблема, с которой я столкнулся, заключается в том, как зависят мои журналына объекте auth(), который нужно установить.С учетом промежуточного программного обеспечения auth и шлюза, который он должен проверить, чтобы сохранить Пример, гостевой пользователь не сможет отключить этот код.

Однако мне нравится использовать tinker вмои локальные и промежуточные среды для проверки поведения сайта, но это может привести к ошибке (ну, если быть более точным, PHP notice), потому что я могу создавать модели Example без проверки подлинности, а регистратор будет пытаться получить свойствоfull_name от необъекта auth()->user().

Поэтому мой вопрос заключается в следующем: есть ли способ отловить, когда я специально использую сеанс Laravel tinker для обработки своих моделей в Observer?учебный класс?

1 Ответ

0 голосов
/ 10 мая 2019

Хорошо, отвечая на мой собственный вопрос: есть ЕСТЬ способ.Требуется использование объекта Request. Поскольку наблюдатели не обрабатывают запросы самостоятельно, я ввел один в конструктор. request () можно использовать вместо этого, поэтому DI не требуется.

Почему важен запрос?

Поскольку объект запроса имеет доступный атрибут $ server, который содержит информацию, которую я хочу.Это релевантная информация, которую я получаю, возвращая dd($request->server) (я не собираюсь вставлять все это. ServerBag моего запроса имеет более 100 атрибутов!)

Symfony\Component\HttpFoundation\ServerBag {#37
  #parameters: array:123 [
    "SERVER_NAME" => "localhost"
    "SERVER_PORT" => 8000
    "HTTP_HOST" => "localhost:8000"
    "HTTP_USER_AGENT" => "Symfony"   // Relevant
    "REMOTE_ADDR" => "127.0.0.1"
    "SCRIPT_NAME" => "artisan"       // Relevant
    "SCRIPT_FILENAME" => "artisan"   // Relevant
    "PHP_SELF" => "artisan"          // Relevant
    "PATH_TRANSLATED" => "artisan"   // Relevant
    "argv" => array:2 [              // Relevant
      0 => "artisan"
      1 => "tinker"
    ]
    "argc" => 2
  ]
}

Так что есть все эти атрибуты, которые я могу отфильтроватьиспользуя $request->server('attribute') (возвращает $request->server->attribute или null, поэтому нет риска получить доступ к неопределенному свойству).Я также могу сделать $request->server->has('attribute') (возвращает true или false)

# app/Observers/ExampleObserver.php
namespace App\Observers;

use App\Example;

class ExampleObserver
{
    /* Since we can use request(), there's no need to inject a Request into the constructor
    protected $request;

    public function __construct(Request $request)
    {
        $this->request = $request;
    }
    */

    public function created(Example $example): void
    {
        \Log::info($this->getUserInfo()." has created Example with params:\n{$example}");
    }

    private function getUserInfo(): string
    {
        // My logic here. 
    }
}
...