smarty icon indicating copy to clipboard operation
smarty copied to clipboard

Smarty5: installation without composer

Open lifecom opened this issue 10 months ago • 11 comments

Is there any way for installation Smarty 5 without composer?

lifecom avatar Apr 18 '24 20:04 lifecom

With Smarty v4.x there definitely was a way. Checking the docs and the source for v5.x it's not as clear. I would very interested in not using composer as well. If this gets figured out we should update the docs with this info.

scottchiefbaker avatar Apr 18 '24 20:04 scottchiefbaker

This was discussed here Does this solve your problem?

wisskid avatar Apr 19 '24 08:04 wisskid

That's pretty nebulous... I'd really like to see "official" documentation on how to do this. I'm not a huge fan of composer.

scottchiefbaker avatar May 06 '24 23:05 scottchiefbaker

Okay. Every (well, almost every, I guess) composer.json file has this section called "autoload".

For Smarty it currently reads:

"autoload": {
        "psr-4" : {
            "Smarty\\" : "src/"
        },
        "files": [
            "src/functions.php"
        ]
    },

So, register a PSR-4 autoloader for the Smarty namespace that reads from the src folder and include src/functions.php once.

That should do it.

wisskid avatar May 07 '24 21:05 wisskid

For Smarty 4.x my instantiation is:

require("include/smarty/libs/Smarty.class.php");
$smarty = new Smarty();

I've been doing it that way for 8+ years on Smarty 3.x and 4.x. I'd like to do something similar with Smarty 5.x.

require("smarty-5.0.2/src/functions.php");

use Smarty\Smarty;
$smarty = new Smarty();

I get Fatal error: Uncaught Error: Class "Smarty\Smarty" not found in... What am I doing wrong? I'm not familiar with PSR-4 autoloaders.

scottchiefbaker avatar May 08 '24 15:05 scottchiefbaker

FWIW I'm 100% willing to write up some documentation and submit a PR for how load Smarty without composer once I get it working. Clearly there are other people that desire this functionality as well. It would be good to have it in the official documentation.

scottchiefbaker avatar May 08 '24 15:05 scottchiefbaker

I asked ChatGPT to write it, seems like this might work:


spl_autoload_register(function ($class) {
    // Namespace prefix
    $prefix = 'Smarty\\';
    
    // Base directory for the namespace prefix
    $baseDir = __DIR__ . '/a/b/src/';
    
    // Does the class use the namespace prefix?
    $len = strlen($prefix);
    if (strncmp($prefix, $class, $len) !== 0) {
        // If not, move to the next registered autoloader
        return;
    }
    
    // Get the relative class name
    $relativeClass = substr($class, $len);
    
    // Replace namespace prefix with base directory, replace namespace separators with directory separators, and append .php
    $file = $baseDir . str_replace('\\', '/', $relativeClass) . '.php';
    
    // If the file exists, require it
    if (file_exists($file)) {
        require $file;
    }
});

If not, just run composer require smarty/smarty && composer dump-autoload and see what's in vendor/autoload.php

wisskid avatar May 08 '24 16:05 wisskid

FWIW I'm 100% willing to write up some documentation and submit a PR for how load Smarty without composer once I get it working. Clearly there are other people that desire this functionality as well. It would be good to have it in the official documentation.

I am happy with Composer., it makes my life much easier. Writing autoloaders with public constants is long long time ago, I dont miss that

Using Composer, put everything with PSR-4 together and thats it.

Without composer, the day, someone in Smarty decides to load another library with composer you are done.

So I am just curious, why you dont use it?

wblessen avatar May 13 '24 13:05 wblessen

@wblessen my application is very simple. I haven't needed the complexity of composer for any projects yet. Smarty used to be able to be loaded without composer. I'm just trying to keep things simple.

scottchiefbaker avatar May 13 '24 15:05 scottchiefbaker

I reworked some of the above and came up with the following load_smarty.php file that does most of what composer does.

define('SMARTY_DIR', "/home/username/html/include/smarty/src/");

spl_autoload_register(function ($class) {
    // Class prefix
    $prefix = 'Smarty\\';

    // If we are not a member of above class skip
    if (!str_starts_with($class, $prefix)) { return; }

    // Hack off the prefix part
    $relative_class = substr($class, strlen($prefix));

    // Build a path to the include file
    $file = SMARTY_DIR . str_replace('\\', '/', $relative_class) . '.php';

    // If the file exists, require it
    if (file_exists($file))  { require_once($file); }
});

Then in another script I have

require_once("load_smarty.php");

// Instantiate the class
$obj = new Smarty\Smarty();

I need to do some more testing, but this appears to work.

scottchiefbaker avatar May 14 '24 03:05 scottchiefbaker

Don't forget src/functions.php!

wisskid avatar May 14 '24 08:05 wisskid

Oh good call... I wrote up my implementation and submitted a PR to allow using Smarty without Composer.

scottchiefbaker avatar May 14 '24 19:05 scottchiefbaker

Thanks Scott, I was also looking for this when we try to migrate to v5 soon.

On Tue, May 14, 2024 at 9:18 PM Scott Baker @.***> wrote:

Oh good call... I wrote up my implementation and submitted a PR to allow using Smarty without Composer.

— Reply to this email directly, view it on GitHub https://github.com/smarty-php/smarty/issues/999#issuecomment-2110978097, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAI7NGIG5SRQOW2JREA3XBTZCJPR5AVCNFSM6AAAAABGOAHDNCVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDCMJQHE3TQMBZG4 . You are receiving this because you are subscribed to this thread.Message ID: @.***>

juangacovas avatar May 14 '24 20:05 juangacovas

I haven't needed composer yet for my projects so I was looking for this. Thanks.

jasonnug avatar May 14 '24 20:05 jasonnug

It worked without composer. thank you. I think Smarty needs an option without Composer.

emaeba avatar May 29 '24 06:05 emaeba