【问题标题】:Can we Integrate Laravel project as a library in CodeIgniter?我们可以将 Laravel 项目作为库集成到 CodeIgniter 中吗?
【发布时间】:2016-04-22 13:22:49
【问题描述】:

我想通过集成一些用 laravel 编写的代码来增加我的 CodeIgniter 项目的功能?我该如何接近, 我可以通过 CodeIgniter 中的库包含代码吗?如果是怎么办? 我只想在 CI 中包含控制器和 ORM。

Laravel 代码是一种 api fetcher 与其他函数对话 第三方服务。

【问题讨论】:

  • 这完全取决于您拥有的代码。如果它使用了很多 Laravel 特定的类和助手,你需要在 CI 中为它们编写很多包装器,或者重写你的 Laravel 库来使用 CI 类和助手。在 CI 中完全重写它通常更容易。
  • 您要添加整个应用程序吗?或者,也许您只能获得一些功能,例如 Eloquent ORM 和使用它从数据库获取数据的控制器?请更具体地说明 laravel 代码的作用。因为如果你只是用它来向 3rd 方服务发送 API 请求,你可以只包含 Guzzle 或类似的东西。
  • 只能通过库进行包装?任何其他可能的方法?@MagnusEriksson

标签: php codeigniter laravel laravel-5


【解决方案1】:

是的,您可以使用 composer 在您的 CodeIginter 中安装 Laravel 特定的模块/项目、第三方项目。只需在顶部的“index.php”文件中包含autoload

// Composer autoload
require_once __DIR__.'/vendor/autoload.php';

我在我的 CodeIgniter 代码库中使用 Eloquent 作为 ORM。

composer.json 中为您的应用目录创建一个类映射

"autoload": {
    "psr-4": { "YourApp\\": ["application/"] },

使用 Eloquent

要使用Eloquent,您需要创建一个库来设置 Eloquent 以供使用。

/**
 * Capsule setting manager for Illuminate/database
 */
use Illuminate\Database\Capsule\Manager as CapsuleManager;
use Illuminate\Events\Dispatcher;
use Illuminate\Container\Container;

class Capsule extends CapsuleManager {

  public function __construct()
  {
    parent::__construct();

    //Loaded by CI
    if(function_exists('get_instance')) {
      $ci = &get_instance();
      $db = new stdClass;
      $db = $ci->db;
    } else {
      require_once __DIR__.'/../config/database.php';
      $db = (object) $db['default'];
    }

    $this->addConnection(array(
      'driver'    => $db->dbdriver,
      'host'      => $db->hostname,
      'database'  => $db->database,
      'username'  => $db->username,
      'password'  => $db->password,
      'charset'   => $db->char_set,
      'collation' => $db->dbcollat,
      'prefix'    => $db->dbprefix,
    ));

    $this->setEventDispatcher(new Dispatcher(new Container));

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

    // Setup the Eloquent ORM... (optional; unless you've used setEventDispatcher())
    $this->bootEloquent();
  }
}
// END Capsule Class

现在加载自动加载库,你就有了雄辩之美。

同样,您可以使用MonoLog 进行日志记录,Whoops 用于错误显示,Formers\Former 用于表单构建等。

使用哎呀

您可以将此代码放在autload 之后的某个位置,并在您的index.php 中定义CI 环境以使用漂亮的https://github.com/filp/whoops

if (ENVIRONMENT == 'development') {
    $whoops = new \Whoops\Run;
    $whoops->pushHandler(new Whoops\Handler\PrettyPageHandler());
    $whoops->register();
}

您还可以扩展 CI_Router 以在您的 Code Igniter 应用中使用 Laravel 样式的路由。

刀片模板

您可以扩展 CI_Loader 以在 Code Igniter 中使用 Blade 模板。使用此代码在您的 application/core 目录中创建一个新文件 MY_Loader

use Illuminate\Blade\Environment;
use Illuminate\Blade\Loader;
use Illuminate\Blade\View;
class MY_Loader extends CI_Loader {
    public function __construct()
    {
        parent::__construct();
    }
    public function blade($view, array $parameters = array())
    {
        $CI =& get_instance();
        $CI->config->load('blade', true);
        return new View(
            new Environment(Loader::make(
                $CI->config->item('views_path', 'blade'),
                $CI->config->item('cache_path', 'blade')
            )),
            $view, $parameters
        );
    }
}

您可能必须在您的application/config 目录中创建一个配置文件blade.php 来存储blade 的特定配置。

//config/blade.php
$config['views_path'] = APPPATH . 'views/blade/';
$config['cache_path'] = APPPATH . 'cache/blade/';

现在您可以在控制器中执行类似的操作

class Home extends CI_Controller {
    public function index()
    {
        // Prepare some test data for our views
        $array = explode('-', date('d-m-Y'));
        list($d, $m, $y) = $array;
        // Basic view with no data
        echo $this->load->blade('home.index');
        // Passing a single value
        echo $this->load->blade('home.index')->with('day', $d);
        // Multiple values with method chaining
        echo $this->load->blade('home.index')
             ->with('day', $d)
             ->with('month', $m)
             ->with('year', $y);
        // Passing an array
        echo $this->load->blade('home.index', array(
            'day' => $d,
            'month' => $m,
            'year' => $y
        ));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多