Подтвердить что ты не робот

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.

4b9b3361

Ответ 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.