Laravel |Связывание промежуточного программного обеспечения не доступно в контроллере - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть промежуточное программное обеспечение, которое просто захватывает поддомен и привязывает его к модели Store.

<?php

namespace App\Http\Middleware;

use Closure;
use App\Models\Store;

class SubDomain
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        $sub_domain = array_first(explode('.', $request->getHost()));

        app()->bind(Store::class, function () use ($sub_domain) {
           return Store::query()->where('sub_domain', $sub_domain)->firstOrFail();
        });

        return $next($request);
    }
}

Однако, когда я нахожусь внутри контроллера, я пытаюсь расширить его, чтобы я могвсегда делайте $this->store->id или что-то похожее, однако, Магазин не найден.

<?php

namespace App\Http\Controllers;

use App\Models\Store;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;

class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;

    /**
     * @var Store
     */
    protected $store;

    /**
     * Controller constructor.
     *
     * @param Store $store
     */
    public function __construct(Store $store)
    {
        $this->store = $store;
    }
}

Магазин - это просто базовая модель без данных.

Это мой маршрут:

Route::group(['middleware' => ['auth', 'sub_domain'], 'prefix' => 'admin'], function () {
   Route::get('/dashboard', 'Admin\DashboardController@index');
});

И я зарегистрировал промежуточное ПО sub_domain внутри Kernel.

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Вы хотите связать экземпляр модели, поэтому используйте app()->instance(Store::class, $store)

ref: https://laravel.com/docs/5.7/container#binding

0 голосов
/ 17 февраля 2019

Служебный контейнер и модель не работают так, как вы ожидаете в своем коде.Поэтому попробуйте следующий фрагмент кода внутри метода контроллера.Вы можете получить то, что ищете.

$store = app(Store::class);

dd($store);
...