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

Где я могу добавить вспомогательные функции Laravel 4, которые могут отображать флэш-сообщения?

Я написал простую функцию display_messages(), которая будет искать Session::get('errors') для данных флэш-памяти и отображать ее на экране.

Где я могу поместить эту функцию? В Codeigniter у вас была папка помощников, в которой вы могли бы использовать все свои маленькие глобальные вспомогательные методы.

4b9b3361

Ответ 1

Как предложил Усман,

  • создать файл /application/libraries/demo.php
  • определить class Demo() { внутри него
  • вызовите функцию следующим образом: {{ Demo::display() }}

Работает, потому что библиотеки и модели автоматически загружаются в start.php 76. Я считаю, что имена файлов должны соответствовать Classnames (note capital).

<?php

class Demo {

    public static function display() {

        if( !$message = Session::get('errors'))
            $message = 'No Errors';

        echo "<pre>print_r($message)</pre>";

    }

}

Не могу понять, почему у меня возникла проблема с использованием classname Common, может быть конфликт (вы могли бы определить пространство имен, если это было важно)...

Ответ 2

Создайте папку helpers в папке приложения и создайте файл application_helper.php. С таким кодом:

// app/helpers/application_helper.php

function display_messages()
{
  exit('Yes');
}

Затем откройте файл composer.json в корне. автозагрузка app/helpers/application_helper.php с композитором files.

"autoload": {
....

    "files": [
        "app/helpers/application_helper.php"
    ]

Готово, теперь вы можете вызвать display_messages().

В некоторых автозагрузчиках может потребоваться выполнить команду composer dump в первый раз.

Ответ 3

Спасибо, memeLab предоставил очень полезный ответ, который мне очень помог. Я просто хотел расширить его ответ, поскольку папка "libraries" не была каталогом автоматической загрузки, по крайней мере, не в версии/текущей версии L4, которую я использую. Также start.php, похоже, был расширен как папка start с global.php, local.php и artisan.php.

Итак, чтобы использовать свои собственные классы для отдельных библиотек или помощников с L4-ленивым автозагрузчиком, вам просто нужно включить какую-либо папку, в которую вы хотите сохранить их, в global.php. Например, я добавил папку libraries в список каталогов.

ClassLoader::addDirectories(array(

    app_path().'/commands',
    app_path().'/controllers',
    app_path().'/models',
    app_path().'/database/seeds',
    // this a custom path
    app_path().'/libraries',

));

Затем любой класс, который вы определяете в этой папке как classname.php, может быть вызван через CLASSNAME::methodName($someVar); в ваших контроллерах.

class CLASSNAME {

    public static function methodName($someVar=NULL) {

        // whatever you want to do...

        return $message;
    }

}

Таким образом, вы можете создать вспомогательный класс и определить различные методы для использования на всех контроллерах. Также будьте осторожны, определяя регулярные функции вне своего класса таким образом, вы будете гореть, потому что они не будут работать (потому что класс не всегда загружается). (например, someFunctionName($someVar); вместо CLASSNAME::methodName($someVar);). Если вы хотите создавать функции таким образом, вам нужно будет убедиться, что он загружен, однако я не буду подробно останавливаться на этом, потому что лучше использовать ленивые классы загрузчика для такие вещи, поэтому вы загружаете только те классы, которые вам действительно нужны.

Еще раз спасибо memeLab и Усману, я бы так далеко не получил их ответов.:)

Ответ 4

Для загрузки Классы:

Создайте app/libraries/class/Message.php и добавьте класс в файл

class Message {
    public static function display() {

    }
}

Добавьте "app/libraries/class" в composer.json

"autoload": {
    "classmap": [
        "app/commands",
        "app/controllers",
        "app/models",
        "app/database/migrations",
        "app/database/seeds",
        "app/tests/TestCase.php",
        "app/libraries/class"
    ]
},

Наконец, запустите composer dump-autoload в командной строке.

Вы можете получить доступ к этому значению Message::display()

Для загрузки простых не-объектов php Функции:

Создайте app/libraries/function/display_messages.php и добавьте функцию в файл

function display_messages() {

}

добавить одну строку в start/global.php

require app_path().'/libraries/function/display_messages.php';

Вы можете получить доступ к этому только через display_messages()

Ответ 5

Добавьте это в app/start/global.php

require app_path().'/config/autoload.php';
require app_path().'/start/loader.php';
App::instance('loader',new loader($autoload));

создайте новый файл loader.php в app/start и добавьте:

class loader{
private $helpers = array();
public $autoload = array(
    'helpers' => array()
);
function __construct($autoload  = array()) {
    if (!empty($autoload))
        $this->autoload = $autoload;
    foreach ($this->autoload as $key => $value)
    {
        $function = strtolower($key);
        $this->$function($value);
    }
}
function helpers($helpers=array())
{
    if (!is_array($helpers))
        $helpers = explode(",",$helpers);
    foreach ($helpers as $key => $value) {
        $this->helper($value);
    }

}
function helper($helper = '',$path = '/')
{
    $folder = app_path().'/helpers'.$path;
    if (file_exists($folder.$helper.'.php') && !in_array($helper, $this->helpers)){
        $this->helpers[] = $helper;
        require $folder.$helper.'.php';
    }
    else{
        $segments = explode('/',$helper);
        if (is_dir($folder.$segments[0])){
            array_shift($segments); 
            $this->helper($segments,$path.$segments[0].'/');
        }
    }
}

}

создайте новый файл autoload.php в app/config и добавьте:

$autoload['helpers'] = array('functions'); // my autoload helpers!

создайте новые помощники папки в приложении /, добавьте свои вспомогательные файлы. (например, myhelper.php)

function myhelper()
{
echo 'helper';
}

в вашем контроллере добавьте:

App::make('loader')->helper('myhelper');
    myhelper();

Ответ 6

В L3 я обычно создавал файл application/libraries/helpers.php и require_once() в моем application/start.php. Подобно тому, как L3 имеет файл laravel/helpers.php.

Я предполагаю, что вы можете сделать что-то подобное в L4.

EDIT: просто глядя на источник, app/start/local.php кажется, что это может быть место.

Ответ 7

Я использовал этот учебник, и я думаю, что это самый простой способ: http://laravel-recipes.com/recipes/50/creating-a-helpers-file

  • Сначала создайте файл app/helpers.php
  • Затем либо загрузите его внизу app\start\global.php, как показано ниже.

    //в нижней части файла  require app_path(). '/helpers.php';

Или измените файл composer.json и выгрузите автозагрузчик.

 {
        "autoload": {
            "files": [
                "app/helpers.php"
            ]
        }
    }

$компот dump-auto

  1. то вы можете написать свои функции в helpers.php и вызвать их из любого места

    function myfunction($result){ 
         return $result;
        }
    

Ответ 8

открыть root_folder/vendor/laravel/framework/src/Illuminate/Support/helpers.php

и вы можете добавить свою функцию

if ( ! function_exists('display_messages'))
{
    function display_messages()
    {
        return ...
    }
}