Как использовать Illuminate Database Query Builder & Eloquent в других средах с PHP 5.3.x

В прошлом я занимался парой проектов с Laravel, но теперь мне нужно что-то очень легкое для проекта, и я перешел на использование Slim, он отлично работает для того, что мне нужно, и я хочу замечательный Eloquent ORM и Query Builder из Laravel, не могу обойдемся без него сейчас:) Теперь мне удается заставить все это работать с композитором, используя информацию, которую Тейлор отобразил на своем GitHub, скопировал свой кусок кода

use Illuminate\Database\Capsule\Manager as Capsule;

$capsule = new Capsule;

$capsule->addConnection([
    'driver'    => 'mysql',
    'host'      => 'localhost',
    'database'  => '',
    'username'  => '',
    'password'  => '',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
]);

// Set the event dispatcher used by Eloquent models... (optional)
use Illuminate\Events\Dispatcher;
use Illuminate\Container\Container;
$capsule->setEventDispatcher(new Dispatcher(new Container));

// Set the cache manager instance used by connections... (optional)
$capsule->setCacheManager(...);

// Make this Capsule instance available globally via static methods... (optional)
$capsule->setAsGlobal();

// Setup the Eloquent ORM... (optional; unless you've used setEventDispatcher())
$capsule->bootEloquent();

Это прекрасно работает на моем локальном dev (PHP 5.4.x), но когда я помещаю его на мой сервер PHP 5.3.x, он просто больше не работает:(Теперь я вижу одну проблему в том, что мы не можем использовать анонимный массив как это [] но вместо этого должен быть написан старый способ array(), то есть внутри addConnection(array($settings)) отлично, теперь немного дальше... но потом после того, как он, кажется, падает внутри $capsule->setEventDispatcher() и у меня нет журналов на моем сервере (я только нашел через var_dump() здесь и там), это просто NAS, и я не хочу даже думать о том, чтобы потратить несколько часов, просто чтобы узнать, как его включить. Но что забавно, у меня был проект Laravel 4, работающий с ним... так зачем просто создавать его часть Illuminate\Database не работает тогда? Я также нашел другой кусок кода, чтобы заставить Eloquent ORM работать в PHP 5.3.x

$settings = array(
    'driver' => '',
    'host' => '127.0.0.1',
    'database' => '',
    'username' => '',
    'password' => '',
    'charset'   => "utf8",
    'collation' => 'utf8_general_ci',
    'prefix' => ''
);


// Bootstrap Eloquent ORM
$connFactory = new \Illuminate\Database\Connectors\ConnectionFactory(new Illuminate\Container\Container);
$conn = $connFactory->make($settings);
$resolver = new \Illuminate\Database\ConnectionResolver();
$resolver->addConnection('default', $conn);
$resolver->setDefaultConnection('default');
\Illuminate\Database\Eloquent\Model::setConnectionResolver($resolver);

но если я использую этот кусок кода, что хорошо с моделями, кстати. Мне нужно использовать $conn->table('...')... вместо фасада простой способ DB::table(....) что я хочу, почему это важно, что бы вы сказали? Ну, что если я захочу перейти на Laravel в будущем... Мне придется изменить все $conn-> в DB:: поэтому я предпочел бы сделать это правильно с первого раза. Если кто-то знает, как создать Facade на втором фрагменте кода, я тоже был бы рад... Спасибо за любую помощь.

3 ответа

Решение

Я также использую капсулу с Slim. Прежде всего, убедитесь, что вы используете версию 4.1.* Illuminate/Capsule. Когда вышла 4.2, одним из больших изменений было то, что PHP 5.4 стал необходимым минимумом. 4.1 все еще будет работать с PHP 5.3.

Теперь, если вы сделали это, но у вас все еще есть проблемы, я зарегистрировал капсулу в контейнере IoC Slim:

$app->container->singleton('capsule', function() use ($config) {
    $capsule = new Illuminate\Database\Capsule\Manager;

    $capsule->setFetchMode(PDO::FETCH_OBJ);
    $capsule->addConnection($config['database']);
    $capsule->bootEloquent();

    return $capsule->getConnection();
});

Обратите внимание на призыв к getConnection(), Это необходимо, поскольку Capsule global не регистрируется.

Изменить: также обратите внимание на звонок setFetchMode, При использовании Fluent из Laravel запросы возвращают экземпляры stdClass, но поведение по умолчанию, как представляется, возвращает ассоциативные массивы. Фреймворк просто переопределяет это в какой-то момент, что приводит к тому, что Capsule ведет себя корректно, но неожиданно Это заставляет его работать с более ожидаемым поведением.

Посмотрите на соединитель источника данных Laravel в PPI 2.1

https://github.com/ppi/framework/tree/2.1/PPI/DataSource/Connection

Использование версии 4.1 программы "Светить / база данных"... простой случай с одним подключением:

// $app is a Slim instance

// add db connection parameters to the app config using mysql / utf8

$app->config(array(
    'db' => array(
        'driver'    => 'mysql',
        'host'      => 'locahost',
        'database'  => 'mydbname',
        'username'  => 'myuser',
        'password'  => 'mypass',
        'charset'   => 'utf8',
        'collation' => 'utf8_general_ci',
        'options'   => array(
            \PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'",
        ),
        'prefix'    => '',
    ),
));

// make sure we always use the same service instance

$app->container->singleton('capsule', function($c) use($app) {
    $capsule = new \Illuminate\Database\Capsule\Manager();
    $capsule->addConnection($params);

    return $capsule;
});

// USE IT ANYWHERE the slim $app instance or the slim app container are visible 

$capsule = $app->capsule;
// ...or if $c is the container
// $capsule = $c->get('capsule');
$people = $capsule->table('person')->take(10)->get();

Альтернативный простой в использовании построитель запросов к базе данных:

  • doctrine / dbal (кстати, подсветка / база данных использует доктрину dbal connection)
  • zendframework / zend-db (также предоставляет классы шлюза данных таблицы / шлюза данных строки)
  • j4mie / idiorm
Другие вопросы по тегам