【问题标题】:Laravel : Calling functions defined in base_controller from viewLaravel:从视图调用定义在 base_controller 中的函数
【发布时间】:2012-11-08 23:43:21
【问题描述】:

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

class Base_Controller extends Controller {

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

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

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

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

编辑

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

所以在应用程序/库中,我使用类创建了文件 AppHelper.php

class AppHelper {

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

并且可以这样称呼它:

$formated = AppHelper::format_something;

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

【问题讨论】:

    标签: php laravel static-classes


    【解决方案1】:

    您可以通过Laravel framework itself 激励自己。

    我将以你的格式化程序为例,并参考 Laravel 框架中的 url 助手。

    首先创建您自己的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);
        }
    }
    

    还有add it 到你的composer.json 文件:

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

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

    $ composer dumpautoload
    

    创建您的service provider 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']);
            });
        }
    }
    

    Register您的服务提供商。 Laravel 框架调用了register 方法,但你只需要将它添加到你的应用配置文件config/app.php

     'providers' => [
    
    
          /*
           * Application Service Providers...
           */
          App\Providers\AppServiceProvider::class,
          // other providers...
          App\Providers\FormatterServiceProvider::class,
    
     ]
    

    最后,创建你的 actual generator 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;
            }
        }
    
    }
    

    您可以选择创建a Facadeapp/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')-&gt;format_that($text) 来在其他地方重用该组件。真的是糖语法。
    • 为什么是服务提供者? 依赖注入。如果您需要使用Request 或想要构建一个复杂的对象,服务提供者会为您处理好,并在您的$app 对象中提供它。

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      • 所以我用类 App_Helpers 创建了一个名为 App_Helpers.php 的库文件,据我所知,start.php 中的自动加载器默认加载库文件夹,是的,我的应用程序似乎仍然没有知道 App_Helpers::format_something() 是什么吗?
      • @Jim - 我认为答案在这里:forums.laravel.com/viewtopic.php?pid=18328#p18328 - 库类名中没有下划线
      • 如果您将文件添加到库文件夹中,它不会自动加载吗?
      • 确实如此,但出于我自己在那个项目上的原因,我想要独立的函数而不是对象,而且(我记得)自动加载器更喜欢类而不是函数列表。
      • 这对我不起作用——它将函数加载到 HTML 中(就在顶部,在其他任何东西之前)但它把它弄出来了——这意味着它不起作用..
      【解决方案3】:

      对我来说正在工作:

      创建目录“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();
      

      【讨论】:

      • 这个方法也很有用,特别是如果你在你的项目中使用了composer。 (仅供参考,此线程适用于 L3)。
      • 使用这种技术,我可以在控制器中调用方法,但不能在模板中调用。我最终想要的是能够在视图模板中执行 {{Notifier::alert('info', 'My info message')}} 。我将如何实现这一目标?
      • 跟随这封信Class 'AppHelper' not found
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      • 1970-01-01
      • 2021-07-03
      • 2019-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多