DEV Community

Dimitrios Desyllas
Dimitrios Desyllas

Posted on

Configure Psysh for magento 2.x.

Whilst I was developing in Laravel I used the tinker command:

php artisan tinker
Enter fullscreen mode Exit fullscreen mode

And I wanted this functionality to be in my magento installation. In order to achieve that in my project I made the following files:

./psysh_bootstrap.php

$file = getcwd() . '/app/bootstrap.php';

if(!file_exists($file)){
    return;
}

include_once  $file;
stream_wrapper_restore('phar');

if(class_exists(\Magento\Framework\App\Bootstrap::class)){
    $bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $_SERVER);
    $objectManager = $bootstrap->getObjectManager();

    return $objectManager;
}

Enter fullscreen mode Exit fullscreen mode

Then upon .psysh.php I placed:

return [
    'commands' => [
        new \Psy\Command\ParseCommand,
    ],
    'defaultIncludes' => [
        __DIR__.'/psysh_bootstrap.php'
    ],
    'startupMessage' => "<info>Intecative shell with bootstrap</info>\n<fg=yellow;options=bold>\$objectManager</> contains magento's object manager",
];
Enter fullscreen mode Exit fullscreen mode

But what If I want theese settings globally (in docker specifically)?

There are cases that I did not was to mess project's ./vendor therefore I opted for a global installation.

At the Dockerfile I installed composer and psysh globally:

FROM composer as composer
FROM php

RUN mkdir -p /home/www-data/public_html &&\
    curl -sSLf \
        -o /usr/local/bin/install-php-extensions \
        https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions && \
    chmod +x /usr/local/bin/install-php-extensions


#Install composer
COPY --from=composer /usr/bin/composer /bin/composer
RUN install-php-extensions zip &&\
    chown root:root /bin/composer &&\
    chmod +x /bin/composer &&\
    DEBIAN_FRONTEND=noninteractive apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y git &&\
    apt-get autoremove && apt-get autoclean &&\
    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* cache/* /var/lib/log/*

# Install psysh
RUN php -r "copy('https://psysh.org/psysh','/bin/psysh');" &&\
    chmod +x /bin/psysh &&\
    mkdir -p /var/www/.config/psysh &&\
    chown -R www-data:www-data /var/www/.config &&\
    chmod -R 666 /var/www/.config

VOLUME /var/www/.config/psysh


# Entrypoint configuration
Enter fullscreen mode Exit fullscreen mode

And my minimal entrypoint I could use:

#!/bin/sh

WEB_USER="www-data"

# rest of settings go here

mkdir -p /var/www/.config/psysh

cat > /var/www/.config/psysh/config.php<< EOF
<?php
return [
    'commands' => [
        new \Psy\Command\ParseCommand,
    ],
    'defaultIncludes' => [
        __DIR__.'/psysh_bootstrap.php'
    ],
    'startupMessage' => "<info>Intecative shell with bootstrap</info>\n<fg=yellow;options=bold>\\\$objectManager</> contains magento's object manager",
];
EOF

cat > /var/www/.config/psysh/psysh_bootstrap.php<< EOF
<?php

\$file = getcwd() . '/app/bootstrap.php';

if(!file_exists(\$file)){
    return;
}

include_once  \$file;
stream_wrapper_restore('phar');

if(class_exists(\Magento\Framework\App\Bootstrap::class)){
    \$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, \$_SERVER);
    \$objectManager = \$bootstrap->getObjectManager();

    return \$objectManager;
}
EOF

chown -R ${WEB_USER}:${WEB_USER} /var/www/.config
chown -R ${WEB_USER}:${WEB_USER} /var/www/.config/psysh

# I know I could use 666 but permissions not set correctly if mounted as volume
chmod -R 777 /var/www/.config/psysh
chmod -R 777 /var/www/.config
Enter fullscreen mode Exit fullscreen mode

There fore I could use:

$ psysh
Psy Shell v0.11.22 (PHP 7.4.33 — cli) by Justin Hileman
Intecative shell with bootstrap
$objectManager contains magento's object manager
> $objectManager->get(\Magento\Catalog\Model\Product::class);
= MageGuide\Bundler\Model\Product\Interceptor {#5897}

Enter fullscreen mode Exit fullscreen mode

Top comments (0)

AWS Security LIVE!

Tune in for AWS Security LIVE!

Join AWS Security LIVE! for expert insights and actionable tips to protect your organization and keep security teams prepared.

Learn More