Laravel по-русски

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

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

#1 23.04.2018 13:18:27

Resolving данных из контейнера Laravel

Приветствую. Ситуация такая, мне необходимо добавить кое-какой функционал в класс Request. Я сделал так. Создал свой класс Request унаследованный от ларавельного.

<?php

namespace App\Overload;
use Illuminate\Http\Request as LaravelRequest;

class Request extends LaravelRequest
{
    ...
}

Затем в сервиспровайдере я биндю в контейнер свой Request вместо ларавельного.

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Overload\Request;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind('\Illuminate\Http\Request',Request::class);
    }
}

И далее в приложении предстает следующая картина.

    protected function logRequest(\Illuminate\Http\Request $request)
    {
        $request1 = app()->make('\Illuminate\Http\Request');
        dump($request1); // Resolving Illuminate\Http\Request
        dump($request); // Resolving App\Overload\Request
    }

Иначе говоря, когда я инстанцирую объект из контейнера посредством метода make - все работает так как и предполагается. Если же использовать метод через typehint, то инстанцируется экземпляр оригинального реквеста, вместо моего. Может кто-нибудь объяснить почему так происходит? Правильный ли вообще подход я использую? Может можно как-то по другому добавить пару методов в Request?

Не в сети

#2 25.04.2018 17:01:14

Re: Resolving данных из контейнера Laravel

ээммм, создать в папке Requests файл ArticleRequest.php и в нем переопределить / добавить че хотите.

namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Auth;

class ArticleRequest extends FormRequest
{
   бла бла
}

и дальше уже юзать

    public function store(ArticleRequest $request)
    {
        $result = $this->a_rep->storeArticle($request); // Метод сохранит инфу о новом создаваемом материале.
        if ($result) {
            return redirect('admin/moder')->with(Session::flash('status', 'Материал добавлен!'));
        } else {
            return back();
        }
    }

или я не правильно понял?

Изменено sam (25.04.2018 17:02:31)

Не в сети

#3 25.04.2018 17:55:58

Re: Resolving данных из контейнера Laravel

Не совсем. Нужно добавить функционал именно в ларавельный реквест (Illuminate\Http\Request) , так как он уже много где используется в приложении и не хотелось бы менять все Illuminate\Http\Request на App\Http\Requests\ArticleRequest. На данный момент сделал так. Как и раньше создал свой реквест, унаследованный от ларавельного, но не биндил его в контейнер, а подменил инстанцирование оригинального реквеста своим на стадии обработки ядром реквеста для полчучения респонса. Получилось так

$response = $kernel->handle(
    //$request = Illuminate\Http\Request::capture() // Оригинальны реквест
    $request = App\Overload\Request::capture()
);

Не думаю, что это лучший вариант, но другого я не нашел. Если кто знает иное решение, буду рад услышать.

Не в сети

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