Доступ к промежуточному программному обеспечению в laravel контроллере - PullRequest
1 голос
/ 05 марта 2020

Я создаю промежуточное ПО конвертера валют в laravel на основе субдомена, app / Http / Middleware / Currency. php это промежуточное ПО используется для конвертации валюты

namespace App\Http\Middleware;

use Closure;

class Currency
{
public function convert($request, Closure $next)
{
$sub=array_shift((explode('.', $_SERVER['HTTP_HOST'])));
$fromCurrency =  "AED";
$toCurrency = "$sub";
$amount = "1";
$url = "https://www.google.com/search?q=".$fromCurrency."+to+".$toCurrency;
$get = file_get_contents($url);
$data = preg_split('/\D\s(.*?)\s=\s/',$get);
$exhangeRate = (float) substr($data[1],0,7);
$convertedAmount = $amount*$exhangeRate;
$data = array( 'exhangeRate' => $exhangeRate, 'convertedAmount' =>$convertedAmount,       'fromCurrency' => strtoupper($fromCurrency), 'toCurrency' => strtoupper($toCurrency));
return json_encode( $data );
    }
}

и напишите Ядро. php как

protected $middleware = [
     \App\Http\Middleware\Currency::class,
];

и покажите Имя функции должно быть строкой Ошибка также на странице, как получить доступ к этому возвращению значение в контроллере?

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Я не думаю, что промежуточное ПО - лучший способ реализовать желаемую функцию, но для выполнения того, что вы просили, используя промежуточное ПО, само промежуточное ПО должно иметь функцию с именем handle вместо convert. Также вы можете sh передать результат в ваши сеансы, чтобы получить к нему доступ внутри контроллера.

Обратите также внимание на возврат функции дескриптора, поскольку для продолжения процесса требуется

namespace App\Http\Middleware;

use Closure;

class Currency
{
    public function handle($request, Closure $next)
    {
        $explodedArr = explode('.', $_SERVER['HTTP_HOST']);
        $sub = array_shift($explodedArr);
        $fromCurrency =  "AED";
        $toCurrency = "$sub";
        $amount = "1";
        $url = "https://www.google.com/search?q=".$fromCurrency."+to+".$toCurrency;
        $get = file_get_contents($url);
        $data = preg_split('/\D\s(.*?)\s=\s/',$get);
        $exhangeRate = (float) substr($data[1],0,7);
        $convertedAmount = $amount*$exhangeRate;
        $data = array( 'exhangeRate' => $exhangeRate, 'convertedAmount' =>$convertedAmount,       'fromCurrency' => strtoupper($fromCurrency), 'toCurrency' => strtoupper($toCurrency));

        session()->flash('convert_result', json_encode($data) );
        return $next($request);
    }
}

// and you should be able to get the result in your controller like so
session('convert_result');
1 голос
/ 05 марта 2020

Для достижения вашей цели вы должны использовать Helper вместо Middleware. Согласно Laravel Документация

Промежуточное ПО обеспечивает удобный механизм фильтрации HTTP-запросов, поступающих в ваше приложение. Например, Laravel включает промежуточное программное обеспечение, которое проверяет подлинность пользователя вашего приложения. Если пользователь не аутентифицирован, промежуточное программное обеспечение перенаправит пользователя на экран входа в систему. Однако, если пользователь прошел аутентификацию, промежуточное программное обеспечение позволит запросу продолжить работу в приложении.

Вы можете создать собственный помощник, как показано ниже, и использовать его в любом месте вашего приложения

Шаг 1: Создайте свой файл класса Помощники по валютам и дайте ему соответствующее пространство имен. Напишите ваш класс и метод:

  <?php // Code within app\Helpers\Currency.php

    namespace App\Helpers;


class Currency
{
    public static function convert($request, Closure $next)
    {
        $sub=array_shift((explode('.', $_SERVER['HTTP_HOST'])));
        $fromCurrency =  "AED";
        $toCurrency = "$sub";
        $amount = "1";
        $url = "https://www.google.com/search?q=".$fromCurrency."+to+".$toCurrency;
        $get = file_get_contents($url);
        $data = preg_split('/\D\s(.*?)\s=\s/',$get);
        $exhangeRate = (float) substr($data[1],0,7);
        $convertedAmount = $amount*$exhangeRate;
        $data = array( 'exhangeRate' => $exhangeRate, 'convertedAmount' =>$convertedAmount,       'fromCurrency' => strtoupper($fromCurrency), 'toCurrency' => strtoupper($toCurrency));
        return json_encode( $data );
    }
}

Шаг 2: Создайте псевдоним:

<?php // Code within config/app.php

    'aliases' => [
     ...
        'Currency' => App\Helpers\Helper::class,
     ...

Шаг 3: Выполните composer dump-autoload в проекте root

Шаг 4: Используйте это так в вашем контроллере

<?php 

namespace App\Http\Controllers;

use Currency;



 class SomeController extends Controller
    {

        public function __construct()
        {
            Currency::convert($value);
        }
...