Skip to content

takuya-motoshima/codeigniter-extension

Repository files navigation

codeigniter-extension

You can use extended core classes (controllers, models, views) and utility classes in this package.

API Documentation

API documentation is here.

Demonstration

There is a demo application in demo/. Please use it as a reference for your development.

Release Notes

All changes can be found here.

  • [5.0.1] - 2024/5/14

    Changed

    • Installer program fix. Added process to remove __prototypes__/,__tests__/,phpunit-printer.yml,phpunit.xml after installation.
    • Add client/package-lock.json to skeleton.
  • [5.0.0] - 2024/5/13

    Changed

    • PHP8 support. PHP8 or higher is required.
      To support PHP8, extend the core class of codeigniter-extension in your application.

      application/core/ PHP
      AppController.php abstract class AppController extends \X\Controller\Controller {}
      AppInput.php class AppInput extends \X\Library\Input {}
      AppLoader.php class AppLoader extends \X\Core\Loader {}
      AppModel.php abstract class AppModel extends \X\Model\Model {}
      AppRouter.php class AppRouter extends \X\Core\Router {}
      AppURI.php class AppURI extends \X\Core\URI {}
  • [4.2.0] - 2024/5/13

    Changed

    • Removed the $baseDir argument from the generateCollectionId method of the X\Rekognition\Client class.
    • Deprecated methods message_from_template, message_from_xml, set_mailtype and attachment_cid have been removed from the \X\Util\EMail class.
      Please use messageFromTemplate, messageFromXml, setMailType and attachmentCid instead.
    • Changed to appropriate method name.
      before after
      ImageHelper::putBase64 ImageHelper::writeDataURLToFile
      ImageHelper::putBlob ImageHelper::writeBlobToFile
      ImageHelper::readAsBase64 ImageHelper::readAsDataURL
      ImageHelper::isBase64 ImageHelper::isDataURL
      ImageHelper::convertBase64ToBlob ImageHelper::dataURL2Blob
      ImageHelper::read ImageHelper::readAsBlob
      VideoHelper::putBase64 VideoHelper::writeDataURLToFile
      VideoHelper::isBase64 VideoHelper::isDataURL
      VideoHelper::convertBase64ToBlob VideoHelper::dataURL2Blob

Requirements

  • PHP 7.3.0 or later

  • Composer

  • php-gd

  • php-mbstring

  • php-xml

  • php-imagick
    The method to extract the first frame from a GIF (extractFirstFrameOfGif) in the \X\Util\ImageHelper class requires ImageMagick.
    To use this method, install ImageMagick and php-imagick.

    • For Amazon LInux 2 OS:
      sudo yum -y install ImageMagick php-imagick
    • For Amazon LInux 2023 OS:
      1. Install ImageMagic and PECL.
        sudo dnf -y install ImageMagick ImageMagick-devel php-pear.noarch
      2. Install imagick with PECL.
        sudo pecl install imagick
      3. Add imagick.so link in /etc/php.ini.
        extension=imagick.so
      4. Restart php-fpm and nginx.
        sudo systemctl restart nginx
        sudo systemctl restart php-fpm

Getting Started

  1. Create project.
    composer create-project takuya-motoshima/codeigniter-extension myapp
  2. Grant write permission to logs, cache, session to WEB server.
    sudo chmod -R 755 public/upload application/{logs,cache,session}
    sudo chown -R nginx:nginx public/upload application/{logs,cache,session}
  3. Set up a web server (nginx).
    If you are using Nginx, copy nginx.sample.conf to /etc/nginx/conf.d/sample.conf.
    Restart Nginx.
    sudo systemctl restart nginx
  4. Build a DB for init.sql (MySQL or MariaDB).
  5. The skeleton uses webpack for front module bundling.
    The front module is located in ./client.
    How to build the front module:
    cd client
    npm run build
  6. Open http://{public IP of the server}:3000/ in a browser and the following screen will appear.
    NOTE: You can log in with the username robin@example.com and password password.

    sign-in.png list-of-users.png

    update-user.png personal-settings.png

    page-not-found.png

Usage

See https://codeigniter.com/userguide3/ for basic usage.

  • About config (application/config/config.php).

    Name Before After
    base_url if (!empty($_SERVER['HTTP_HOST'])) $config['base_url'] = '//' . $_SERVER['HTTP_HOST'] . str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);
    enable_hooks FALSE TRUE
    permitted_uri_chars a-z 0-9~%.:_\- a-z 0-9~%.:_\-,
    sess_save_path NULL APPPATH . 'session';
    cookie_httponly FALSE TRUE
    composer_autoload FALSE realpath(APPPATH . '../vendor/autoload.php');
    index_page index.php
  • Control of accessible URLs.

    1. Define a controller to be executed when the root URL is accessed.
      In the example below, the login page is set to open when the root URL is accessed.

      application/config/routes.php:

      $route['default_controller'] = 'users/login';
    2. Define login session name.
      application/config/constants.php:

      const SESSION_NAME = 'session';
    3. Create control over which URLs can be accessed depending on the user's login status.
      At the same time, add env loading and error handling in pre_system.

      application/config/hooks.php:

      use \X\Annotation\AnnotationReader;
      use \X\Util\Logger;
      
      $hook['post_controller_constructor'] = function() {
        if (is_cli())
          return;
        $CI =& get_instance();
        $meta = AnnotationReader::getAccessibility($CI->router->class, $CI->router->method);
        $loggedin = !empty($_SESSION[SESSION_NAME]);
        $current = lcfirst($CI->router->directory ?? '') . lcfirst($CI->router->class) . '/' . $CI->router->method;
        $default = '/users/index';
        $allowRoles = !empty($meta->allow_role) ? array_map('trim', explode(',', $meta->allow_role)) : null;
        if (!$meta->allow_http)
          throw new \RuntimeException('HTTP access is not allowed');
        else if ($loggedin && !$meta->allow_login)
          redirect($default);
        else if (!$loggedin && !$meta->allow_logoff)
          redirect('/users/login');
        else if ($loggedin && !empty($allowRoles)) {
          $role = $_SESSION[SESSION_NAME]['role'] ?? '';
          if (!in_array($role, $allowRoles) && $default !== $current)
            redirect($default);
        }
      };
      
      $hook['pre_system'] = function () {
        $dotenv = Dotenv\Dotenv::createImmutable(ENV_DIR);
        $dotenv->load();
        set_exception_handler(function ($e) {
          Logger::error($e);
          show_error($e->getMessage(), 500);
        });
      };
    4. After this, you will need to create controllers, models, and views, see the demo for details.

  • About Twig Template Engine.
    This extension package uses the Twig template.
    See here for how to use Twig.

    In addition, the session of the logged-in user is automatically set in the template variable.
    This is useful, for example, when displaying the login username on the screen.

    PHP:

    $_SESSION['user'] = ['name' => 'John Smith'];

    HTML:

    {% if session.user is not empty %}
      Hello {{session.user.name}}!
    {% endif %}
      Who is it?
    {% else %}

Testing

The unit test consists of the following files.

  • tests/*.php: Test Case.
  • phpunit.xml: Test setting fill.
  • phpunit-printer.yml: Test result output format.
composer test

PHPDoc

Generate PHPDoc in docs/.

#wget https://phpdoc.org/phpDocumentor.phar
#chmod +x phpDocumentor.phar
php phpDocumentor.phar run -d src/ --ignore vendor --ignore src/X/Database/Driver/ -t docs/

Author

Takuya Motoshima

License

MIT