2012-11-20 87 views
13

在使用laravel框架時,如何在視圖中調用base_controller中定義的函數。例如: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。

回答

10

這個答案是爲Laravel 3編寫的。對於Laravel 4和之後的版本,LajdákMarek使用Composer的自動加載器的答案更好。

format_something()這樣的功能不屬於控制器。控制器應該只是收集來自各種來源的數據並將其傳遞給視圖。它的工作主要是路由。

我已經在應用程序文件夾中創建了一個名爲「helpers」的文件夾,用於我所有的小功能。爲了確保所有的控制器,視圖和模型訪問它們,我已經列入我start.php文件中的以下內容:

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

我懷疑有一個更好的方式來做到這一點,但到目前爲止,它具有爲我工作。

+0

所以我做了所謂的App_Helpers.php帶班App_Helpers,從我可以告訴我的start.php自動加載機加載默認庫文件夾庫文件,是我的應用程序似乎仍不知道App_Helpers :: format_something()是? – Jim

+1

@Jim - 我想答案在這裏:http://forums.laravel.com/viewtopic.php?pid=18328#p18328 - 在庫類名稱中沒有下劃線 –

+0

啊是的!謝謝你很好找! – Jim

20

對我來說就是工作:

創建目錄 「助手」 或任何和文件:

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

此方法也非常有用,特別是如果您使用作曲家在你的項目中。 (FYI這個線程是L3)。 – Jim

+0

我喜歡你的想法,它的作用就像魅力。 – gwinh

+4

使用這種技術,我可以在控制器中調用方法,但不能在模板中調用。我最終想要的是能夠在視圖模板中使用{{Notifier :: alert('info','我的信息')}}。我將如何實現這一目標? – jcorry

2

您可以從Laravel framework itself激勵自己。

我將以您的格式化程序爲例,並參考Laravel Framework中的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 itcomposer.json文件:

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

運行此命令重新自動加載php文件:

$ composer dumpautoload 

創建您的service providerapp/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 classapp/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'; } 
} 

你庫侖d問自己:

  • 爲什麼立面?只需撥打Formatter::format_that($text)而不是app('formatter')->format_that($text)即可在其他位置重新使用組件。糖的語法真的。
  • 爲什麼服務提供商?依賴注射。如果您需要使用Request或想要構建複雜的對象,服務提供商將爲您處理此問題並使其在$app對象中可用。