【问题标题】:Where do I put Laravel 4 helper functions that can display flash messages?我在哪里放置可以显示 Flash 消息的 Laravel 4 辅助函数?
【发布时间】:2013-01-31 21:26:52
【问题描述】:

我编写了一个简单的display_messages() 函数,它将在Session::get('errors') 中搜索闪存数据并将其回显到屏幕上。

我把这个函数放在哪里?在 Codeigniter 中,您有一个 helpers 文件夹,您可以在其中粘贴所有小的全局辅助方法。

【问题讨论】:

  • L3 的 HTML::macro() 能力基本上是我用一个助手重新发明*... L4 如何尝试完成同样的事情。如果没有必要,我宁愿不导入 Meido。

标签: php laravel laravel-4


【解决方案1】:

正如乌斯曼所建议的,

  • 创建文件/application/libraries/demo.php
  • 在里面定义一个class Demo() {
  • 像这样调用函数:{{ Demo::display() }}

之所以有效,是因为库和模型在 start.php 第 76 行自动加载。我相信文件名必须与类名匹配(注意大写)。

<?php

class Demo {

    public static function display() {

        if( !$message = Session::get('errors'))
            $message = 'No Errors';

        echo "<pre>print_r($message)</pre>";

    }

}

不太明白为什么我在使用类名 Common 时遇到问题,可能存在冲突(如果这很重要,您可以定义命名空间)...

【讨论】:

  • 对于 Laravel 4,在 app/ 下创建你的 lib 文件夹,在 composer.json 的 autoload 部分添加 lib 路径后运行 'composer dump-autoload' 参见*.com/questions/14572354/…
  • 或者你可以在 ClassLoader::addDirectories() 中修改 global.php 并使用app_path().'/libraries'
  • 你能给出一个代码示例来定义这个实例中的命名空间,然后你如何从某个地方调用“显示”方法
【解决方案2】:

在您的应用文件夹中创建一个文件夹helpers,并创建一个文件application_helper.php。使用这样的代码:

// app/helpers/application_helper.php

function display_messages()
{
  exit('Yes');
}

然后在根目录中打开您的 composer.json 文件。用作曲家files自动加载app/helpers/application_helper.php

"autoload": {
....

    "files": [
        "app/helpers/application_helper.php"
    ]

完成,您现在可以致电display_messages()

某些自动加载器可能需要您首次运行composer dump 命令。

【讨论】:

  • 将函数从类语句中取出是行不通的。此方法仅适用于类自动加载器。
  • display_messages() 将不起作用,除非首先使用 Common 类。帮助程序应该是类库的一部分以使用自动加载,或者在应用程序启动时通过 require/include。否则会出现不一致的情况。
  • @riotCode 很长的 Laravel 3 天回答。更新:)
  • 是的,这很好。我更喜欢将类库用于帮助程序,但这种方式也很有效。
【解决方案3】:

谢谢 memeLab 提供了一个非常有用的答案,对我帮助很大。我只是想扩展他的答案,因为“libraries”文件夹不是自动加载目录,至少在我使用的 L4 的发布/当前版本中不是。此外,start.php 似乎已扩展为带有 global.php、local.php 和 artisan.php 的 start 文件夹。

因此,要将您自己的类用于 L4 惰性自动加载器的单独库或帮助程序,您只需将要存储它们的任何文件夹包含到 global.php 中。例如,我在目录列表中添加了一个libraries 文件夹。

ClassLoader::addDirectories(array(

    app_path().'/commands',
    app_path().'/controllers',
    app_path().'/models',
    app_path().'/database/seeds',
    // this a custom path
    app_path().'/libraries',

));

然后,您在该文件夹中定义为 classname.php 的任何类都可以通过控制器中的 CLASSNAME::methodName($someVar); 调用。

class CLASSNAME {

    public static function methodName($someVar=NULL) {

        // whatever you want to do...

        return $message;
    }

}

因此,您可以通过这种方式创建一个辅助类并定义不同的方法以在整个控制器中使用。还要小心以这种方式在 Class 之外定义常规函数,因为它们不会工作(因为类并不总是被加载)。 (例如someFunctionName($someVar); 而不是CLASSNAME::methodName($someVar);)如果您想以这种方式创建函数,您需要确保已加载,但是我不会详细说明这一点,因为使用惰性加载器类是更好的做法这样的事情,所以你只加载你真正需要的类。

再次感谢 memeLab 和 Usman,如果没有他们的回答,我不会走这么远。 :)

【讨论】:

    【解决方案4】:

    用于加载

    创建app/libraries/class/Message.php,并在文件中添加类

    class Message {
        public static function display() {
    
        }
    }
    

    "app/libraries/class" 添加到composer.json

    "autoload": {
        "classmap": [
            "app/commands",
            "app/controllers",
            "app/models",
            "app/database/migrations",
            "app/database/seeds",
            "app/tests/TestCase.php",
            "app/libraries/class"
        ]
    },
    

    最后在命令行中运行composer dump-autoload

    你可以通过Message::display()访问它

    用于加载普通的非对象 php 函数

    创建app/libraries/function/display_messages.php,并在文件中添加函数

    function display_messages() {
    
    }
    

    在start/global.php中添加一行

    require app_path().'/libraries/function/display_messages.php';
    

    你可以通过display_messages()访问它

    【讨论】:

      【解决方案5】:

      在 app/start/global.php 中添加这个

      require app_path().'/config/autoload.php';
      require app_path().'/start/loader.php';
      App::instance('loader',new loader($autoload));
      

      在 app/start 中新建一个文件 loader.php 并添加:

      class loader{
      private $helpers = array();
      public $autoload = array(
          'helpers' => array()
      );
      function __construct($autoload  = array()) {
          if (!empty($autoload))
              $this->autoload = $autoload;
          foreach ($this->autoload as $key => $value)
          {
              $function = strtolower($key);
              $this->$function($value);
          }
      }
      function helpers($helpers=array())
      {
          if (!is_array($helpers))
              $helpers = explode(",",$helpers);
          foreach ($helpers as $key => $value) {
              $this->helper($value);
          }
      
      }
      function helper($helper = '',$path = '/')
      {
          $folder = app_path().'/helpers'.$path;
          if (file_exists($folder.$helper.'.php') && !in_array($helper, $this->helpers)){
              $this->helpers[] = $helper;
              require $folder.$helper.'.php';
          }
          else{
              $segments = explode('/',$helper);
              if (is_dir($folder.$segments[0])){
                  array_shift($segments); 
                  $this->helper($segments,$path.$segments[0].'/');
              }
          }
      }
      

      }

      在 app/config 中新建一个文件 autoload.php 并添加:

      $autoload['helpers'] = array('functions'); // my autoload helpers!
      

      在 app/ 中创建一个新文件夹 helpers,添加您的帮助文件。 (例如 myhelper.php)

      function myhelper()
      {
      echo 'helper';
      }
      

      在你的控制器中添加:

      App::make('loader')->helper('myhelper');
          myhelper();
      

      【讨论】:

        【解决方案6】:

        在 L3 中,我通常会创建一个 application/libraries/helpers.php 文件,并在我的 application/start.php 中创建 require_once() 它。类似于 L3 的 laravel/helpers.php 文件。

        我假设你可以在 L4 中做类似的事情。

        编辑:只看来源,app/start/local.php 似乎就是这个地方。

        【讨论】:

        • require_once()... 使用具有自动加载器的框架...自动在应用程序中自动加载库?
        • 对这个解决方案不太满意。随意地将一些仅用作视图助手的随机 PHP 函数放入 app/start/helpers.php 并在 app/start/local 中要求它似乎有点糟糕。符合预期?
        • 最初的问题是关于在哪里放置函数。是的,您可以按照 memeLab 和 Usman 的建议将其设为类方法,但这不是他所要求的。
        • app/start/local.php 只会在本地环境中加载。
        【解决方案7】:

        我使用了这个教程,我认为是最简单的方法:http://laravel-recipes.com/recipes/50/creating-a-helpers-file

        1. 首先创建文件app/helpers.php
        2. 然后将其加载到 app\start\global.php 的底部,如下所示。

          //在文件底部 需要 app_path().'/helpers.php';

        或者更改您的 composer.json 文件并转储自动加载器。

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

        $ composer dump-auto

        1. 然后你可以在 helpers.php 中编写你的函数并从任何地方调用它们

          function myfunction($result){ 
               return $result;
              }
          

        【讨论】:

          【解决方案8】:

          打开root_folder/vendor/laravel/framework/src/Illuminate/Support/helpers.php

          你可以添加你的功能

          if ( ! function_exists('display_messages'))
          {
              function display_messages()
              {
                  return ...
              }
          }
          

          【讨论】:

          • 不要试图破解框架的内部结构。这些更改将被 Composer 更新覆盖。
          最近更新 更多