如何嵌入Symfony2的行动到WordPress?(How to embed Symfony2 a

2019-09-17 16:37发布

我已经研究了很多,并试图出来,但我有点难倒了。

我想设置在WordPress网站,这是另一个家伙和我一起工作很有帮助。 该网站将宣传我们的产品,并提供信息。 然后,用户可以通过一系列的形式注册。 我想写在Symfony2的这一习俗部分(表格等),因为它没有必要被捆绑到WordPress的,它会具有可重复使用的Doctrine2实体来显示数据的用户已签约后(显示发生的WordPress反正外面)。

但是,在设计方面,我们希望整个过程不被中断,并且具有相同的外观和感觉。 因此,表格应在实际的WordPress网页渲染。 我们使用的是定制的,非自由的主题,我讨厌只是一堆WordPress的CSS和头文件复制粘贴到Symfony的意见。

理想情况下,我想就这样定义的WordPress网页可以呈现Symfony2的行动。 所以本身可能显示的动作和过程的形式(应当独立工作的WordPress在说http://example.com/app.php/signup ),但它们通常应在WordPress站点(如页面内显示例如http://example.com/index.php?page_id=2或一个固定链接)。

我一直在研究LowPress,以此来整合(http://www.lowpress.com/),但它确实比我想的方法更受完全移除WordPress主题,用嫩枝主题替换它们。 我试图从它借用一些想法,所以我现在的WordPress在web中的Symfony工程的文件夹,这在我wp-config.php

// ...code omitted
define('WP_DEBUG', true);

define('SYMFONY_DIR', __DIR__.'/../app/');

require_once SYMFONY_DIR.'/bootstrap.php.cache';
require_once SYMFONY_DIR.'/AppKernel.php';
//require_once SYMFONY_DIR.'/AppCache.php';

use Symfony\Component\EventDispatcher\Event;
use Symfony\Component\HttpFoundation\Request;

$kernel = new AppKernel((WP_DEBUG) ? 'dev' : 'prod', WP_DEBUG);
$kernel->loadClassCache();
$kernel->boot();
$GLOBALS['sf2_kernel'] = $kernel;
// save request before WordPress messes with it
$GLOBALS['sf2_request'] = Request::createFromGlobals();

$doctrine = $kernel->getContainer()->get('doctrine');
$conn = $doctrine->getConnection($doctrine->getDefaultConnectionName());

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME',       $conn->getDatabase());

/** MySQL database username */
define('DB_USER',       $conn->getUsername());

/** MySQL database password */
define('DB_PASSWORD',   $conn->getPassword());

/** MySQL hostname */
define('DB_HOST',       $conn->getHost());

/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');

// ...code omitted

因此,所有我现在所得到的是通过共享DB配置parameters.ini在Symfony的。 接下来,我一直试图做一个简单的插件,它采用了短代码,所以我可以呈现一个WordPress页面Symfony2的作用。 以下是我有这么远的想法(这取决于上述引导和它的不完全):

use Symfony\Component\HttpFoundation\Request;

class Symfony2Page
{
    public function render($atts)
    {
        extract(shortcode_atts(array(
            'controller' => 'CroltsMainBundle:Default:index',
        ), $atts));
        $kernel = $GLOBALS['sf2_kernel'];
        $request = $GLOBALS['sf2_request'];
        $request->headers->set('X-Php-Ob-Level', ob_get_level());
        $attributes = array();
        // @TODO fix this

        $kernel->getContainer()->enterScope('request');
        $kernel->getContainer()->set('request', $request, 'request');

        try {
            $response = $kernel->getContainer()->get('http_kernel')->render($controller, $attributes)->getContent();
        } catch (\Exception $e) {
            $kernel->getContainer()->leaveScope('request');

            throw $e;
        }

        $kernel->getContainer()->leaveScope('request');

        return $response;
    }
}

add_shortcode('sf_action', array('Symfony2Page', 'render'));

我的第一个问题是,我不知道如何真正使一些Symfony2的途径,其可以有参数,当给定的$request不会有我需要的信息。 另一个问题是,如果我想要的形式提交,它可能是行不通的,因为这将用户重定向WordPress的,外面的时候我真的可能要了一系列的所有在WordPress页面存在形式。 与此同时,我要的形式是独立的WordPress,使他们对自己的工作。

所以,我想知道这是否是将无法工作,或者是否有某种方式得到它的工作只是一个坏/哈克主意。

我还想到刚使用AJAX来加载在WordPress中Symfony2的代码(假设所有我的用户有使用Javascript功能)的。 作为后备,该页面可能只是去一个Symfony2的,唯一的应用程序,而不是一个WordPress页面中。 那是要更好/更容易? 我能看到的唯一的缺点是,我要保持同步Ajax代码与我的Symfony2的代码。

Answer 1:

Symfony的2允许的框架部分的使用,而不使用整体。

形式是可拆卸的,因为你可以在这里找到一个组件:

http://symfony.com/components

可悲的是,没有太多的文件还没有,所以你必须自己去发现它...

编辑:同样与路由等,如果你希望能够使用symfony路由识别路径随之而来/要做的事情,你必须包括HttpFoundation成分,显然路由。



Answer 2:

当你不想“..just一堆WordPress的CSS和头文件复制粘贴到Symfony的意见”,我建议你嵌入WordPress的页眉和页脚到你的Symfony视图编程。

此外,在看看Silex的 ,因为这比Symfony的低开销和与Symfony的形式运作。

  1. 安装Symfony2中,或捷希凯
  2. 把WordPress的文件在您的网页/文件夹
  3. WP-config.php文件可以住旁边一个文件夹最多composer.json, 这是出于安全反正好
  4. 移动你的Symfony,或Silex的,前端控制器/ s到子文件夹,大概被命名注册/你的情况
  5. 修复需要/包括前端控制器/秒的顶部路径
  6. 在前端控制器/ S的顶部添加一行包括从父文件夹WP-load.php - 这个文件火起来的WordPress,使所有可用的WordPress的功能给你 - 请注意,它必须包含在全局范围内不从函数内部
  7. 调用WordPress的方法get_header();get_footer(); 上面的和Symfony的,或捷希凯,在前端控制器/ s的代码如下。 在Silex的,这只是高于和低于$app->run();

你的文件结构应该是这样的:

vendor/
  |-- Third party libraries 
web/
  |-- WordPress files
  |-- signup/
       |-- Symfony2 or Silex front controller
composer.json
wp-config.php

受此启发后 。



文章来源: How to embed Symfony2 actions into WordPress?