При использовании структуры 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
.