api/README.md

133 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Welcome to the PHP MVC framework
just anoter php mvc framework
only 5 core code file.
very easy to read and modify
只有5个文件的简单php mvc框架易于修改。
view采用twig库作为模板转换语言。
## Starting an application using this framework
1. First, download the framework, either directly or by cloning the repo.
1. Run **composer update** to install the project dependencies.
1. Configure your web server to have the **public** folder as the web root.
1. Open [App/Config.php](App/Config.php) and enter your database configuration data.
1. Create routes, add controllers, views and models.
See below for more details.
## Configuration
Configuration settings are stored in the [App/Config.php](App/Config.php) class. Default settings include database connection data and a setting to show or hide error detail. You can access the settings in your code like this: `Config::DB_HOST`. You can add your own configuration settings in here.
## Routing
The [Router](Core/Router.php) translates URLs into controllers and actions. Routes are added in the [front controller](public/index.php). A sample home route is included that routes to the `index` action in the [Home controller](App/Controllers/Home.php).
Routes are added with the `add` method. You can add fixed URL routes, and specify the controller and action, like this:
```php
$router->add('', ['controller' => 'Home', 'action' => 'index']);
$router->add('posts/index', ['controller' => 'Posts', 'action' => 'index']);
```
Or you can add route **variables**, like this:
```php
$router->add('{controller}/{action}');
```
In addition to the **controller** and **action**, you can specify any parameter you like within curly braces, and also specify a custom regular expression for that parameter:
```php
$router->add('{controller}/{id:\d+}/{action}');
```
You can also specify a namespace for the controller:
```php
$router->add('admin/{controller}/{action}', ['namespace' => 'Admin']);
```
## Controllers
Controllers respond to user actions (clicking on a link, submitting a form etc.). Controllers are classes that extend the [Core\Controller](Core/Controller.php) class.
Controllers are stored in the `App/Controllers` folder. A sample [Home controller](App/Controllers/Home.php) included. Controller classes need to be in the `App/Controllers` namespace. You can add subdirectories to organise your controllers, so when adding a route for these controllers you need to specify the namespace (see the routing section above).
Controller classes contain methods that are the actions. To create an action, add the **`Action`** suffix to the method name. The sample controller in [App/Controllers/Home.php](App/Controllers/Home.php) has a sample `index` action.
You can access route parameters (for example the **id** parameter shown in the route examples above) in actions via the `$this->route_params` property.
### Action filters
Controllers can have **before** and **after** filter methods. These are methods that are called before and after **every** action method call in a controller. Useful for authentication for example, making sure that a user is logged in before letting them execute an action. Optionally add a **before filter** to a controller like this:
```php
/**
* Before filter. Return false to stop the action from executing.
*
* @return void
*/
protected function before()
{
}
```
To stop the originally called action from executing, return `false` from the before filter method. An **after filter** is added like this:
```php
/**
* After filter.
*
* @return void
*/
protected function after()
{
}
```
## Views
Views are used to display information (normally HTML). View files go in the `App/Views` folder. Views can be in one of two formats: standard PHP, but with just enough PHP to show the data. No database access or anything like that should occur in a view file. You can render a standard PHP view in a controller, optionally passing in variables, like this:
```php
View::render('Home/index.php', [
'name' => 'Dave',
'colours' => ['red', 'green', 'blue']
]);
```
The second format uses the [Twig](http://twig.sensiolabs.org/) templating engine. Using Twig allows you to have simpler, safer templates that can take advantage of things like [template inheritance](http://twig.sensiolabs.org/doc/templates.html#template-inheritance). You can render a Twig template like this:
```php
View::renderTemplate('Home/index.html', [
'name' => 'Dave',
'colours' => ['red', 'green', 'blue']
]);
```
A sample Twig template is included in [App/Views/Home/index.html](App/Views/Home/index.html) that inherits from the base template in [App/Views/base.html](App/Views/base.html).
## Models
Models are used to get and store data in your application. They know nothing about how this data is to be presented in the views. Models extend the `Core\Model` class and use [PDO](http://php.net/manual/en/book.pdo.php) to access the database. They're stored in the `App/Models` folder. A sample user model class is included in [App/Models/User.php](App/Models/User.php). You can get the PDO database connection instance like this:
```php
$db = static::getDB();
```
## Errors
If the `SHOW_ERRORS` configuration setting is set to `true`, full error detail will be shown in the browser if an error or exception occurs. If it's set to `false`, a generic message will be shown using the [App/Views/404.html](App/Views/404.html) or [App/Views/500.html](App/Views/500.html) views, depending on the error.
## Web server configuration
Pretty URLs are enabled using web server rewrite rules. An [.htaccess](public/.htaccess) file is included in the `public` folder. Equivalent nginx configuration is in the [nginx-configuration.txt](nginx-configuration.txt) file.
---
Signup for the course [here](https://www.udemy.com/php-mvc-from-scratch/?couponCode=githubpa1) on Udemy and understand how this framework is built from scratch, putting it all together step by step.