Laravel: функции вызова, определенные в base_controller из представления
При использовании структуры laravel, как я могу вызвать функцию, определенную в base_controller, в представлении. Для примера:
class Base_Controller extends Controller {
public static function format_something()
{
return something;
}
}
Как я могу вызвать format_something() в файле вида?
Обычно ошибка, которую я получаю, выглядит примерно так: Метод [link_to_action] не определен в классе View.
Наверное, глупый вопрос, но спасибо заранее!
Edit
Хорошо! Сначала правильное место, чтобы сделать что-то подобное, находится в папке библиотек.
Во-вторых, проблема в том, что ваш класс не может иметь подчеркивания.
Итак, в приложении/библиотеках я сделал файл AppHelper.php с классом
class AppHelper {
public static function format_something()
{
return something;
}
}
И можно вызвать его так:
$formated = AppHelper::format_something;
Спасибо за помощь и хороший форум, найдите Boofus McGoofus.
Ответы
Ответ 1
Этот ответ был написан для Laravel 3. Для Laravel 4 и после этого Lajdák Marek лучше ответил на автозагрузчик Composer.
Функции типа format_something()
не входят в контроллер. Контроллер должен просто собирать данные из разных источников и передавать их в представление. Это работа в основном просто маршрутизации.
Я создал папку под названием "помощники" в папке приложения для всех моих вспомогательных функций. Чтобы все мои контроллеры, представления и модели имели к ним доступ, я включил следующее в мой файл start.php
:
foreach(glob(path('app').'helpers/*.php') as $filename) {
include $filename;
}
Я подозреваю, что есть лучший способ сделать это, но пока это сработало для меня.
Ответ 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();
Ответ 3
Вы можете вдохновить себя на "Основание 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
:
<?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
.