laravel 如何创建可从任何控制器和刀片文件访问全局函数

pbgvytdp  于 2023-02-05  发布在  其他
关注(0)|答案(9)|浏览(137)

我有两个控制器文件homecontroller和backendcontroller。创建全局函数并从两个文件访问它的最佳方法是什么?
我发现here Arian Acosta的回答很有帮助,但我想知道是否有一个最简单的方法。我将感谢任何建议。

yrdbyhpb

yrdbyhpb1#

溶液

一种方法是创建一个类并使用它的示例,这样您不仅可以在控制器、刀片或任何其他类中访问该类的对象。

应用帮助程序文件

在您的应用程序文件夹中创建一个名为Helpers的文件夹,并在其中创建一个名为AppHelper或您选择的任何名称的文件

<?php
namespace App\Helpers;

class AppHelper
{
      public function bladeHelper($someValue)
      {
             return "increment $someValue";
      }

     public function startQueryLog()
     {
           \DB::enableQueryLog();
     }

     public function showQueries()
     {
          dd(\DB::getQueryLog());
     }

     public static function instance()
     {
         return new AppHelper();
     }
}

用法

在控制器中

在控制器中,您可以调用各种函数

public function index()
{
    //some code

   //need to debug query
   \App\Helpers\AppHelper::instance()->startQueryLog();

   //some code that executes queries
   \App\Helpers\AppHelper::instance()->showQueries();
}

在刀片文件中

假设您在一个刀片文件中,下面介绍了如何调用应用程序刀片助手函数

some html code
{{ \App\Helpers\AppHelper::instance()->bladeHelper($value) }}
and then some html code

减少命名空间的开销(可选)

您还可以通过在config\app.php中为AppHelper类创建别名来减少调用完整函数名称空间**\App\Helpers**的开销

'aliases' => [
       ....
       'AppHelper' => App\Helpers\AppHelper::class
 ]

在你的控制器或者刀片文件中,你可以直接调用

\AppHelper::instance()->functioName();
ryevplcw

ryevplcw2#

简易解决方案:

1.在app目录中创建新的Helpers文件夹。
1.在该Helpers目录中创建一个名为your_helper_function.phpphp文件。
1.在your_helper_function.php中添加函数

function your_function($parameters){

    //function logic

} 

function your_another_function($parameters){

    //function logic

}

1.将此文件添加到composer.jsonFiles密钥,如下所示

"autoload": {
    ...
    "files": [
        "app/Helpers/your_helper_function.php"
    ]
    ...
}

1.最后,重新生成composer自动加载文件。(在项目目录中运行此操作)

composer dump-autoload

就是这样!现在您可以在Laravel项目的任何部分访问your_function()your_another_function()

如果您仍然有任何困惑,请查看我的博客文章如何做到这一点:

How to Add a Global Function in Laravel Using Composer?

tpxzln5u

tpxzln5u3#

    • 更新日期:**
    • 步骤1在应用程序文件夹中添加文件夹app-〉Helper**
    • 步骤2在Helper文件夹中添加php类例如Helper.php**

将命名空间和类添加到Helper.php

namespace App\Helper;

class Helper
{

}

在config/app.php文件中注册这个Helper.php文件

'aliases' => [
       ....
       'Helper' => App\Helper\Helper::class
 ]

现在,在Helper.php中编写所有函数,这样就可以在任何地方访问它。

    • 如何从控制器访问?**

步骤1-在控制器顶部添加一个名称空间。

use App\Helper\Helper;

第2步-调用函数-假设Helper类中有一个getInformation()

$information = Helper::getInformation()
gkl3eglg

gkl3eglg4#

在你的Controller.php which extends BaseController中,你可以创建一个函数,比如:

public function data($arr = false)
{
 $data['foo'] = 'bar';
 return array_merge($data,$arr);
}

和从任何控制器发送数据到视图时;

public function example()
{
 $data['smthg'] = 'smthgelse';
 return view('myView',$this->data($data));
}

可以从所有控制器和刀片访问主控制器中的数据。

o0lyfsai

o0lyfsai5#

Laravel服务提供商的方式

我在Laravel中使用全局函数已经有一段时间了,我想分享一下我是怎么做的。这篇文章中有两个答案:https://stackoverflow.com/a/44021966/5543999https://stackoverflow.com/a/44024328/5543999
这种方式将在ServiceProvider中加载文件,并在您的Laravel应用中注册它。
区别在哪里,范围,总是关于范围。

Composer //Autload whitin composer.json method
|
|--->Laravel App //My method
     |
     |--->Controller //Trait method
     |--->Blade //Trait method
     |--->Listener //Trait method
     |--->...

这是一个非常简单的方法来解释我的观点,所有三个方法都将达到"全局函数"的目的。Traits方法将需要您声明use App\Helpers\Trait;App\Helpers\Trait::function()
编写器和服务提供者几乎是一样的。对我来说,他们更好地回答了什么是全局函数的问题,因为他们不需要在每个你想使用它们的地方声明它们。你只需要使用它们function()。主要的区别是你喜欢的东西。

如何

1.创建函数文件:App\Functions\GlobalFunctions.php

//App\Functions\GlobalFunctions.php
<?php

    function first_function()
    {
        //function logic
    }

    function second_function()
    {
        //function logic
    }

1.创建服务提供程序:

//Into the console
 php artisan make:provider GlobalFunctionsServiceProvider

1.打开新文件App\Providers\GlobalFunctionsServiceProvider.php并编辑注册方法

//App\Providers\GlobalFunctionsServiceProvider.php

 public function register()
 {
     require_once base_path().'/app/Functions/GlobalFunctions.php';
 }

1.将您的提供程序注册到App\Config\App.php的提供程序中

//App\Config\App.php

 'providers' => [

     /*
     * Laravel Framework Service Providers...
     */
     Illuminate\Auth\AuthServiceProvider::class,
     ...
     Illuminate\Validation\ValidationServiceProvider::class,
     Illuminate\View\ViewServiceProvider::class,
     App\Providers\GlobalFunctionsServiceProvider::class, //Add your service provider

1.运行一些工匠的命令

//Into the console
 php artisan clear-compiled
 php artisan config:cache

1.使用新的全局函数

//Use your function anywhere within your Laravel app
 first_function();
 second_function();
8nuwlpux

8nuwlpux6#

Laravel默认使用名称空间,所以你需要按照答案中描述的方法来设置一个帮助文件。
虽然在你的例子中你想访问不同控制器中的方法,但有一个更简单的方法,在你的基本控制器app/Http/Controllers/Controller.php中添加一个方法,你可以在其他控制器中访问它们,因为它们扩展了它。

// in app/Http/Controllers/Controller.php
protected function dummy()
{
    return 'dummy';
}

// in homecontroller

$this->dummy();
k4emjkb1

k4emjkb17#

有几种方法,具体取决于您要添加的确切功能。
1)在Controller.php中创建一个函数,并让所有其他控制器扩展该控制器。
2)创建一个trait,trait可以为你做很多事情,保持你的控制器干净。我个人喜欢使用trait,因为它看起来很干净,让我的Controller.php不会被大量不同的代码行弄得一团糟。

hpxqektj

hpxqektj8#

创建全局函数

在一个文件夹下创建一个Helpers.php文件,我们将其命名为“core”。

core
 |
  -- Helpers.php

namespace Helpers; // define Helper scope

if(!function_exists('html')) {

  function html($string) {

    // run some code
    
    return $str;

  }

}

在composer.json中

"autoload": {
    "psr-4": {
        
    },
    "files": [
        "core/Helpers.php"
    ]
}

在要使用它的文件中

// the " use " statement is not needed, core/Helpers is loaded on every page

  if(condition_is_true) {

   echo Helpers\html($string);die(); 

  }

如果你想调用你的函数而不需要命名空间前缀,那么就删除Helpers.php中的命名空间,但是我建议还是保留它。
贷方:https://dev.to/kingsconsult/how-to-create-laravel-8-helpers-function-global-function-d8n

uoifb46i

uoifb46i9#

使用composer.json并将包含文件(globalhelper.php)的函数放到autoload〉files部分,然后运行
组合器转储自动装入
你可以访问文件(globalhelper.php)中的函数,而不需要调用类名,就像使用默认的php函数一样。

相关问题