如何创建可从任何控制器和刀片文件访问的全局功能

时间:2017-05-17 10:02:21

标签: laravel controller global

我有两个控制器文件homecontroller和backendcontroller。创建全局函数并从两个文件访问它的最佳方法是什么?

我发现here Arian Acosta的回答很有帮助,但我想知道是否有最简单的方法。我很感激任何建议。

8 个答案:

答案 0 :(得分:46)

解决方案

执行此操作的一种方法是创建一个类并使用其实例,这样您不仅可以在控制器,刀片或任何其他类中访问类的对象。

AppHelper文件

在你的app文件夹中创建一个名为帮助的文件夹,然后在其中创建一个文件名 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();

答案 1 :(得分:17)

一个简单的解决方案:

  1. Helpers目录中创建一个新的app文件夹。
  2. 在该php文件夹中创建名为your_helper_function.php的{​​{1}}个文件。
  3. Helpers

    中添加您的功能
    your_helper_function.php
  4. 将此文件添加到function your_function($parameters){ //function logic } 的{​​{1}}密钥

    Files
  5. 然后最终重新生成作曲家自动加载文件。 (在项目目录中运行)

    composer.json
  6. 那就是它!现在,您可以在laravel项目的任何部分访问 "autoload": { ... "files": [ "app/Helpers/your_helper_function.php" ] ... }

    如果您希望全局使用多个功能,可以将它们全部放在一个文件中,并将该文件添加到composer dump-autoload your_function()键,如步骤4所示。

    如果您仍然有任何疑惑,请查看我的博文,了解如何执行此操作:

    How to add a Global function in Laravel using Composer?

答案 2 :(得分:5)

使用任何已命名的公用文件。例如。 Common.php并在其中编写所有常用功能。现在,如果要在控制器中访问此常用功能,只需使用“use”包含此Common.php文件。

use Common;

然后您可以访问Common.php中包含的所有常用功能。同样在其他控制器中也可以这样做。

答案 3 :(得分:4)

Controller.php 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));
}

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

答案 4 :(得分:3)

Laravel默认使用名称空间。因此,您需要按照该答案中描述的方法设置帮助文件。

虽然在您的情况下您想要访问不同控制器中的方法。为此,这是一种更简单的方法。向基本控制器app/Http/Controllers/Controller.php添加一个方法,您可以在每个其他控制器中访问它们,因为它们会扩展它。

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

// in homecontroller

$this->dummy();

答案 5 :(得分:1)

有几种方法,具体取决于您尝试添加的确切功能。

1)在Controller.php中创建一个函数,并使所有其他控制器扩展该控制器。你可以在某种程度上与master.blade.php

相提并论

2)创建一个特质,一个特性可以为你做很多事情,并保持你的控制器清洁。我个人喜欢使用特性,因为它看起来很干净,让我的Controller.php不会被大量不同的代码行弄得一团糟。

答案 6 :(得分:1)

Laravel服务提供者方式

我在Laravel中使用全局函数已有一段时间了,我想分享我的操作方法。这篇博文中的2个答案有点混杂: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
        }
    
  2. 创建服务提供商:

     //Into the console
     php artisan make:provider GlobalFunctionsServiceProvider
    
  3. 打开新文件App \ Providers \ GlobalFunctionsServiceProvider.php并编辑注册方法

     //App\Providers\GlobalFunctionsServiceProvider.php
    
     public function register()
     {
         require_once base_path().'/app/Functions/GlobalFunctions.php';
     }
    
  4. 在提供程序中将您的提供程序注册到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
    
  5. 运行一些工匠的命令

     //Into the console
     php artisan clear-compiled
     php artisan config:cache
    
  6. 使用新的全局函数

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

答案 7 :(得分:0)

创建全局函数

在一个文件夹下创建一个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