PHP Yii Basics
Introduction
Yii is a high-performance, component-based PHP framework designed for developing modern web applications rapidly. The name "Yii" (pronounced as "Yee" or [ji:]) stands for "Yes It Is!" in Chinese, representing simplicity and evolutionary development. First released in 2008, Yii has become one of the most popular PHP frameworks due to its elegant design, extensive features, and excellent performance.
In this guide, we'll cover the fundamental concepts of the Yii framework, how to set it up, and how to build basic applications with it. By the end, you'll have a solid understanding of Yii's architecture and be ready to develop your own web applications.
Why Choose Yii?
Before diving into the technical details, let's understand why you might want to use Yii:
- MVC Architecture: Yii follows the Model-View-Controller (MVC) design pattern, making your code organized and maintainable.
- DRY Principle: Don't Repeat Yourself - Yii encourages code reusability.
- Fast Performance: Yii is optimized for speed with lazy loading techniques.
- Security: Built-in security features protect against common web vulnerabilities.
- Database Abstraction: Work with databases easily through ActiveRecord.
- Extensions: A large ecosystem of plugins and extensions.
Understanding MVC in Yii
Yii is built on the MVC architectural pattern, which separates your application into three main components:
- Model: Represents data and business logic
- View: Handles the presentation and UI
- Controller: Processes user requests and coordinates between Model and View
Installation and Setup
Prerequisites
Before installing Yii, ensure you have:
- PHP 7.3 or higher
- Composer (dependency manager for PHP)
- Basic knowledge of PHP and object-oriented programming
Installing Yii via Composer
# Create a new Yii project
composer create-project --prefer-dist yiisoft/yii2-app-basic basic
# Navigate to the project directory
cd basic
# Start the built-in PHP server
php yii serve
After running these commands, you can access your application at http://localhost:8080
.
Project Structure
When you create a new Yii project, it generates a directory structure like this:
basic/ # Application base path
composer.json # Composer configuration
config/ # Application configurations
console.php # Console application configuration
web.php # Web application configuration
controllers/ # Controller classes
models/ # Model classes
views/ # View files
web/ # Web accessible directory
index.php # Entry script
assets/ # Published asset files
vendor/ # Third-party packages
runtime/ # Runtime files like logs and cache
Creating Your First Yii Application
Let's create a simple "Hello World" application to understand the basics:
1. Create a Controller
Create a file named HelloController.php
in the controllers
directory:
<?php
namespace app\controllers;
use yii\web\Controller;
class HelloController extends Controller
{
public function actionIndex()
{
return $this->render('index');
}
public function actionSayHello($name = 'World')
{
return $this->render('hello', ['name' => $name]);
}
}
2. Create Views
Create a directory named hello
in the views
directory, and add the following files:
views/hello/index.php:
<?php
use yii\helpers\Html;
?>
<div class="hello-index">
<h1>Hello World Application</h1>
<p>This is the index page of our first Yii application.</p>
<p>
<?= Html::a('Say Hello', ['hello/say-hello'], ['class' => 'btn btn-primary']) ?>
</p>
</div>
views/hello/hello.php:
<?php
use yii\helpers\Html;
?>
<div class="hello-greeting">
<h1>Hello, <?= Html::encode($name) ?>!</h1>
<p>Welcome to your first Yii application.</p>
<p>
<?= Html::a('Go Back', ['hello/index'], ['class' => 'btn btn-secondary']) ?>
</p>
</div>
3. Access Your Application
Now, you can access your application at:
http://localhost:8080/index.php?r=hello/index
- For the index pagehttp://localhost:8080/index.php?r=hello/say-hello&name=YourName
- To see a personalized greeting
Example Output
When you visit http://localhost:8080/index.php?r=hello/say-hello&name=Jane
:
Hello, Jane!
Welcome to your first Yii application.
[Go Back]
Working with Models and Forms
Yii makes it easy to work with data models and forms. Let's create a simple contact form:
1. Create a Model
Create a file named ContactForm.php
in the models
directory:
<?php
namespace app\models;
use yii\base\Model;
class ContactForm extends Model
{
public $name;
public $email;
public $subject;
public $message;
public function rules()
{
return [
[['name', 'email', 'subject', 'message'], 'required'],
['email', 'email'],
];
}
}
2. Create a Controller Action
Add a new action to your HelloController.php
:
public function actionContact()
{
$model = new \app\models\ContactForm();
if ($model->load(\Yii::$app->request->post()) && $model->validate()) {
// Process form data here
\Yii::$app->session->setFlash('success', 'Thank you for contacting us. We will respond to you as soon as possible.');
return $this->refresh();
}
return $this->render('contact', [
'model' => $model,
]);
}
3. Create a View
Create a file named contact.php
in the views/hello
directory:
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
?>
<div class="contact-form">
<h1>Contact Us</h1>
<?php if (Yii::$app->session->hasFlash('success')): ?>
<div class="alert alert-success">
<?= Yii::$app->session->getFlash('success') ?>
</div>
<?php endif; ?>
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'name') ?>
<?= $form->field($model, 'email') ?>
<?= $form->field($model, 'subject') ?>
<?= $form->field($model, 'message')->textarea(['rows' => 6]) ?>
<div class="form-group">
<?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
Working with Databases: ActiveRecord
Yii's ActiveRecord provides an elegant way to interact with databases. Let's see how to create a simple model that connects to a database table:
1. Configure Database Connection
Edit the config/db.php
file:
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=yii_basic',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
];
2. Create a Database Table
Run this SQL to create a sample table:
CREATE TABLE `user` (
`id` INT NOT NULL AUTO_INCREMENT,
`username` VARCHAR(255) NOT NULL,
`email` VARCHAR(255) NOT NULL,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
);
3. Create an ActiveRecord Model
Create a file named User.php
in the models
directory:
<?php
namespace app\models;
use yii\db\ActiveRecord;
class User extends ActiveRecord
{
public static function tableName()
{
return 'user';
}
public function rules()
{
return [
[['username', 'email'], 'required'],
['email', 'email'],
['username', 'string', 'min' => 3, 'max' => 50],
];
}
}
4. Using ActiveRecord in Controller
Add these methods to your controller:
public function actionUsers()
{
$users = \app\models\User::find()->all();
return $this->render('users', ['users' => $users]);
}
public function actionCreateUser()
{
$model = new \app\models\User();
if ($model->load(\Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['users']);
}
return $this->render('create-user', ['model' => $model]);
}
Example: Finding and Displaying Users
// Find all users
$users = User::find()->all();
// Find a user by primary key
$user = User::findOne(1);
// Find users with conditions
$activeUsers = User::find()
->where(['status' => 'active'])
->orderBy('username')
->limit(10)
->all();
Building RESTful APIs with Yii
Yii makes it easy to create RESTful APIs. Here's a simple example:
1. Configure URL Rules
Add the following to your config/web.php
:
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
['class' => 'yii\rest\UrlRule', 'controller' => 'api/user'],
],
],
2. Create an API Controller
Create a file named UserController.php
in the controllers/api
directory:
<?php
namespace app\controllers\api;
use yii\rest\ActiveController;
class UserController extends ActiveController
{
public $modelClass = 'app\models\User';
}
Now you can access your API at endpoints like:
GET /api/users
- List all usersGET /api/users/1
- Get user with ID 1POST /api/users
- Create a new userPUT /api/users/1
- Update user with ID 1DELETE /api/users/1
- Delete user with ID 1
Yii Widgets
Yii provides many built-in widgets to help with UI components. Here are a few examples:
GridView for Displaying Data Tables
<?php
use yii\grid\GridView;
use yii\data\ActiveDataProvider;
$dataProvider = new ActiveDataProvider([
'query' => \app\models\User::find(),
'pagination' => [
'pageSize' => 10,
],
]);
echo GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
'id',
'username',
'email',
'created_at',
['class' => 'yii\grid\ActionColumn'],
],
]);
?>
DetailView for Displaying a Single Record
<?php
use yii\widgets\DetailView;
echo DetailView::widget([
'model' => $user,
'attributes' => [
'id',
'username',
'email',
'created_at',
],
]);
?>
Using Behaviors
Behaviors in Yii allow you to enhance the functionality of a class without modifying its code. Here's an example of a timestamp behavior:
<?php
namespace app\models;
use yii\db\ActiveRecord;
use yii\behaviors\TimestampBehavior;
class Article extends ActiveRecord
{
public function behaviors()
{
return [
[
'class' => TimestampBehavior::class,
'createdAtAttribute' => 'created_at',
'updatedAtAttribute' => 'updated_at',
],
];
}
// rest of the model
}
This automatically sets created_at
and updated_at
timestamps when an article is created or updated.
Summary
In this guide, we've covered the basics of the Yii PHP framework:
- Installation and project structure
- MVC architecture in Yii
- Creating controllers and views
- Working with models and forms
- Database operations with ActiveRecord
- Building RESTful APIs
- Using Yii widgets
- Enhancing classes with behaviors
Yii provides a robust foundation for developing web applications with PHP. Its elegant design, performance optimizations, and extensive feature set make it an excellent choice for both beginners and experienced developers.
Additional Resources
Exercises
- Create a simple blog application with posts and comments using Yii.
- Implement user authentication and authorization using Yii's built-in authentication system.
- Build a RESTful API for a resource of your choice (e.g., products, articles).
- Create a form with file uploads and validation.
- Implement a search feature using Yii's query builder.
If you spot any mistakes on this website, please let me know at [email protected]. I’d greatly appreciate your feedback! :)