takuya-motoshima/codeigniter-extension

Extend CodeIgniter for ease of use

Installs: 4 542

Dependents: 0

Suggesters: 0

Security: 0

Stars: 5

Watchers: 3

Forks: 4

Language:JavaScript

4.1.9 2023-09-15 08:23 UTC

README

You can use extended core classes (controllers, models, views) and utility classes in this package.
Click here to see the change log.

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

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.
    The following command is an example installation on my Amazon Linux2 OS.
    sudo yum -y install ImageMagick php-imagick

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 create-db.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);
        $isLogin = !empty($_SESSION[SESSION_NAME]);
        $currentPath = lcfirst($CI->router->directory ?? '') . lcfirst($CI->router->class) . '/' . $CI->router->method;
        $defaultPath = '/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 ($isLogin && !$meta->allow_login)
          redirect($defaultPath);
        else if (!$isLogin && !$meta->allow_logoff)
          redirect('/users/login');
        else if ($isLogin && !empty($allowRoles)) {
          $role = $_SESSION[SESSION_NAME]['role'] ?? '';
          if (!in_array($role, $allowRoles) && $defaultPath !== $currentPath)
            redirect($defaultPath);
        }
      };
      
      $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 sample 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 %}
  • To extend form validation.
    You can create a new validation rule by creating "application/libraries/AppForm_validation.php" as follows and adding a validation method.

    use X\Library\FormValidation;
    
    class AppForm_validation extends FormValidation {
      public function is_numeric(string $input): bool {
        if (!is_numeric($input)) {
          $this->set_message('is_numeric', 'Please enter a numerical value');
          return false;
        }
        return true;
      }
    }

    The following extended validations are available in the CodeIgniter extension from the start.

    Rule Parameter Description Example
    datetime Yes If the value is other than a date, FALSE is returned.. datetime[Y-m-d H:i:s]
    hostname No If the value is other than the host name, FALSE is returned.
    ipaddress No If the value is other than an IP address, FALSE is returned.
    hostname_or_ipaddress No If the value is other than a host name or IP address, FALSE is returned.
    unix_username No If the value is other than a Unix username, FALSE is returned.
    port No If the value is other than a port number, FALSE is returned.
    email No If the value is other than the email suggested in HTML5, FALSE will be returned.
    https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address

Unit 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.

Run a test.

composer test

Author

Takuya Motoshima

License

MIT