Как создать внешнюю библиотеку функций в PHP, которые не должны «жить» в моем основном файле класса Symfony 2? - PullRequest
0 голосов
/ 27 февраля 2019

За прошедшие годы я программировал на нескольких языках, включая последние два года на PHP с использованием Symfony 2, где я сейчас занимаюсь разработкой веб-приложения.Однако, в отличие от C #, C ++ или даже простого старого C, мне еще предстоит выяснить, как создать внешний файл библиотеки функций или набор таких файлов, которые я могу легко «включить» в php-файл контроллера Symfony.

Прямо сейчас я помещаю свои функции в каждый php-файл разных контроллеров пакета, которые я пишу.Конечно, это приводит к проблемам с управлением кодом и большими файлами контроллера пакетов, так как я со временем улучшаю функции и блоки кода.

Операторы php require и include / require не очень помогают в этом, потому что вы можетепросто поместить кучу блоков функций / кода в файл include / require, по крайней мере, по моему опыту, без создания класса служебной оболочки.

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

Я знаю, что Symfony поддерживает библиотеки вендоров, но они кажутся слишком сложными, и я пока не нашел «тупого» учебника о том, как их создавать.

Может кто-нибудь указать мне на сайт или книгуэто охватывает то, что я ищу?

Спасибо.

================================================================================ Обновленный вопрос - ошибка новичка с моей стороны.

Вот лишенныйdown версия файла контроллера пакета проекта, над которым я работаю:

<?php
namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
 :
use DateInterval;

class WebAppController extends Controller {

    //
    // Putting the require statement here causes a number of errors.
    // The ' before the common_code is unexpected, as is the trailing ' and ;
    //
    // This is what I had happen when I first tried to include a library of
    // functions that I wanted to use in my bundle controllers, and caused me
    // to think that php could only include code within the function
    // definitions, but not complete functions (definitions and code bodies).
    //

    require 'common_code/fileUtilities.php'; // a file containing a bunch of
                                             // File-Utility functions ...

    /**
     * @Route("/WebApp/profileInt")
     * internal profile page.
     *
     * Parameters: None
     * @return:    Internal profile page response string.
     */

    public function profileIntAction() {
     :

         //
         // Placing the require statement here works, but then the utility
         // functions need to be added to every action function because the
         // functions in the fileUtilities.php file become locally nested
         // with each function.
         //

     :
    }

}

//
// Placing the require statement here also works, and the utility functions
// are 'included' only once in each bundle controller, which is exactly what
// want.
//
?>

Почему-то я упустил возможность использовать оператор require после основного класса в файле контроллера пакета, когда я ранее смотрел на include/ требовать заявления.Я даже спрашивал об этой проблеме раньше в StackOverflow, но, думаю, я не смог уточнить, о чем спрашиваю.

На этот раз ваш ответ помог мне и заставил меня попробовать разные вещи в моем коде... Спасибо!

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Дело не в том, что ваш вопрос не является хорошим или рациональным, просто он не подходит для stackoverflow.Stackoverflow больше подходит для вопросов конкретного типа программирования.Подробнее об этом вы можете прочитать в разделе сайта «Как задавать вопросы».Считай, что тебе повезло, что ты получил только один голос.Я ожидал бы, что это будет быстро закрыто.

Сказав это, я собираюсь соединить вас с одним из моих собственных грехов и использовать ответ не для того, чтобы ответить на вопрос, но чтобы получить немногоДополнительная информация.Я предполагаю, что ваша путаница в основном терминологическая.Твои слова говорят об одном, но я подозреваю, что ты просишь о другом.Это одна из причин, почему stackoverflow любит иметь немного кода в своих вопросах.

В частности:

Операторы php требуют и включают в себя, на самом деле не очень помогают с этим, потому что выя не могу просто поместить кучу блоков функций / кода в файл include / require, по крайней мере, по моему опыту, без создания класса служебной оболочки.

Честно говоря, я не знаю, что вы имеете в видупо «функциям / кодовым блокам».Очевидно, что это работает:

# functions.php
function func1() { echo "func1\n"; }
function func2() { echo "func2\n"; }
function func3() { echo "func3\n"; }

# main.php
require_once 'functions.php';

func1();
func2();
func3();

Не требуется "служебный класс-обертка".Но опять же, я почти уверен, что вы это знаете.

Подумайте над тем, чтобы обновить свой вопрос конкретным примером того, что вы пытались сделать.Даже ваше вступительное заявление об использовании вашего «файла проекта Symfony» очень неясно.У Symfony есть куча файлов, но я не знаю ни одного из них, которые обычно называются файлами проекта.

0 голосов
/ 03 сентября 2019

Я обнаружил, что могу включить файл функций, запрашивая их вне и ниже класса Controller.Функции в файле могут быть полностью объявлены / определены с помощью определения функции и тела, что для меня является улучшением по сравнению с необходимостью разделять определения и тела, как описано в исходном вопросе.

Хотя я мог бы поставить несколькофункций в файле, я не мог поместить «голые» переменные с присваиваниями или переменные с частными / публичными квалификаторами, но это было легко исправить с помощью функции, содержащей статическую переменную и код «set / get», чтобы назначить параметр функции длястатическая переменная в качестве операции 'set', если она указана, и возвращение значения статической переменной в качестве операции 'get'.

Я также узнал, что могу поместить только необходимый файл функции в один из файлов контроллерапотому что помещение его в несколько файлов контроллера вызвало ошибку компилятора переопределения.Однако это привело меня к проблеме, заключающейся в том, что, хотя компилятор «знал» о функциях, включенных в один из контроллеров, только этот контроллер мог успешно вызывать их.Вызов этих функций в других контроллерах приводит к ошибке «Попытка вызвать функцию« test_input »из пространства имен« AppBundle \ Controller »».Без возможности использовать эти функции в более чем одном контроллере, возможность включать их в значительной степени бесполезна для mw.Сейчас я ищу решение, за исключением использования Composer (по причинам, о которых я говорил выше).

0 голосов
/ 27 февраля 2019

Напишите свой код так, чтобы не смешивать определения и код времени выполнения.Обычно это источник всех «проблем» с include.

Это часть стандарта PSR – 1 (поэтому есть инструменты, которые могут автоматизировать проверку этого для вас, например PHP Code Sniffer):

Файлы ДОЛЖНЫ либо объявлять символы (классы, функции, константы и т. Д.), Либо вызывать побочные эффекты (например, генерировать выходные данные, изменять настройки .ini и т. Д.), Но НЕ ДОЛЖНЫ выполнять оба этих действия.

https://www.php -fig.org / psr / psr-1 /

Напишите код с учетом автозагрузки.

Следуйте общим правилам организации кода,Самый простой способ - просто использовать pds / skeleton , который уже провел исследование и описывает общий шаблон.

Упакуйте и получите результат с помощью Composer.Это может показаться «вовлеченным», но, поверьте мне, Composer полностью отрицателен в усилиях.Все, что вы пытаетесь изобрести или сделать «проще», в конечном итоге будет сложнее, чем просто использовать для этого Composer.

...