为了账号安全,请及时绑定邮箱和手机立即绑定

在 laravel 控制器中访问中间件

在 laravel 控制器中访问中间件

PHP
慕姐4208626 2022-10-14 16:27:20
我在 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,];并在页面中显示函数名称必须是字符串错误,如何在控制器中访问此返回值?
查看完整描述

2 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

为了达到您的目的,您应该使用 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,

     ...

第三步:composer dump-autoload在项目根目录下运行


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


<?php 


namespace App\Http\Controllers;


use Currency;




 class SomeController extends Controller

    {


        public function __construct()

        {

            Currency::convert($value);

        }


查看完整回答
反对 回复 2022-10-14
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

我不认为中间件是实现您想要的功能的最佳方式,但要使用中间件执行您要求的操作,中间件本身必须有一个名为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');


查看完整回答
反对 回复 2022-10-14
  • 2 回答
  • 0 关注
  • 137 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信