Symfony
Zend
Symfony 2 - Use Dependency Injection as a standalone component
In this article, we are going to discuss about How to use the Dependency Injection component as a standalone component without using the whole Symfony 2 framework. I will also use ClassLoader from Symfony and just for the sake of the demo I will integrate it with Zend Framework. The code requires PHP 5.3 (mostly for namespaces support).
Create a directory for your project. Inside create "lib" directory. Inside lib, create directory structure: Symfony/Component. Put ClassLoader code inside Component – the easiest thing to do is to clone if from Symfony github:
cd lib/Symfony/Component
git clone https://github.com/symfony/ClassLoader.git
The same goes for DependencyInjection component:
cd lib/Symfony/Component
git clone https://github.com/symfony/DependencyInjection.git
Finally download Zend Framework and put the contents of Zend directory into lib/Zend (so for instance Log.php file will be available in lib/Zend/Log.php).
The actual source code will go into "src" directory, which is a sibling directory of "lib".
Configuring the ClassLoader
DependencyInjection uses namespaces for managing classes, so it needs to be registered with registerNamespace method. Zend Framework follows PEAR naming convention for classes – registerPrefix will do the work for us. Finally, I will register our own code that will be stored in src directory. I will use namespaces as well. Create a new file (let's call it main.php) in the top-level directory:
require_once('lib/Symfony/Component/ClassLoader/UniversalClassLoader.php');
$loader = new Symfony\Component\ClassLoader\UniversalClassLoader();
$loader->registerNamespace('PHPCmsframework',__DIR__.'/src');
$loader->registerNamespace('Symfony',__DIR__.'/lib');
$loader->registerPrefix('Zend',__DIR__.'/lib');
$loader->register();
set_include_path(get_include_path().PATH_SEPARATOR.__DIR__.'/lib');
ClassLoader should now work just fine but we still need set_include_path so require functions inside Zend code will work correctly.
Dependency Injection container
Create a sample class that we'll use for testing. I will call it Test and put it into PHPCmsframework\Techblog, which means it should be located at src/PHPCmsframework/Techblog/Test.php:
namespace PHPCmsframework\Techblog;
class Test
{
private $logger;
public function __construct($logger) {
$this->logger = $logger;
}
public function run() {
$this->logger->info("Running...");
}
}
$logger should be injected using container – here is where we will use Zend_Log class. This one in turn requires a Writer, so we will create it as well. The rest of main.php will look like this:
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;
$sc = new ContainerBuilder();
$sc->register('log.writer','Zend_Log_Writer_Stream')
->addArgument('php://output');
$sc->register('logger', 'Zend_Log')
->addArgument(new Reference('log.writer'));
$sc->register('test','PHPCmsframework\Techblog\Test')
->addArgument(new Reference('logger'));
$sc->get('test')->run();
Running the code should give an output like below:
% php main.php
2011-06-09T15:17:22+01:00 INFO (6): Running...
Create a directory for your project. Inside create "lib" directory. Inside lib, create directory structure: Symfony/Component. Put ClassLoader code inside Component – the easiest thing to do is to clone if from Symfony github:
cd lib/Symfony/Component
git clone https://github.com/symfony/ClassLoader.git
The same goes for DependencyInjection component:
cd lib/Symfony/Component
git clone https://github.com/symfony/DependencyInjection.git
Finally download Zend Framework and put the contents of Zend directory into lib/Zend (so for instance Log.php file will be available in lib/Zend/Log.php).
The actual source code will go into "src" directory, which is a sibling directory of "lib".
Configuring the ClassLoader
DependencyInjection uses namespaces for managing classes, so it needs to be registered with registerNamespace method. Zend Framework follows PEAR naming convention for classes – registerPrefix will do the work for us. Finally, I will register our own code that will be stored in src directory. I will use namespaces as well. Create a new file (let's call it main.php) in the top-level directory:
require_once('lib/Symfony/Component/ClassLoader/UniversalClassLoader.php');
$loader = new Symfony\Component\ClassLoader\UniversalClassLoader();
$loader->registerNamespace('PHPCmsframework',__DIR__.'/src');
$loader->registerNamespace('Symfony',__DIR__.'/lib');
$loader->registerPrefix('Zend',__DIR__.'/lib');
$loader->register();
set_include_path(get_include_path().PATH_SEPARATOR.__DIR__.'/lib');
ClassLoader should now work just fine but we still need set_include_path so require functions inside Zend code will work correctly.
Dependency Injection container
Create a sample class that we'll use for testing. I will call it Test and put it into PHPCmsframework\Techblog, which means it should be located at src/PHPCmsframework/Techblog/Test.php:
namespace PHPCmsframework\Techblog;
class Test
{
private $logger;
public function __construct($logger) {
$this->logger = $logger;
}
public function run() {
$this->logger->info("Running...");
}
}
$logger should be injected using container – here is where we will use Zend_Log class. This one in turn requires a Writer, so we will create it as well. The rest of main.php will look like this:
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;
$sc = new ContainerBuilder();
$sc->register('log.writer','Zend_Log_Writer_Stream')
->addArgument('php://output');
$sc->register('logger', 'Zend_Log')
->addArgument(new Reference('log.writer'));
$sc->register('test','PHPCmsframework\Techblog\Test')
->addArgument(new Reference('logger'));
$sc->get('test')->run();
Running the code should give an output like below:
% php main.php
2011-06-09T15:17:22+01:00 INFO (6): Running...
PHP CMS Frameworks
October 29, 2014
Read more →
CodeIgniter
CodeIgniter – Add Captcha to your website
In this article, we are going to discuss about How to add captcha to your website in CodeIgniter (CI). In CodeIgniter (CI), we have an in-built helper to add captcha named "Captcha Helper". Using Captcha helper, we can easily integrate Captcha into our application. To use this helper we have to load it.
At first we have to create a table for Captcha in our database. It contains four fields.
id => INT, word => TEXT, ip => TEXT, time=>TEXT
Then use the following code.
$this->load->helper('url');
$this->load->helper('string');
$this->load->helper('captcha');
Then declare an array with the following values. This array contains the values needed to create Captcha.
$rand = random_string('numeric', 8);
$vals = array(
'word' => $rand,
'img_path' => './captcha/',
'img_url' => './captcha/',
'img_width' => '150',
'img_height' => 60,
'expiration' => 7200
);
$cap = create_captcha($vals); // Generates Capthca
I would like to explain the values mentioned in this array. First 'word' mentions the random value to be displayed. I generated a random number of length 8 and assigned it to the Captcha word. Next is 'img_path'. This decides the path to the file where generated Captcha image is to be stored. 'img_url' defines the path to be used when displaying the image. As name specifies 'img_width','img_height','expiration' denotes the image width, height and expiration time of Captcha.
Next we have to insert the generated Captcha value into table.
$this->load->model('common_model');
$this->common_model->insert_captcha($cap);
$data['cap'] = $cap;
$this->load->view('welcome_message',$data);
Add the following in your View file.
<p><h3>Enter the following Number</h3></p>
<form action="<?php echo base_url().'index.php/welcome/check' ?>" method="post">
<?php echo $cap['image']; ?><br>
<input type="text" name="captcha" placeholder="Type here.."/>
<br><br>
<input type="submit" value="submit">
</form>
Captcha values are inserted into the table and View is called.
Then on form submission, use the following code.
$expiration = time()-7200; // Two hour limit
$ip = $_SERVER['REMOTE_ADDR'];
$this->load->database();
$this->db->query("DELETE FROM captcha WHERE time < ".$expiration);
// Then see if a captcha exists:
$sql = "SELECT COUNT(*) AS count FROM captcha WHERE word = ? AND ip = ? AND time > ?";
$binds = array($_POST['captcha'], $ip, $expiration);
$query = $this->db->query($sql, $binds);
$row = $query->row();
if ($row->count == 0)
{
echo "You must submit the word that appears in the image";
}
else{
echo "Matches";
}
At first we have to create a table for Captcha in our database. It contains four fields.
id => INT, word => TEXT, ip => TEXT, time=>TEXT
Then use the following code.
$this->load->helper('url');
$this->load->helper('string');
$this->load->helper('captcha');
Then declare an array with the following values. This array contains the values needed to create Captcha.
$rand = random_string('numeric', 8);
$vals = array(
'word' => $rand,
'img_path' => './captcha/',
'img_url' => './captcha/',
'img_width' => '150',
'img_height' => 60,
'expiration' => 7200
);
$cap = create_captcha($vals); // Generates Capthca
I would like to explain the values mentioned in this array. First 'word' mentions the random value to be displayed. I generated a random number of length 8 and assigned it to the Captcha word. Next is 'img_path'. This decides the path to the file where generated Captcha image is to be stored. 'img_url' defines the path to be used when displaying the image. As name specifies 'img_width','img_height','expiration' denotes the image width, height and expiration time of Captcha.
Next we have to insert the generated Captcha value into table.
$this->load->model('common_model');
$this->common_model->insert_captcha($cap);
$data['cap'] = $cap;
$this->load->view('welcome_message',$data);
Add the following in your View file.
<p><h3>Enter the following Number</h3></p>
<form action="<?php echo base_url().'index.php/welcome/check' ?>" method="post">
<?php echo $cap['image']; ?><br>
<input type="text" name="captcha" placeholder="Type here.."/>
<br><br>
<input type="submit" value="submit">
</form>
Captcha values are inserted into the table and View is called.
Then on form submission, use the following code.
$expiration = time()-7200; // Two hour limit
$ip = $_SERVER['REMOTE_ADDR'];
$this->load->database();
$this->db->query("DELETE FROM captcha WHERE time < ".$expiration);
// Then see if a captcha exists:
$sql = "SELECT COUNT(*) AS count FROM captcha WHERE word = ? AND ip = ? AND time > ?";
$binds = array($_POST['captcha'], $ip, $expiration);
$query = $this->db->query($sql, $binds);
$row = $query->row();
if ($row->count == 0)
{
echo "You must submit the word that appears in the image";
}
else{
echo "Matches";
}
PHP CMS Frameworks
October 27, 2014
Read more →
YII
SEO and Clean URLs in YII Framework
In this article, we are going to discuss about How to create a SEO and Clean URLs in Yii PHP Framework. Yii is a modern and robust PHP framework aimed to secure and scalable programming. It is not hardern or more complex compared to the popular PHP frameworks such as CakePHP. It supports all major databases from MySQL to Sqlite. The best is that it is much faster and scalable compared to other frameworks. The latter is what made me reconsider using it over CakePHP.
By default Yii routes all URL requests transparently through the main index.php file and your URLs look like this:
http://example.org/?r=site/page&view=about
Our aim is to make it look:
http://example.org/site/page/view/about
For this purpose follow these steps:
Open your site root protected/config/main.php and uncomment the part about the urlManager so that it looks like this:
'urlManager'=>array(
'urlFormat'=>'path',
'showScriptName'=> false,
'rules'=>array(
'/'=>'/view',
),
),
Add the following lines to your .htaccess (provided you are using Apache or compatible web server):
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php
Last you may wish to drop controller / action from the URL. This can be also done by a custom rule in the urlManager array in protected/config/main.php:
'about'=>'site/page/view/about',
This will ensure that by just going to http://example.org/about you will be routed to http://example.org/site/page/view/about.
By default Yii routes all URL requests transparently through the main index.php file and your URLs look like this:
http://example.org/?r=site/page&view=about
Our aim is to make it look:
http://example.org/site/page/view/about
For this purpose follow these steps:
Open your site root protected/config/main.php and uncomment the part about the urlManager so that it looks like this:
'urlManager'=>array(
'urlFormat'=>'path',
'showScriptName'=> false,
'rules'=>array(
'/'=>'/view',
),
),
Add the following lines to your .htaccess (provided you are using Apache or compatible web server):
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php
Last you may wish to drop controller / action from the URL. This can be also done by a custom rule in the urlManager array in protected/config/main.php:
'about'=>'site/page/view/about',
This will ensure that by just going to http://example.org/about you will be routed to http://example.org/site/page/view/about.
PHP CMS Frameworks
October 15, 2014
Read more →
Magento
Steps to add WYSIWYG editor to Magento backend
In thia article, we are going to discuss about steps to add WYSIWYG editor in Magento admin backend. WYSIWYG editor is a tool that helps easily format or edit text or html code as you want. By adding WYSIWYG editor to your backend, you will have a visual editor rather than dealing with all code.
However, this task seems not as simple as adding other fields. It requires inserting some javascript and css files to make the editor work. Thus this post may be a good resource for you. Just keep on reading and follow the steps below to learn how to add WYSIWYG editor to Magento backend.
Step 1 : Enable WYSIWYG editor in your field
Open the file "app/code/local/[your_name_space]/[your_module]/Block/Adminhtml/[your_block]/Edit/Tabs/Form.php" and add the below codes.
$fieldset->addField('description', 'editor', array(
'label' => Mage::helper('customerreward')->__('Description'),
'title' => Mage::helper('customerreward')->__('Description'),
'class' => 'required-entry',
'required' => true,
'name' => 'description',
'wysiwyg' => true,// enable WYSIWYG editor
));
Step 2: Add js and css files to controller action
You can follow either of these ways:
Step 2.1 : Use PHP code in your controller action:
Open the file "app/code/local/[your_name_space]/[your_module]/controllers/Adminhtml/[controller_name]Controller.php" add the below codes.
$this->getLayout()->getBlock('head')
->setCanLoadExtJs(true)
->setCanLoadTinyMce(true)
->addItem('js','tiny_mce/tiny_mce.js')
->addItem('js','mage/adminhtml/wysiwyg/tiny_mce/setup.js')
->addJs('mage/adminhtml/browser.js')
->addJs('prototype/window.js')
->addJs('lib/flex.js')
->addJs('mage/adminhtml/flexuploader.js')
->addItem('js_css','prototype/windows/themes/default.css')
->addItem('js_css','prototype/windows/themes/magento.css');
Step 2.2 : Use layout file:
Open the file "app/design/adminhtml/default/default/layout.xml" and add the below codes
<referencename="head">
<actionmethod="setCanLoadExtJs"><flag>1</flag></action>
<actionmethod="setCanLoadTinyMce"><flag>1</flag></action>
<actionmethod="addJs"><script>lib/flex.js</script></action>
<actionmethod="addJs"><script>mage/adminhtml/flexuploader.js</script></action>
<actionmethod="addJs"><script>mage/adminhtml/browser.js</script></action>
<actionmethod="addJs"><script>prototype/window.js</script></action>
<actionmethod="addItem"><type>js_css</type><name>prototype/windows/themes/default.css</name></action>
<actionmethod="addItem"><type>js_css</type><name>prototype/windows/themes/magento.css</name></action>
<actionmethod="addItem"><type>js</type><name>mage/adminhtml/wysiwyg/tiny_mce/setup.js</name><params/></action>
<actionmethod="addItem"><type>js</type><name>tiny_mce/tiny_mce.js</name><params/></action>
</reference>
Now, you can view this form shown in your Magento admin backend.
However, this task seems not as simple as adding other fields. It requires inserting some javascript and css files to make the editor work. Thus this post may be a good resource for you. Just keep on reading and follow the steps below to learn how to add WYSIWYG editor to Magento backend.
Step 1 : Enable WYSIWYG editor in your field
Open the file "app/code/local/[your_name_space]/[your_module]/Block/Adminhtml/[your_block]/Edit/Tabs/Form.php" and add the below codes.
$fieldset->addField('description', 'editor', array(
'label' => Mage::helper('customerreward')->__('Description'),
'title' => Mage::helper('customerreward')->__('Description'),
'class' => 'required-entry',
'required' => true,
'name' => 'description',
'wysiwyg' => true,// enable WYSIWYG editor
));
Step 2: Add js and css files to controller action
You can follow either of these ways:
Step 2.1 : Use PHP code in your controller action:
Open the file "app/code/local/[your_name_space]/[your_module]/controllers/Adminhtml/[controller_name]Controller.php" add the below codes.
$this->getLayout()->getBlock('head')
->setCanLoadExtJs(true)
->setCanLoadTinyMce(true)
->addItem('js','tiny_mce/tiny_mce.js')
->addItem('js','mage/adminhtml/wysiwyg/tiny_mce/setup.js')
->addJs('mage/adminhtml/browser.js')
->addJs('prototype/window.js')
->addJs('lib/flex.js')
->addJs('mage/adminhtml/flexuploader.js')
->addItem('js_css','prototype/windows/themes/default.css')
->addItem('js_css','prototype/windows/themes/magento.css');
Step 2.2 : Use layout file:
Open the file "app/design/adminhtml/default/default/layout.xml" and add the below codes
<referencename="head">
<actionmethod="setCanLoadExtJs"><flag>1</flag></action>
<actionmethod="setCanLoadTinyMce"><flag>1</flag></action>
<actionmethod="addJs"><script>lib/flex.js</script></action>
<actionmethod="addJs"><script>mage/adminhtml/flexuploader.js</script></action>
<actionmethod="addJs"><script>mage/adminhtml/browser.js</script></action>
<actionmethod="addJs"><script>prototype/window.js</script></action>
<actionmethod="addItem"><type>js_css</type><name>prototype/windows/themes/default.css</name></action>
<actionmethod="addItem"><type>js_css</type><name>prototype/windows/themes/magento.css</name></action>
<actionmethod="addItem"><type>js</type><name>mage/adminhtml/wysiwyg/tiny_mce/setup.js</name><params/></action>
<actionmethod="addItem"><type>js</type><name>tiny_mce/tiny_mce.js</name><params/></action>
</reference>
Now, you can view this form shown in your Magento admin backend.
PHP CMS Frameworks
October 12, 2014
Read more →
CakePHP
Simple Cakephp 2.x AuthComponent example
In this article, we are going to discuss about How to create a simple AuthComponent in CakePHP 2.x. To make restricted access level site in cakephp we need to implement AuthComponent in cakephp. To apply AuthComponent in cakephp 2.x is similar like to apply AuthComponent in Cakephp 1.x. I think you know cakephp.
Here I described the Authcomponent implementation system for Cakephp 2.x
Step 1 :
Create a users table like bellow
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL,
`password` varchar(255) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`firstname` varchar(255) NOT NULL,
`lastname` varchar(255) DEFAULT NULL,
`address` text,
`mobile` varchar(255) DEFAULT NULL,
`status` tinyint(1) DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
Step 2 :
Create respective UserController, UserModel and view files.
Step 3:
For User Password hashing you need to add the SimplePasswordHasher component in your model table:
// app/Model/User.php
App::uses('AppModel', 'Model');
App::uses('SimplePasswordHasher', 'Controller/Component/Auth');
class User extends AppModel {
// ...
public function beforeSave($options = array()) {
if (isset($this->data[$this->alias]['password'])) {
$passwordHasher = new SimplePasswordHasher();
$this->data[$this->alias]['password'] = $passwordHasher->hash(
$this->data[$this->alias]['password']
);
}
return true;
}
Step 4:
Open your AppController and write the bellow code
// app/Controller/AppController.php
class AppController extends Controller {
public $components = array(
'Session',
'Auth' => array(
'loginRedirect' => array(
'controller' => 'members',
'action' => 'index'
),
'logoutRedirect' => array(
'controller' => 'pages',
'action' => 'display',
'home'
),
'authorize' => array('Controller')
)
);
public function isAuthorized() {
$userDetails = AuthComponent::user();
if($userDetails['group_id'] == 1) return true;
if(!empty($this->permissions[$this->action]))
{
if($this->permissions[$this->action] == '*') return true;
if(in_array($userDetails['group_id'], $this->permissions[$this->action]))
{
return true;
}
}else{
$this->Session->setFlash(__('You are not authorize to access that location.'));
return false;
}
}
}
Step 5:
Go to your user controller and add the following methods:
// app/Controller/UsersController.php
public function beforeFilter() {
parent::beforeFilter();
// Allow all users to register and logout.
$this->Auth->allow('add', 'logout');
}
public function login() {
if ($this->request->is('post')) {
$this->User->set($this->request->data);
if ($this->Auth->login()) {
return $this->redirect($this->Auth->redirect());
}else
{
$this->Session->setFlash('Data Validation Failure', 'default', array('class' => 'cake-error'));
}
}
public function logout() {
return $this->redirect($this->Auth->logout());
}
Step 6:
Create login.ctp file with bellow code:
//app/View/Users/login.ctp
<div class="users form">
<?php echo $this->Session->flash('auth'); ?>
<?php echo $this->Form->create('User'); ?>
<fieldset>
<legend>
<?php echo __('Please enter your username and password'); ?>
</legend>
<?php echo $this->Form->input('username');
echo $this->Form->input('password');
?>
</fieldset>
<?php echo $this->Form->end(__('Login')); ?>
</div>
All done now you can check the AuthComponent action by accessing your application:
Here I described the Authcomponent implementation system for Cakephp 2.x
Step 1 :
Create a users table like bellow
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL,
`password` varchar(255) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`firstname` varchar(255) NOT NULL,
`lastname` varchar(255) DEFAULT NULL,
`address` text,
`mobile` varchar(255) DEFAULT NULL,
`status` tinyint(1) DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
Step 2 :
Create respective UserController, UserModel and view files.
Step 3:
For User Password hashing you need to add the SimplePasswordHasher component in your model table:
// app/Model/User.php
App::uses('AppModel', 'Model');
App::uses('SimplePasswordHasher', 'Controller/Component/Auth');
class User extends AppModel {
// ...
public function beforeSave($options = array()) {
if (isset($this->data[$this->alias]['password'])) {
$passwordHasher = new SimplePasswordHasher();
$this->data[$this->alias]['password'] = $passwordHasher->hash(
$this->data[$this->alias]['password']
);
}
return true;
}
Step 4:
Open your AppController and write the bellow code
// app/Controller/AppController.php
class AppController extends Controller {
public $components = array(
'Session',
'Auth' => array(
'loginRedirect' => array(
'controller' => 'members',
'action' => 'index'
),
'logoutRedirect' => array(
'controller' => 'pages',
'action' => 'display',
'home'
),
'authorize' => array('Controller')
)
);
public function isAuthorized() {
$userDetails = AuthComponent::user();
if($userDetails['group_id'] == 1) return true;
if(!empty($this->permissions[$this->action]))
{
if($this->permissions[$this->action] == '*') return true;
if(in_array($userDetails['group_id'], $this->permissions[$this->action]))
{
return true;
}
}else{
$this->Session->setFlash(__('You are not authorize to access that location.'));
return false;
}
}
}
Step 5:
Go to your user controller and add the following methods:
// app/Controller/UsersController.php
public function beforeFilter() {
parent::beforeFilter();
// Allow all users to register and logout.
$this->Auth->allow('add', 'logout');
}
public function login() {
if ($this->request->is('post')) {
$this->User->set($this->request->data);
if ($this->Auth->login()) {
return $this->redirect($this->Auth->redirect());
}else
{
$this->Session->setFlash('Data Validation Failure', 'default', array('class' => 'cake-error'));
}
}
public function logout() {
return $this->redirect($this->Auth->logout());
}
Step 6:
Create login.ctp file with bellow code:
//app/View/Users/login.ctp
<div class="users form">
<?php echo $this->Session->flash('auth'); ?>
<?php echo $this->Form->create('User'); ?>
<fieldset>
<legend>
<?php echo __('Please enter your username and password'); ?>
</legend>
<?php echo $this->Form->input('username');
echo $this->Form->input('password');
?>
</fieldset>
<?php echo $this->Form->end(__('Login')); ?>
</div>
All done now you can check the AuthComponent action by accessing your application:
PHP CMS Frameworks
October 09, 2014
Read more →
No more posts to load.
About this blog
PHPCMSFramework.com
Tutorials for WordPress, Laravel, Drupal, Joomla, Symfony & more — including AI-powered PHP guides. Publishing since 2012.
Trending posts
- Building a RAG System in Laravel from Scratch
- Steps to create a Contact Form in Symfony With SwiftMailer
- Build a WhatsApp AI Assistant Using Laravel, Twilio and OpenAI
- CIBB - Basic Forum With Codeigniter and Twitter Bootstrap
- Laravel and Prism PHP: The Modern Way to Work with AI Models
- Build an AI Code Review Bot with Laravel — Real-World Use Case
- Drupal 7 - Create your custom Hello World module
- Symfony Framework - Introduction
- A step by step procedure to develop wordpress plugin
- Create Front End Component in Joomla - Step by step procedure