You are viewing revision #1 of this wiki article.
This is the latest version of this article.
This is an extension to Yii 2.0: Write & use a custom Component in Yii2.0 for Advanced Template
Step1: Create a folder named "components" under 'common' in your project root folder.
step2: Write your custom component inside components folder eg: ReadHttpHeader.php
namespace common\components;
use Yii;
use yii\base\Component;
class ReadHttpHeader extends Component {
public function RealIP()
{
$ip = false;
$seq = array('HTTP_CLIENT_IP',
'HTTP_X_FORWARDED_FOR'
, 'HTTP_X_FORWARDED'
, 'HTTP_X_CLUSTER_CLIENT_IP'
, 'HTTP_FORWARDED_FOR'
, 'HTTP_FORWARDED'
, 'REMOTE_ADDR');
foreach ($seq as $key) {
if (array_key_exists($key, $_SERVER) === true) {
foreach (explode(',', $_SERVER[$key]) as $ip) {
if (filter_var($ip, FILTER_VALIDATE_IP) !== false) {
return $ip;
}
}
}
}
}
}
Note: 'common' is defined alias in common/config/bootstrap.php
Step3: Add your component inside the config/main-local.php file (for now!)
<?php
return [
'components' => [
'db' => [
'class' => 'yii\db\Connection',
...
'charset' => 'utf8',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
...
],
'ReadHttpHeader' => [
'class' => 'common\components\ReadHttpHeader'
],
],
];
Step 4: Now this component's methods can be consumed inside any app controller or base controller. Below is my Base Controller called 'AController', from which other controllers may extend
<?php
namespace frontend\controllers;
use Yii;
use yii\web\Controller;
class AController extends Controller {
protected $session = false;
public function actions() {
return [
'error' => [
'class' => 'yii\web\ErrorAction',
],
];
}
public function init() {
parent::init();
// IP essential for prelim DDoS check
if (!$this->cgS('UC-SEC.1a')) {
$ip = Yii::$app->ReadHttpHeader->RealIP();
echo $ip;
}
}
}
O/P is : 174.106.72.79
omer aslam
the config-local.php file you mentioned is the one inside the common folder, means common\config\config-local.php
If you have any questions, please ask in the forum instead.
Signup or Login in order to comment.