Laravel:从视图中调用base_controller中定义的函数

时间:2012-11-20 20:01:16

标签: php laravel static-classes

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

class Base_Controller extends Controller {

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

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

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

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

修改

好!首先,做这样的事情的正确位置是在libraries文件夹中。 第二,问题是你的班级不能有下划线。

因此,在应用程序/库中,我使用类

创建了AppHelper.php文件
class AppHelper {

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

可以称之为:

$formated = AppHelper::format_something;

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

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分:10)

这个答案是为Laravel 3写的。对于Laravel 4及之后,LajdákMarek使用Composer自动加载器的答案更好。

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

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

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

我怀疑有更好的方法,但到目前为止,它对我有用。

答案 2 :(得分:2)

你可以从Laravel framework itself激励自己。

我将以格式化程序为例,并在Laravel Framework中引用jsonb_array_elements()帮助程序。

首先创建自己的url文件:

helpers.php

add it<?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

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

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

创建service provider $ composer dumpautoload

app/Providers/FormatterServiceProvider.php

Register您的服务提供商。 Laravel框架调用<?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']); }); } } 方法,但您只需将其添加到您的应用配置文件register

config/app.php

最后,创建您的actual generator class 'providers' => [ /* * Application Service Providers... */ App\Providers\AppServiceProvider::class, // other providers... App\Providers\FormatterServiceProvider::class, ]

app/Helpers/FormatGenerator.php

您可以选择创建a Facade <?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; } } } ,以便能够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对象中可用。