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.

    Этот ответ был написан для Laravel 3. Для Laravel 4 и после ответа Lajdák Marek, используя автозагрузчик Composer, лучше.

    Такие функции, как format_something() , не входят в контроллер. Контроллер должен просто собирать данные из разных источников и передавать их в представление. Это работа, в основном, просто маршрутизация.

    Я создал папку под названием «помощники» в папке приложения для всех моих маленьких вспомогательных функций. Чтобы обеспечить доступ ко всем моим контроллерам, представлениям и моделям, я включил следующее в файл start.php :

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

    Я подозреваю, что есть лучший способ сделать это, но пока это сработало для меня.

    Для меня работает:

    Создать каталог «помощники» или что угодно и файл:

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

    Вы можете вдохновлять себя на сам дизайн Laravel .

    Я возьму ваш пример форматирования и обратитесь к помощнику url в Laravel Framework.

    Начните с создания собственного файла 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" ] } 

    Запустите эту команду, чтобы воссоздать файл autoload php:

     $ composer dumpautoload 

    Создайте app/Providers/FormatterServiceProvider.php поставщика услуг 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 framework вызывает метод register но вам нужно только добавить его в конфигурационный файл app config/app.php :

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

    Наконец, создайте свое настоящее app/Helpers/FormatGenerator.php класса-генератора 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 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 .