Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?php

use CodeIgniter\Router\RouteCollection;

/**
* @var RouteCollection $routes
*/
$routes->get('/', 'Home::index');
$routes->get('about', 'Pages::about');
$routes->post('login', 'Auth::login');
$routes->get('users/(:num)', 'UserController::show/$1');
$routes->put('users/(:num)', 'UserController::update/$1');
$routes->delete('users/(:num)', 'UserController::delete/$1');

$routes->match(['get', 'post'], 'contact', 'ContactController::handle');

$routes->add('webhook', 'WebhookController::any');

$routes->resource('photos');
$routes->presenter('articles');

$routes->group('admin', function ($routes) {
$routes->get('dashboard', 'AdminController::dashboard');
$routes->get('users', 'AdminController::users');

$routes->group('settings', function ($routes) {
$routes->get('profile', 'AdminSettings::profile');
});
});

$routes->group('api', ['namespace' => 'App\Controllers\Api'], function ($routes) {
$routes->get('status', 'StatusController::index');
$routes->post('items', 'ItemController::create');
});

$routes->group('tenant/(:num)', function ($routes) {
$routes->get('billing', 'BillingController::show');
});

$routes->environment('development', function ($routes) {
$routes->get('debug', 'Debug::index');
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

namespace App\Controllers;

use CodeIgniter\Controller;

class Home extends BaseController
{
public function index()
{
return view('welcome_message');
}
}
6 changes: 6 additions & 0 deletions spec/functional_test/fixtures/php/codeigniter/composer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"require": {
"php": "^8.1",
"codeigniter4/framework": "^4.4"
}
}
7 changes: 7 additions & 0 deletions spec/functional_test/fixtures/php/codeigniter/spark
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/usr/bin/env php
<?php
// CodeIgniter command-line tool
require __DIR__ . '/vendor/autoload.php';

$paths = new Config\Paths();
require rtrim($paths->systemDirectory, '\\/ ') . DIRECTORY_SEPARATOR . 'bootstrap.php';
45 changes: 45 additions & 0 deletions spec/functional_test/testers/php/codeigniter_spec.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
require "../../func_spec.cr"

expected_endpoints = [
Endpoint.new("/", "GET"),
Endpoint.new("/about", "GET"),
Endpoint.new("/login", "POST"),
Endpoint.new("/users/{num}", "GET", [Param.new("num", "", "path")]),
Endpoint.new("/users/{num}", "PUT", [Param.new("num", "", "path")]),
Endpoint.new("/users/{num}", "DELETE", [Param.new("num", "", "path")]),
Endpoint.new("/contact", "GET"),
Endpoint.new("/contact", "POST"),
Endpoint.new("/webhook", "GET"),
Endpoint.new("/webhook", "POST"),
Endpoint.new("/webhook", "PUT"),
Endpoint.new("/webhook", "PATCH"),
Endpoint.new("/webhook", "DELETE"),
Endpoint.new("/photos", "GET"),
Endpoint.new("/photos", "POST"),
Endpoint.new("/photos/new", "GET"),
Endpoint.new("/photos/{id}", "GET", [Param.new("id", "", "path")]),
Endpoint.new("/photos/{id}/edit", "GET", [Param.new("id", "", "path")]),
Endpoint.new("/photos/{id}", "PUT", [Param.new("id", "", "path")]),
Endpoint.new("/photos/{id}", "PATCH", [Param.new("id", "", "path")]),
Endpoint.new("/photos/{id}", "DELETE", [Param.new("id", "", "path")]),
Endpoint.new("/articles", "GET"),
Endpoint.new("/articles/show/{id}", "GET", [Param.new("id", "", "path")]),
Endpoint.new("/articles/new", "GET"),
Endpoint.new("/articles/create", "POST"),
Endpoint.new("/articles/edit/{id}", "GET", [Param.new("id", "", "path")]),
Endpoint.new("/articles/update/{id}", "POST", [Param.new("id", "", "path")]),
Endpoint.new("/articles/remove/{id}", "GET", [Param.new("id", "", "path")]),
Endpoint.new("/articles/delete/{id}", "POST", [Param.new("id", "", "path")]),
Endpoint.new("/admin/dashboard", "GET"),
Endpoint.new("/admin/users", "GET"),
Endpoint.new("/admin/settings/profile", "GET"),
Endpoint.new("/api/status", "GET"),
Endpoint.new("/api/items", "POST"),
Endpoint.new("/tenant/{num}/billing", "GET", [Param.new("num", "", "path")]),
Endpoint.new("/debug", "GET"),
]

FunctionalTester.new("fixtures/php/codeigniter/", {
:techs => 2, # php_codeigniter + php_pure
:endpoints => 40, # 38 CodeIgniter routes + 2 php_pure files (Routes.php, Home.php)
}, expected_endpoints).perform_tests
62 changes: 62 additions & 0 deletions spec/unit_test/detector/php/codeigniter_detector_spec.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
require "../../../spec_helper"
require "../../../../src/detector/detectors/php/*"

describe "Detect CodeIgniter" do
options = create_test_options
instance = Detector::Php::CodeIgniter.new options

it "detects CodeIgniter from composer.json" do
composer_content = <<-JSON
{
"require": {
"php": "^8.1",
"codeigniter4/framework": "^4.4"
}
}
JSON
instance.detect("composer.json", composer_content).should be_true
end

it "detects CodeIgniter from spark CLI script" do
spark_content = <<-PHP
#!/usr/bin/env php
<?php
$paths = new Config\\Paths();
require __DIR__ . '/vendor/autoload.php';
PHP
instance.detect("spark", spark_content).should be_true
end

it "detects CodeIgniter from app/Config/Routes.php" do
routes_content = <<-'PHP'
<?php
use CodeIgniter\Router\RouteCollection;
$routes->get('/', 'Home::index');
PHP
instance.detect("app/Config/Routes.php", routes_content).should be_true
end

it "detects CodeIgniter from CodeIgniter namespace usage" do
controller_content = <<-'PHP'
<?php
namespace App\Controllers;
use CodeIgniter\Controller;
class Home extends BaseController {}
PHP
instance.detect("app/Controllers/Home.php", controller_content).should be_true
end

it "detects CodeIgniter 3 routes file" do
ci3_content = <<-PHP
<?php
$route['default_controller'] = 'home';
$route['products/(:num)'] = 'catalog/product_lookup_by_id/$1';
PHP
instance.detect("application/config/routes.php", ci3_content).should be_true
end

it "does not detect CodeIgniter from non-CodeIgniter files" do
instance.detect("index.php", "<?php echo 'Hello World';").should_not be_true
instance.detect("composer.json", %({"name": "app", "require": {"php": "^8.0"}})).should_not be_true
end
end
1 change: 1 addition & 0 deletions src/analyzer/analyzer.cr
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ def initialize_analyzers(logger : NoirLogger)
{"zap_sites_tree", Specification::ZapSitesTree},
{"php_pure", Php::Php},
{"php_cakephp", Php::CakePHP},
{"php_codeigniter", Php::CodeIgniter},
{"php_laravel", Php::Laravel},
{"php_slim", Php::Slim},
{"php_symfony", Php::Symfony},
Expand Down
Loading