我想创建帮助函数,以避免在Laravel视图之间重复代码。例如:

view.blade.php

<p>Foo Formated text: {{ fooFormatText($text) }}</p>

它们基本上是文本格式化函数。我应该如何定义全局可用的帮助函数,如fooFormatText()?


当前回答

Laravel 5中的自定义类,简单的方法

这个答案适用于Laravel中的一般自定义类。有关更多Blade的具体答案,请参阅Laravel 5中的自定义Blade指令。

步骤1:创建您的Helpers(或其他自定义类)文件,并给它一个匹配的名称空间。编写你的类和方法:

<?php // Code within app\Helpers\Helper.php

namespace App\Helpers;

class Helper
{
    public static function shout(string $string)
    {
        return strtoupper($string);
    }
}

步骤2:创建别名:

<?php // Code within config/app.php

    'aliases' => [
     ...
        'Helper' => App\Helpers\Helper::class,
     ...

步骤3:在项目根目录下运行composer dump-autoload

第四步:在你的Blade模板中使用它:

<!-- Code within resources/views/template.blade.php -->

{!! Helper::shout('this is how to use autoloading correctly!!') !!}

额外学分:在你的Laravel应用程序的任何地方使用这个类:

<?php // Code within app/Http/Controllers/SomeController.php

namespace App\Http\Controllers;

use Helper;

class SomeController extends Controller
{

    public function __construct()
    {
        Helper::shout('now i\'m using my helper class in a controller!!');
    }
    ...

来源:http://www.php-fig.org/psr/psr-4/

为什么它可以工作:https://github.com/laravel/framework/blob/master/src/Illuminate/Support/ClassLoader.php

自动装填的来源: http://php.net/manual/en/language.oop5.autoload.php

其他回答

创建自定义助手目录: 首先在app目录中创建Helpers目录。 创建hlper类定义: 现在让我们创建一个简单的辅助函数,它将连接两个字符串。在/app/Helpers/MyFuncs.php中创建一个新文件MyFuncs.php

<?php

namespace App\Helpers;

class MyFuncs {

    public static function full_name($first_name,$last_name) {
        return $first_name . ', '. $last_name;   
    }
}

名称空间的应用程序\助手;在App namespace下定义了Helpers命名空间。 类MyFuncs{…}定义了帮助类MyFuncs。 公共静态函数full_name($first_name,$last_name){…}定义了一个静态函数,它接受两个字符串形参并返回一个连接的字符串

帮工服务提供类

服务提供者用于自动加载类。我们需要定义一个服务提供者,它将加载/app/Helpers目录下的所有helper类。

执行以下artisan命令:

php工匠使:提供者HelperServiceProvider

该文件将创建在/app/Providers/HelperServiceProvider.php中

Open /app/Providers/HelperServiceProvider.php

添加如下代码:

<?php 

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class HelperServiceProvider extends ServiceProvider {

   /**
    * Bootstrap the application services.
    *
    * @return void
    */
   public function boot()
   {
      //
   }

   /**
    * Register the application services.
    *
    * @return void
    */
   public function register()
   {
        foreach (glob(app_path().'/Helpers/*.php') as $filename){
            require_once($filename);
        }
   }
}

在这里,

namespace App\Providers; defines the namespace provider
use Illuminate\Support\ServiceProvider; imports the ServiceProvider class namespace
class HelperServiceProvider extends ServiceProvider {…} defines a class HelperServiceProvider that extends the ServiceProvider class
public function boot(){…} bootstraps the application service
public function register(){…} is the function that loads the helpers
foreach (glob(app_path().'/Helpers/*.php') as $filename){…} loops through all the files in /app/Helpers directory and loads them.

现在我们需要注册HelperServiceProvider并为我们的助手创建一个别名。

打开/config/app.php文件

找到providers数组变量

添加以下行

App\Providers\HelperServiceProvider::class,

定位aliases数组变量

添加以下行

'MyFuncs' => App\Helpers\MyFuncs::class,

保存更改 使用我们的自定义助手

我们将创建一个调用自定义帮助函数Open /app/routes.php的路由

添加以下路由定义

Route::get('/func', function () {
    return MyFuncs::full_name("John","Doe");
});

在这里,

return MyFuncs::full_name("John","Doe"); calls the static function full_name in MyFuncs class

Laravel 5中的自定义类,简单的方法

这个答案适用于Laravel中的一般自定义类。有关更多Blade的具体答案,请参阅Laravel 5中的自定义Blade指令。

步骤1:创建您的Helpers(或其他自定义类)文件,并给它一个匹配的名称空间。编写你的类和方法:

<?php // Code within app\Helpers\Helper.php

namespace App\Helpers;

class Helper
{
    public static function shout(string $string)
    {
        return strtoupper($string);
    }
}

步骤2:创建别名:

<?php // Code within config/app.php

    'aliases' => [
     ...
        'Helper' => App\Helpers\Helper::class,
     ...

步骤3:在项目根目录下运行composer dump-autoload

第四步:在你的Blade模板中使用它:

<!-- Code within resources/views/template.blade.php -->

{!! Helper::shout('this is how to use autoloading correctly!!') !!}

额外学分:在你的Laravel应用程序的任何地方使用这个类:

<?php // Code within app/Http/Controllers/SomeController.php

namespace App\Http\Controllers;

use Helper;

class SomeController extends Controller
{

    public function __construct()
    {
        Helper::shout('now i\'m using my helper class in a controller!!');
    }
    ...

来源:http://www.php-fig.org/psr/psr-4/

为什么它可以工作:https://github.com/laravel/framework/blob/master/src/Illuminate/Support/ClassLoader.php

自动装填的来源: http://php.net/manual/en/language.oop5.autoload.php

首先在App\Helpers\Helper.php中创建你的Helper文件/类 就像:

<?php

namespace App\Helpers;

class Helper {

    // Your customer public function
}

然后在Composer.json中定义它 在交通量 然后运行composer dump-autoload

在SO和谷歌上筛选了各种各样的答案后,我仍然没有找到一个最佳的方法。大多数答案建议我们离开应用程序,依靠第三方工具Composer来完成工作,但我不相信仅仅为了包含一个文件而耦合到一个工具是明智的。

Andrew Brown的回答最接近我认为应该如何处理它,但是(至少在5.1中),服务提供者步骤是不必要的。Heisian的回答强调了PSR-4的使用,这让我们更接近了一步。下面是视图中helper的最终实现:

首先,在你的app目录中创建一个helper文件,命名空间为:

namespace App\Helpers;

class BobFinder
{
    static function bob()
    {
        return '<strong>Bob?! Is that you?!</strong>';
    }
}

接下来,在config\app.php中,在aliases数组中为你的类添加别名:

'aliases' => [
    // Other aliases
    'BobFinder' => App\Helpers\BobFinder::class
]

这就是你需要做的。PSR-4和别名应该向你的视图公开helper,所以在你的视图中,如果你输入:

{!! BobFinder::bob() !!}

它应该输出:

<strong>Bob?! Is that you?!</strong>

对于我的Laravel项目中的自定义助手库,我在我的Laravel/App目录中创建了一个名为Libraries的文件夹,在Libraries目录中,我为不同的助手库创建了各种文件。

在创建我的助手文件后,我简单地将所有这些文件包含在我的composer中。这样的Json文件

...
"autoload": {
        "classmap": [
            "database"
        ],
        "files": [
            "app/Libraries/commonFunctions.php"
        ],
        "psr-4": {
            "App\\": "app/"
        }
    },
...

和执行

composer dump-autoload