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

2019-08-03 00:38发布

在使用laravel框架,我怎么能叫在base_controller定义的函数,在视图中。 对于exacmple:

class Base_Controller extends Controller {

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

我怎么能叫format_something()视图中的文件?

通常我得到的错误看起来是这样的:方法[link_to_action]是不是在视图类中定义。

可能是一个愚蠢的问题,但在此先感谢!

编辑

好的! 首先,正确的地点做这样的事情是在库中的文件夹中。 其次,问题是,你的类不能有下划线。

因此,在应用程序/库我发文件AppHelper.php带班

class AppHelper {

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

并且可以调用它,如:

$formated = AppHelper::format_something;

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

Answer 1:

这个答案是为Laravel 3.书面Laravel 4后,使用Composer的自动加载Lajdák马立克氏回答是好。

像功能format_something()不会在控制器的归属。 该控制器应该仅仅是关于从各种源收集数据,并将其传递到视图。 它的工作是大多只是路由。

我创建了一个在我所有的小helpery功能的应用程序文件夹名为“助手”文件夹中。 为了确保所有的控制器,视图和模型访问它们,我已经包括在我的下面start.php文件:

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

我怀疑有一个更好的方式来做到这一点,但到目前为止,它已经为我工作。



Answer 2:

对我来说工作:

创建目录“助手”或任何和文件:

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


Answer 3:

您可以从激发自己Laravel框架本身 。

我将采取格式化你的例子并参考url在Laravel框架帮手。

通过创建自己的启动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;
        }
    }

}

您可以选择创建一个门面 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对象。


文章来源: Laravel : Calling functions defined in base_controller from view