14

在使用 laravel 框架时,如何在视图中调用 base_controller 中定义的函数。例如:

class Base_Controller extends Controller {

    public static function format_something()
    {
         return something;
    }
}

如何在视图文件中调用 format_something()?

通常我得到的错误看起来像这样:方法 [link_to_action] 没有在 View 类上定义。

可能是一个愚蠢的问题,但提前谢谢!

编辑

好的!首先,执行此类操作的正确位置是在库文件夹中。其次,问题是你的班级不能有下划线。

所以在应用程序/库中,我用类制作了文件 AppHelper.php

class AppHelper {

    public static function format_something()
    {
        return something;
    }
}

并且可以这样称呼它:

$formated = AppHelper::format_something;

感谢您的帮助和良好的论坛找到 Boofus McGoofus。

4

3 回答 3

21

对我来说正在工作:

创建目录“helpers”或其他任何文件:

// app/helpers/AppHelper.php

class AppHelper {

    public static function format_something()
    {
        return something;
    }
}

添加路径到 composer.json

// composer.json

    "autoload": {
        "classmap": [
                    "app/helpers"   // <-------- add this line
        ]
    },

运行:(重新加载自动加载)

composer dump-autoload

现在您可以致电:

$formated = AppHelper::format_something();
于 2013-06-02T16:40:19.013 回答
10

此答案是为 Laravel 3 编写的。对于 Laravel 4 及更高版本,Lajdák Marek 使用 Composer 的自动加载器的答案更好。

format_something()这样的功能不属于控制器。控制器应该只是从各种来源收集数据并将其传递给视图。它的工作主要是路由。

我在应用程序文件夹中为我所有的小助手功能创建了一个名为“helpers”的文件夹。为了确保我的所有控制器、视图和模型都可以访问它们,我在我的start.php文件中包含了以下内容:

foreach(glob(path('app').'helpers/*.php') as $filename) {
    include $filename;
}

我怀疑有更好的方法可以做到这一点,但到目前为止它对我有用。

于 2012-11-20T20:07:17.483 回答
2

你可以从Laravel 框架本身中获得灵感。

我将以您的格式化程序为例,并参考urlLaravel 框架中的帮助程序。

首先创建您自己的helpers.php文件:

<?php

if (! function_exists('format_that')) {
    /**
     * Generate something
     *
     * @param  string  $text
     * @return string
     */
    function format_that($text)
    {
        return app('formatter')->format_that($text);
    }
}

并将其添加到您的composer.json文件中:

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

运行此命令以重新创建自动加载 php 文件:

$ composer dumpautoload

创建您的服务提供商 app/Providers/FormatterServiceProvider.php

<?php

namespace Illuminate\Routing;

use Illuminate\Support\ServiceProvider;
use App\Helpers\FormatGenerator;

class FormatterServiceProvider extends ServiceProvider
{
    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        $this->app['formatter'] = $this->app->share(function ($app) {
            return new FormatGenerator($app['request']);
        });
    }
}

注册您的服务提供商。Laravel 框架调用register方法,但您只需将其添加到您的应用程序配置文件中config/app.php

 'providers' => [


      /*
       * Application Service Providers...
       */
      App\Providers\AppServiceProvider::class,
      // other providers...
      App\Providers\FormatterServiceProvider::class,

 ]

最后,创建您的实际生成器类 app/Helpers/FormatGenerator.php

<?php

namespace App\Helpers;

use Illuminate\Http\Request;

class FormatGenerator
{

    protected $request;

    /**
     * Create a new URL Generator instance.
     *
     * @param  \Illuminate\Routing\RouteCollection  $routes
     * @param  \Illuminate\Http\Request  $request
     * @return void
     */
    public function __construct(Request $request)
    {
        $this->request = $request;
    }

    public function format_that($text){
        if ($request->path() == "home"){
            return mb_strtoupper($text);
        }
        else{
            return $text;
        }
    }

}

您可以选择创建一个 Facade app/Facade/Formatter.php,以便能够执行以下操作Formatter::format_that($text)

<?php

namespace App\Facades;

use Illuminate\Support\Facades\Facade;

/**
 * @see \App\Helpers\FormatGenerator
 */

class Formatter extends Facade
{
    protected static function getFacadeAccessor() { return 'formatter'; }
}

你可以问自己:

  • 为什么是门面?您可以通过简单地调用Formatter::format_that($text)而不是app('formatter')->format_that($text). 糖语法真的。
  • 为什么是服务提供商?依赖注入。如果您需要使用Request或想要构建一个复杂的对象,服务提供者将为您处理并使其在您的$app对象中可用。
于 2016-08-19T16:54:40.983 回答