【问题标题】:Access middleware in laravel controller在 laravel 控制器中访问中间件
【发布时间】:2020-03-05 05:05:35
【问题描述】:

我在 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 );
    }
}

并在Kernel.php中像

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

并在页面中显示 Function name must be a string 错误, 如何在控制器中访问这个返回值?

【问题讨论】:

  • 为什么要使用货币转换作为中间件。它应该用作助手
  • @Sehdev 不需要中间件,

标签: php laravel middleware


【解决方案1】:

为了达到您的目的,您应该使用 Helper 而不是 Middleware。根据 Laravel 文档

中间件提供了一种方便的机制来过滤 HTTP 请求 输入您的应用程序。例如,Laravel 包含一个中间件 验证您的应用程序的用户是否已通过身份验证。如果 用户未通过身份验证,中间件会将用户重定向到 登录屏幕。但是,如果用户通过了身份验证,则 中间件将允许请求进一步进入 应用。

您可以如下创建自定义 Helper 并在应用中的任何位置使用它

第 1 步: 创建您的 Currency Helpers 类文件并为其提供匹配的命名空间。编写你的类和方法:

  <?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

第 4 步:在控制器中像这样使用它

<?php 

namespace App\Http\Controllers;

use Currency;



 class SomeController extends Controller
    {

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

【讨论】:

  • 在你的终端运行composer dump-autoload在你的项目下
  • 非静态方法 App\Helpers\Currency::convert() 不应该被静态调用显示这种类型错误为什么?
  • public之后添加static关键字,如@9​​87654328@
【解决方案2】:

我不认为中间件是实现您想要的功能的最佳方式,但要使用中间件完成您要求的操作,中间件本身必须有一个名为 handle 而不是 convert 的函数。您也可以将结果闪现到您的会话中以在控制器内部访问它。

还要注意句柄函数的返回,因为它是进程继续所必需的

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');

【讨论】:

    猜你喜欢
    • 2018-07-09
    • 2023-03-22
    • 2013-02-03
    • 2019-02-26
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多