Felhasználói eszközök

Eszközök a webhelyen


oktatas:web:back-end_framework:cakephp

< Back-end framework

CakePHP

A CakePHP

Gyors, letisztult, könnyen használható PHP keretrendszer.

Webhely:

Kezdés

Szükségünk van a composer-re.

Projekt készítése:

composer create-project --prefer-dist cakephp/app:~4.3 projekt01

Projekt létrehozása az aktuális könyvtárba:

composer create-project --prefer-dist cakephp/app:~4.3 .

Egyszerűen:

composer create-project cakephp/app app01

Könyvtársturktúra

app01/
  |-bin/
  |-config/
  |-logs/
  |-plugins/
  |-resources/
  |-src/
  |  |-Console/
  |  |-Controller/
  |  |-Model/
  |  `-View/
  |-templates/
  |-tests/
  |-tmp/
  |-vendor/
  |-webroot/
  |-composer.json
  |-index.php
  |-phpcs.xml
  |-phpstan.neon
  |-phpunit.xml.dist
  `-README.md

Fejlesztői szerver

bin/cake server

Van egy alap weblap:

Adatbázis

Létre kell hozni az adatbázist, táblákkal együtt.

create database app01
character set utf8
collate utf8_hungarian_ci;
grant all privileges
on app01.*
to app01@localhost
identified by 'titok';

A CakePHP-ban az adatbázisban hozzuk létre a táblát, a ORM ebből készít osztályt.

create table employees (
  id int not null primary key auto_increment,
  name varchar(50),
  city varchar(50),
  salary double
);

Adatbázis elérése

app_local.php

Másik lehetőség az app_local.php fájl szerkesztése.

Szerkesszük a config/app_local.php állományt.

        'default' => [
            'host' => 'localhost',
            'username' => 'app01',
            'password' => 'titok',
            'database' => 'app01',
            'url' => env('DATABASE_URL', null),
        ],

Generálás

Generáljunk modellt és kontrollert:

bin/cake bake model employees

A modell létrehozásához előbb létre kell hozni az adatbázist a táblával együtt. A modell létrejön a tábla alapján.

Létrejön az src/Model/Entity/Employee.php fájl.

Hozzuk létre a kontrollert:

bin/cake bake controller employees

Létrejön az src/Controller/EmployeeController.php fájl.

Routing

Szerkesszük a routingot:

// config/routes.php
 
     //...
     $routes->scope('/api', function (RouteBuilder $builder) {
            $builder->setExtensions(['json']);
            $builder->resources('Employees');
     });

A routingot most API számára állítottuk be.

Összes lekérdezése

Szerkesszük a kontrollert:

src/Controller/EmployeesController.php
    public function index()
    {
        $employees = $this->Employees->find('all')->all();
        $this->set('employees', $employees);
        $this->viewBuilder()->setOption('serialize', ['employees']);
    }

Nézzük meg API kliensben:

Végpont Metódus
api/employees.json get

CSRF token beállítása

A POST, PUT, PATCH, DELETE metódusoknak CSRF tokenhez vannak kötve.

Az eredeti CSRF beállítást finomítjuk:

src/Application.php
    public function middleware(MiddlewareQueue $middlewareQueue): MiddlewareQueue
    {
        $middlewareQueue
            ->add(new ErrorHandlerMiddleware(Configure::read('Error')))
            ->add(new AssetMiddleware([
                'cacheTime' => Configure::read('Asset.cacheTime'),
            ]))
            ->add(new RoutingMiddleware($this))
            ->add(new BodyParserMiddleware()); //Hamarabb lezárjuk a láncot
 
            //Az útvonal kizárása:
            $csrf = new CsrfProtectionMiddleware();
            $csrf->skipCheckCallback(function ($request) {
                if ($request->getParam('_matchedRoute') == '/api/employees') {
                    return true;
                }
            });
            $middlewareQueue->add($csrf);
 
        return $middlewareQueue;
    }

Az összes /api kezdetű végpontot is megadhatunk:

            $csrf->skipCheckCallback(function ($request) {
                $endpoint = $request->getParam('_matchedRoute');
                if (  preg_match('/^\/api/', $endpoint)) {
                    return true;
                }
            });

Hozzáadás

src/Controller/EmployeesController.php
    public function add()
    {
        $this->request->allowMethod(['post']);
        $employee = $this->Employees->newEntity($this->request->getData());
        if ($this->Employees->save($employee)) {
            $message = 'Saved';
        } else {
            $message = 'Error';
        }
        $this->set([
            'message' => $message,
            'employee' => $employee,
        ]);
        $this->viewBuilder()->setOption('serialize', ['employee', 'message']);
    }
Végpont Metódus
api/employees.json post
{
	"name": "Tagadó Árpád",
	"city": "Szolnok",
	"salary": 384
}

Módosítás

src/Controller/EmployeesController.php
    public function edit($id = null)
    {
        $this->request->allowMethod(['put']);
        $employee = $this->Employees->get($id);
        $employee = $this->Employees->patchEntity($employee, $this->request->getData());
        if ($this->Employees->save($employee)) {
            $message = 'Saved';
        } else {
            $message = 'Error';
        }
        $this->set([
            'message' => $message,
            'employee' => $employee,
        ]);
        $this->viewBuilder()->setOption('serialize', ['employee', 'message']);
    }

Ha a 9-s dolgozó adatait frissítjük:

Végpont Metódus
api/employees/9.json put

Amit küldeni kell:

{
	"name": "Tagadó Árpád",
	"city": "Szolnok",
	"salary": 384
}

Törlés

src/Controller/EmployeeController.php
    public function delete($id)
    {
        $this->request->allowMethod(['delete']);
        $employee = $this->Employees->get($id);
        $message = 'Deleted';
 
        if (!$this->Employees->delete($employee)) {
            $messge = 'Error';
        } 
        $this->set('message', $message);
        $this->viewBuilder()->setOption('serialize', ['message']);
 
    }

Delete metódussal küldünk kérést, például a 9 dolgozó törlése esetén a következő címre:

Végpont Metódus
api/employees/9.json delete

A routing szétbontása

$routes->scope('/api', function (RouteBuilder $builder) {
    $builder->setExtensions(['json', 'xml']);
    $builder->get('/employees', ['controller' => 'Employees', 'action' => 'index']);
    $builder->post('/employees', ['controller' => 'Employees', 'action' => 'add']);
});

Linkek

oktatas/web/back-end_framework/cakephp.txt · Utolsó módosítás: 2023/06/02 21:57 szerkesztette: admin