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 или хотите построить сложный объект, поставщик услуг позаботится об этом для вас и сделает его доступным в вашем