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

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

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

AWS Security LIVE!

Hosted by security experts, AWS Security LIVE! showcases AWS Partners tackling real-world security challenges. Join live and get your security questions answered.

Tune in to the full event

DEV is partnering to bring live events to the community. Join us or dismiss this billboard if you're not interested. ❤️