Промежуточное ПО Laravel не вызывается при использовании версии конструктора - PullRequest
0 голосов
/ 28 августа 2018

Laravel версия: 5.1.46

routes.php

Route::get('/rocha', 'RochaController@index');

Kernel.php

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'Age' => \App\Http\Middleware\AgeMiddleware::class,
        'Role' => \App\Http\Middleware\RoleMiddleware::class,
    ];

RochaController.php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;

class RochaController extends Controller
{

    public function __construct() {
        $this->middleware('Role');
    }
    public function index() {
        echo '<br>Hi I am index';
    }
}

RochaMiddleware.php

namespace App\Http\Middleware;
use Closure;

class RoleMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        echo '<br>Hi I am middleware';
        return $next($request);
    }


    public function terminate($request, $response) {
        echo '<br>Shtting down...';
    }
}

Результат:

Hi I am middleware
Hi I am index

Когда я использую промежуточное ПО внутри контроллера через его конструктор $this->middleware('Role'), функция terminate() не вызывается. Когда я переключаю код, извлекая конструктор из контроллера, и меняю маршрут на следующий, вызывается функция terminate():

Route::get('/rocha', [
    'middleware' => 'Role',
    'uses' => 'RochaController@index'
]);

Результат:

Hi I am middleware
Hi I am index
Shtting down...

Почему версия конструктора ($this->middleware('Role')) препятствует вызову функции terminate()?

Почему работает версия маршрута и вызывается функция terminate(), в отличие от описанной выше?

1 Ответ

0 голосов
/ 28 августа 2018

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

из terminable-middleware

Я думаю, вы неправильно понимаете использование terminate метода. Laravel фактически вызывает метод terminate, но браузер не будет отображать вывод terminate. Потому что ответ был отправлен в браузеры.

Этот метод terminate можно использовать для проверки успешности вызова.

public function terminate($request, $response)
{
    file_put_contents(__DIR__ . '/1.txt', 'hello terminate');
}

Кстати, я проверяю ваш код, он всегда выводит:

Hi I am middleware
Hi I am index

Мне также интересно, почему вы можете получить Shtting down...

Вышесказанное - это все, что я знаю об этом. Извините за мой плохой английский.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...