【问题标题】:how to create global function that can be accessed from any controller and blade file如何创建可以从任何控制器和刀片文件访问的全局函数
【发布时间】:2017-05-17 10:02:20
【问题描述】:

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

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

【问题讨论】:

    标签: laravel controller global


    【解决方案1】:

    解决方案

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

    AppHelper 文件

    在您的应用文件夹中创建一个名为 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.phpAppHelper 类创建别名来减少调用完整函数命名空间 \App\Helpers 的开销/strong>

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

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

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

    【讨论】:

    • 嗨!这对我来说似乎很先进。我是否需要始终使用public static function instance() { return new AppHelper(); },然后使用\App\Helpers\AppHelper::instance()-&gt;functionname(); 调用任何函数?
    • 您可以删除实例函数,将所有其他函数设为静态函数,然后直接调用AppHelper::bladeHelper()。实例函数帮助我在构造函数或链函数调用中初始化事物。
    • 只有我,还是你需要做一个composer dump-autoload 让 Laravel 识别新文件?
    【解决方案2】:

    简单的解决方案:

    1. 在您的app 目录中创建一个新的Helpers 文件夹。

    2. 在该Helpers 文件夹中创建一个名为your_helper_function.phpphp 文件。

    3. your_helper_function.php中添加你的函数

      function your_function($parameters){
      
          //function logic
      
      } 
      
      function your_another_function($parameters){
      
          //function logic
      
      } 
      
    4. 将此文件添加到您的composer.jsonFiles 键中

      
      "autoload": {
          ...
          "files": [
              "app/Helpers/your_helper_function.php"
          ]
          ...
      }
      
    5. 然后最后重新生成作曲家自动加载文件。 (在你的项目目录中运行)

      composer dump-autoload

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


    如果您仍有任何困惑,请查看我的博客文章了解如何操作:

    How to Add a Global Function in Laravel Using Composer?

    【讨论】:

    • 嗨 Sapnesh。命令composer dump-autoload 真的是做什么的?它会创建新文件吗?
    • @hijacker83 当你的项目运行时,作曲家将一些文件加载​​到内存中,以获得无缝的编码体验(没有命名空间的麻烦和所有)所以每当你对 composer.json 文件(作曲家使用自动加载依赖项)你应该运行composer dump-autoload,它将转储当前加载的文件并根据更改的配置文件加载。避免问题只是一种好习惯
    • 感谢您的方法。
    • 我认为这是最好的方法
    • 如果你和大团队一起工作或者你正在计划功能,不推荐这种方式,因为它可能是一种“神奇”的方法。其他开发人员可以花很多时间来了解魔术方法是如何进来的。在我看来,Helpers 方法要好得多(使用 config/app.php)。
    【解决方案3】:

    更新:

    第 1 步 在应用程序文件夹中添加文件夹 应用程序->助手

    第 2 步 在 Helper 文件夹中添加 php 类 例如。 Helper.php

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

    namespace App\Helper;
    
    class Helper
    {
    
    }
    

    将此 Helper.php 注册到 config/app.php 文件中

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

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

    如何从 Controller 访问?

    第 1 步 - 在控制器顶部添加命名空间。

    use App\Helper\Helper;
    

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

    $information = Helper::getInformation()
    

    【讨论】:

    • 嗨拉胡尔。这对我有用。我选择答案作为可接受的答案,因为我认为这是最简单的方法。
    • 你在哪里制作文件?它在任何地方吗?
    • @Rahul 您的回答不完整。请更新它,以便用户可以知道 common.php 文件的路径是什么。谢谢。
    • 有没有一种方法可以让该方法在控制器中自动运行,而无需显式调用它?
    • 如何使用别名访问辅助函数?
    【解决方案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));
    }
    

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

    【讨论】:

      【解决方案5】:

      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
            }
        
      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();
        

      【讨论】:

        【解决方案6】:

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

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

        // in app/Http/Controllers/Controller.php
        protected function dummy()
        {
            return 'dummy';
        }
        
        // in homecontroller
        
        $this->dummy();
        

        【讨论】:

          【解决方案7】:

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

          1) 在 Controller.php 中创建一个函数,并使所有其他控制器扩展该控制器。您可以将其与 master.blade.php 进行比较

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

          【讨论】:

          • 我第一次听说这个特征。我在这里找到了有用的文章conetix.com.au/blog/simple-guide-using-traits-laravel-5非常感谢。
          • @hijacker83 不客气,我建议您仔细研究一下,它会让您的代码更干净,而不是让一个文件拥有大量不同的功能,这会变得一团糟。
          【解决方案8】:

          创建全局函数

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-10-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多