Laravel: вызов функций, определенных в базовом контроллере из вида
при использовании Laravel framework, как я могу вызвать функцию, определенную в base_controller, в представлении. Для exacmple:
class Base_Controller extends Controller {
public static function format_something()
{
return something;
}
}
как я могу вызвать format_something () в файле представления?
обычно ошибка, которую я получаю, выглядит примерно так: Метод [link_to_action] не определен в классе представления.
вероятно, глупый вопрос, но спасибо заранее!
редактировать
- ладно! Сначала правильное место, чтобы сделать что-то вроде этого находится в папке "библиотеки". Во-вторых, проблема в том, что ваш класс не может иметь подчеркивания.
поэтому в приложении / библиотеках я сделал файл AppHelper.php с классом
class AppHelper {
public static function format_something()
{
return something;
}
}
и может назвать это так:
$formated = AppHelper::format_something;
Спасибо за помощь и хороший форум найти Boofus McGoofus.
3 ответов
этот ответ был написан для Laravel 3. За что Laravel 4 и после, ответа Lajdák Марека через автозагрузчик Composer лучше.
функции как format_something()
не принадлежат контроллеру. Контроллер должен просто собирать данные из различных источников и передавать их в представление. Это работа в основном просто маршрутизация.
Я создал папку под названием "помощники" в папке приложения для всех моих маленьких функций helpery. Чтобы убедиться, что все мои контроллеры, представления и модели имеют доступ к ним, я добавил следующее в мой :
foreach(glob(path('app').'helpers/*.php') as $filename) {
include $filename;
}
Я подозреваю, что есть лучший способ сделать это, но до сих пор он работал для меня.
для меня работает:
создать каталог "помощники" или что угодно и файл:
// app/helpers/AppHelper.php
class AppHelper {
public static function format_something()
{
return something;
}
}
добавить путь к композитору.в JSON
// composer.json
"autoload": {
"classmap": [
"app/helpers" // <-------- add this line
]
},
Run: (перезагрузите автозапуск)
composer dump-autoload
теперь вы можете позвонить:
$formated = AppHelper::format_something();
вы можете вдохновить себя из сам каркас Laravel.
я возьму ваш пример форматирования и относятся к url
помощник в рамках Laravel.
начните с создания собственного :
<?php
if (! function_exists('format_that')) {
/**
* Generate something
*
* @param string $text
* @return string
*/
function format_that($text)
{
return app('formatter')->format_that($text);
}
}
и добавить на :
"autoload": {
"files": [
"app/helpers/helpers.php"
]
}
выполните эту команду, чтобы воссоздать файл 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 framework вызывает 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
или хотите построить сложный объект, поставщик услуг позаботится об этом для вас и сделает его доступным в вашем