Свет и прост в использовании PHP -структуры.
Dejframework - это простая и минимальная структура PHP MVC, ориентированная на краткости, простоты и понятия. Синтаксис в основном вдохновлен Ларавелом. Dejframework была разработана Ata Marzban для окончательного проекта степени бакалавра.
#Installation
composer install в корневом каталоге.Чтобы структура знала, что делать, когда поступает запрос, вам следует установить маршруты для ваших приложений в /App/routes.php. Это делается легко.
Маршрут состоит из метода HTTP, URL и пункта назначения, который должен выполнять, если запрос сделан с указанным методом для указанного URL. Ничего не выполняется без установки маршрутов. Вы можете передать закрытие в качестве пункта назначения:
[/app/routes.php]
Route:: set ( " GET " , " / " , function (){
return " Hello World! " ;
});Этот код выведет «Hello World», если вы посещаете свой сайт на Yoursite.com.
[/app/routes.php]
Route:: set ( " GET " , " /some/url " , function (){
return " This is some url! " ;
});Этот код выведет: «Это какой -то URL!» Если вы посещаете свой сайт на Yoursite.com/some/url.
[/app/routes.php]
Route:: set ( " POST " , " /do/something " , function (){
return " Here you should write your own code to do the things you want. " ;
});Этот код будет выполнен, если вы посетите yoursete.com/do/something с методом Post. (из формы или вызова API)
Вы можете вернуть строки, объекты, массивы или представления (обсуждаются позже) в ваших закрытиях или контроллерах. Строка будет выходить непосредственно, в то время как объекты или представления будут автоматически преобразованы в JSON и вывод, а представления будут отображаться для вывода.
В следующей части вы узнаете, как направлять маршруты на контроллеры вместо закрытия.
В схеме MVC считается наилучшей практикой, что логика приложения должна быть помещена в контроллеры.
[/app/controllers/YourController.php]
<?php
namespace app controllers;
class YourController extends dej mvc Controller
{
public static function yourAction ()
{
return " This is the right way to do it! " ;
}
}ВАЖНО: Как вы можете видеть в примере выше, чтобы автозазагрузка PSR-0 функционировал правильно, вы должны следовать следующим соглашениям при добавлении любого класса в ваше приложение:
Теперь давайте продолжим изучать, как заставить контролеры работать:
[/app/routes.php]
Route:: set ( " GET " , " / " , " YourController@YourAction " );Указанное действие на указанном контроллере будет выполнено при запусках маршрута.
Постоянное мнение классов и передача им зависимостей может стать повторяющейся задачей в разработке PHP. Поставщик услуг dej приложений стремится сделать этот процесс максимально сухим. Используя этот поставщик услуг, вам не нужно добавлять операторы использования в каждом файле и передавать зависимости. Возьмите этот пример:
/**
* Without a Service Provider
* when you want to build a query
*/
use dej db Connection ;
$ connection = Connection:: getInstance ();
use dej db Query ;
$ query = new Query ( $ connection );
$ result = $ query -> select ()-> from ( ' someTable ' )-> getAll ();
return $ result ;И это следует повторять каждый раз, когда вы хотите использовать строитель запросов. Теперь, используя поставщика услуг:
use dej App ;
return App:: Query ()-> select ()-> from ( ' some_table ' );Вот и все! Взгляните на dej/app.php, чтобы увидеть, как это работает. Статический метод с именем «запрос» вызывает в классе приложений. Он интенсирует класс запросов и передает экземпляр подключения в качестве параметров конструктора. Кусок торта!
#Request The dejhttpRequest Class облегчает взаимодействие с запросом, посмотрите на следующие примеры:
//check if request is ajax or not
$ result = App:: Request ()-> isAjax ();
//returns $_GET['name'];
$ result = App:: Request ()-> get ( ' name ' );
//returns $_POST['name'];
$ result = App:: Request ()-> post ( ' name ' );
//returns $_REQUEST;
$ result = App:: Request ()-> all (); #Response The dejhttpResponse Class упрощает параметры ответа, вы должны вернуть ответ в свой контроллер, если вы хотите установить коды или заголовки HTTP, посмотрите на следующие примеры:
class IndexController extends dej mvc Controller
{
public static function index ()
{
return App:: Response ()-> code ( 404 )-> header ( ' HTTP/1.1 404 Not Found ' );
}
}Вы можете легко перенаправить:
//in the controller
return App:: Response ()-> redirect ( ' /login ' );
//redirect with errors
App:: Response ()-> redirect ( ' / ' )-> withErrors ([ ' login ' => ' login unsuccessful! maybe password is wrong. ' ]);Передача с ошибками мигает ошибки в сеанс (обсуждается позже).
Конфигурация: сначала введите конфигурацию базы данных в /конфиг.json . dejframework имеет дело с базами данных в трехслойной архитектуре:
Уровень 1 - Объект подключения базы данных: это расширяет класс Abstract Singleton. Это означает, что он создается только один раз, впервые его называют. Некоторые другие услуги на dejframework тоже такие. Чтобы предотвратить накладные расходы подключения к БД каждый раз, когда вы хотите запустить запрос. Вот как вы можете его использовать:
//simple query
$ result = App:: Connection ()-> executeQuery ( " SELECT * FROM some_table " );
//NonQuery: a query that doesn't return rows, only the number of affected rows.
$ result = App:: Connection ()-> executeNonQuery ( " DELETE FROM some_table WHERE some_field = 'some_value' " );
//A Query using prepared statements, To protect against SQL Injection.
$ result = App:: Connection ()-> executeQuery ( " SELECT * FROM some_table WHERE some_field = ? " , [ " some_value " ]);
//A Query using prepared statements, To protect against SQL Injection. With Multiple Parameters.
$ result = App:: Connection ()-> executeQuery ( " SELECT * FROM some_table WHERE some_field = ? AND another_field = ? " , [ $ some_value , " another_value " ]);
//A Query using prepared statements, To protect against SQL Injection. With Named Parameters.
$ result = App:: Connection ()-> executeQuery ( " SELECT * FROM some_table WHERE some_field = :some_value_name
AND another_field = :another_value_name " ,
[ " :some_value_name " => $ some_value ,
" another_value_name " => " another_value " ]); Вы можете сделать это в любом месте, при условии, что вы добавили use dejApp; Полем
Уровень 2 - Строитель запросов: этот класс создает запросы и использует класс подключения для запуска их с помощью защищенных подготовленных операторов. Он должен быть создан для каждого нового запроса, это делается для вас /DEJ /App автоматически каждый раз, когда вы вводите App::Query() , точно так же, как мы видели в примере секции Service Povider. Вы можете построить запросы с помощью этого, используя цепочку методов. Взгляните на примеры ниже:
$ result = App:: Query ()-> select ()-> from ( ' users ' )-> getAll ();
$ result = App:: Query ()-> select ()-> from ( ' users ' )-> getOne ();
$ result = App:: Query ()-> select ()-> from ( ' users ' )-> getJson ();
$ query = App:: Query ()-> select ()-> from ( ' users ' )-> getQuery (); Как видите, использование Builder DEJ запроса является простым, используйте вам приложение Call :: Query () и автоматически передает вам новый класс запросов, впредуюсь зависимостью, а затем вы цепляете методы, чтобы добавить условия для него, такие как Select getOne() ), от getAll() ) и т. Д. getJson() ), или построенный запрос ( getQuery() ). Результаты получены в формате stdclass, который вы можете легко использовать. Стоит отметить, что без использования одного из методов GET в конце вашего запроса результаты не будут извлечены. Кроме того, вы можете цепорить методы на нескольких линиях и в нескольких шагах, например, изменить их в каком -то условие:
$ query = App:: Query ()-> select ();
if ( $ somecondition == true ) $ query -> from ( ' users ' );
else $ query -> from ( ' another_table ' );
$ result = $ query -> getAll ();Давайте посмотрим на другие методы, доступные на строителе запросов в следующих примерах:
//All queries will be executed using prepared statements and parameters will be handled automatically.
//SELECT Queries:
$ result = App:: Query ()-> select ()-> from ( ' users ' )-> where ( ' id ' , ' = ' , ' 22 ' )-> getAll ();
//you can omit the operator and it uses '=' by default
$ result = App:: Query ()-> select ()-> from ( ' users ' )-> where ( ' id ' , ' 22 ' )-> getAll ();
$ result = App:: Query ()-> select ()-> from ( ' users ' )-> where ( ' city ' , ' = ' , ' Berlin ' )
-> andWhere ( ' age ' , ' > ' , ' 20 ' )-> getAll ();
$ result = App:: Query ()-> select ()-> from ( ' users ' )-> where ( ' city ' , ' = ' , ' Berlin ' )
-> orWhere ( ' city ' , ' = ' , ' Paris ' )-> getAll ();
$ result = App:: Query ()-> select ()-> from ( ' users ' )-> orderBy ( ' age ' , ' DESC ' )
-> limit ( 25 )
-> offset ( 50 )-> getAll ();
//INSERT Query:
$ affectedRows = App:: Query ()-> insertInto ( ' users ' )-> values ([ " username " => " jameshetfield " ,
" password " => " 19831983 " ,
" city " => " Downey " ])-> execute (); Обратите внимание, что запросы, которые не возвращают результаты, должны быть выполнены с помощью php execute() , и они автоматически возвращают количество затронутых строк.
//UPDATE Query:
$ affectedRows = App:: Query ()-> update ( ' users ' )-> set ([ " age " => 53 ,
" band " => " Metallica " ])
-> where ( ' username ' , ' = ' , ' jameshetfield ' )-> execute ();
//DELETE Query:
$ affectedRows = App:: Query ()-> deleteFrom ( ' users ' )-> where ( ' username ' , ' = ' , ' someone ' )-> execute ();Обратите внимание, что запросы удаления или обновления могут привести к потере данных, если не будет предоставлено пункт, в качестве меры безопасности, Dejframework выпустит исключение, если он столкнется с такой ситуацией. Пожалуйста, запустите такие запросы, используя класс подключения вручную.
Уровень 3 - ОБЪЕДИНЕННОЕ ОБРАЗОВАНИЕ: ORM будет обсуждаться в следующем разделе.
Согласно Википедии:
ОБЪЕКТА-РЕАЛЬНОЕ ОПАРТЕНИЕ (ORM) ... является методом программирования для преобразования данных между системами несовместимых типов на объектно-ориентированных языках программирования. Это, по сути, создает «базу данных виртуальных объектов», которая может использоваться из языка программирования.
Поскольку Dejframework работает в архитектуре MVC, упорство данных содержится в модельном компоненте MVC. Модели относятся к объектам в вашем приложении, таких как пользователь, покупка, продукт и т. Д. В системе покупок. Они должны быть сохранены и извлечены в базу данных и обратно. Реляционные базы данных работают на языке SQL, а Dejframework, как и большинство фреймворков, работают в объектно-ориентированной среде. И SQL-код в середине PHP-кода считается не лучшей практикой. Таким образом, Dejframework пытается отделить вас от кода SQL на 3 уровнях, 2 из них были разработаны в предыдущем разделе, теперь мы посмотрим, как работать с моделями:
class User extends dej mvc Model
{
protected static $ dbTable = " users " ;
//Format: ["db_field_name" => "modelPropertyName"]
protected static $ primaryKey = [ " id " => " id " ];
//Model properties
public $ username ;
public $ password ;
public $ city ;
.
.
.
} class User extends dej mvc Model
{
protected static $ dbTable = " users " ;
//Format: ["db_field_name" => "modelPropertyName"]
protected static $ dbFields = [ " username " => " username " ,
" password " => " password " ,
" city " => " city " ,
" id " => " id " ];
public $ username ;
public $ password ;
public $ city ;
.
.
.
} Обратите внимание, что свойство id определяется в классе /dej/mvc/Model , который расширяются ваши модели. Таким образом, если вы хотите, чтобы ваша модель имела идентификатор, нет необходимости определять его снова.
class User extends dej mvc Model
{
protected static $ dbTable = " users " ;
protected static $ dbFields = [ " username " => " username " ,
" password " => " password " ,
" city " => " city " ,
" id " => " id " ];
//Exactly the same as the class name
protected static $ modelName = " User " ;
public $ username ;
public $ password ;
public $ city ;
.
.
.
}Вот и все на данный момент, при условии, что вы правильно установили эти конфигурации, вы сможете использовать методы ORM на своих моделях. Взгляните на примеры ниже:
//Creating a new record
use app models User ;
$ user = new User ();
$ user -> username = " jameshetfield " ;
$ user -> password = " 13831383 " ;
$ user -> city = " Downey " ;
$ user -> create (); //Saved into the database.
//or you can set the properties in the constructor
$ user = new User ([
' username ' => ' jameshetfield ' ,
' password ' => ' 13831383 ' ,
' city ' => ' Downey '
]);
$ user -> create ();ORM использует строитель DEJ Query внизу, чтобы генерировать необходимые запросы.
Обратите внимание, что create (), update () и delete () возвращают затронутые строки, которые вы можете проверить, чтобы увидеть, была ли операция успешной.
//Finding a record by a field named 'id'
$ user = User:: findById ( 11 );
//changing it's properties
$ user -> password = " through_the_never " ;
$ user -> update (); //Updated in the database.
//deleting it.
$ user -> delete ();Обратите внимание, что эти функции работают с основным ключом записей.
//Finding records by some condition.
$ users = User:: find ()-> where ( ' city ' , ' = ' , ' Sari ' )-> getAll (); //Returns an array of User objects.
//A more complex one
$ users = User:: find ()-> where ( ' city ' , ' = ' , ' Sari ' )-> andWhere ( ' age ' , ' > ' , 20 )-> orderBy ( ' age ' , ' ASC ' )
-> limit ( 25 )
-> offset ( 100 )-> getAll ();
//Don't forget the get*() method!
//Retrieveing all records
$ users = User:: getAll (); //doesn't need a getAll() at the end because it knows what to do.
//The method for deleting by condition is named 'wipe'
$ users = User:: wipe ()-> where ( ' status ' , ' = ' , ' banned ' )-> orWhere ( ' email_confirmation ' , ' = ' , ' 0 ' )-> execute ();
//counting all records
$ userCount = User:: countAll ();
//counting records that have a certain condition
$ userCount = User:: count ()-> where ( ' city ' , ' = ' , ' Sari ' )-> getInt (); //getInt() returns the count of the results as an Integer. Проверка данных в dejframework обрабатывается классом dejValidator . Вы можете использовать его по -разному:
App::Validator() , который дает вам экземпляр Singleton. Он принимает 2 параметры: значение , которое должно быть подтверждено. (String, int, массив, объект) и набор правил для проверки данных.Посмотрим, как это работает:
use dej App ;
//Validate a single value according to a set of rules seperated by "|".
$ result = App:: Validator ()-> validate ( " This is going to be validated " , " required|string|min:5|max:30 " );
//Validate an object or and array:
$ result = App:: Validator ()-> validate ( $ user , [ ' username ' => ' required|string|email|min:5|max:30 ' ,
' password ' => ' required|string|min:10|max:100 ' ],
' age ' => ' int|min:18|max:99 ' ); Метод validate() возвращает массив. Если нет ошибок проверки, и данные действительны, это будет пустой массив. Таким образом, вы можете проверить, действительны ли данные с empty() . Если есть какие -либо ошибки проверки, вы увидите их в массиве.
//The rules have changed
$ errors = App:: Validator ()-> validate ( " This is going to be validated " , " required|string|email|min:5|max:10 " );
var_dump ( $ errors );Это то, что выведет вышеуказанный код:
array
0 => 'This Field should be an email'
1 => 'This Field should be less than 10'
Теперь с объектом:
$ errors = App:: Validator ()-> validate ( $ obj , [ ' email ' => ' required|string|email ' ,
' password ' => ' required|string ' ,
' age ' => ' int ' ]);
var_dump ( $ errors );Выход:
array (size=3)
'email' =>
array (size=1)
0 => string 'This Field should be an email'
'password' =>
array (size=2)
0 => string 'This Field is Required'
1 => string 'This Field should be more than 10'
'age' =>
array (size=1)
0 => string 'This Field should be a number'
Как вы можете видеть, если вы передаете объект или массив в валидатор, он вернет ошибки, связанные с каждым поле, в ассоциативном массиве, где клавиши являются именами поля, а значения - это массивы, содержащие ошибки, связанные с этим полем.
validate() в объекте запроса. $ errors = App:: Request ()-> validate ([ ' email ' => ' required|string|email ' ,
' password ' => ' required|string|min:10|max:100 ' ]);
var_dump ( $ errors ); Посещение yoursite.local/?email=notanemail&password=123
array (size=2)
'email' =>
array (size=1)
0 => string 'This Field should be an email'
'password' =>
array (size=1)
0 => string 'This Field should be more than 10'
/app/models/User.php Models/user.php: class User extends dej mvc Model
{
.
.
.
protected static $ validationRules = [ " username " => " required|string|min:5|max:20 " ,
" password " => " required|string|min:5|max:255 " ,
" city " => " string|max:10 " ];
.
.
.
}Теперь вы можете проверить экземпляры моделей:
$ user = User:: getById ( 11 );
$ errors = $ user -> validate (); //returns errors in array like the previous examples.
$ isValid = $ user -> isValid (); //returns true or falseКогда у вас будут ошибки, вы можете передать его в вид, чтобы отобразить или перенаправить где -нибудь с ними:
//in the controller
$ errors = $ user -> validate ();
if (! empty ( $ errors )) return App:: Response ()-> redirect ( ' / ' )-> withErrors ( $ errors ); Сообщения проверки, которые вы видели в предыдущих примерах, были сообщениями по умолчанию, что, если вы хотите их изменить, или иметь сообщения о валидации на своем языке? Взгляните на /app/locale/en/validation/messages.php :
return [
" required " => " This Field is Required " ,
" string " => " This Field should be an string " ,
" int " => " This Field should be a number " ,
" min " => " This Field should be more than %s " ,
" max " => " This Field should be less than %s " ,
" email " => " This Field should be an email " ,
]; Вы можете видеть, что ключ соответствует типу валидации, а значения являются сообщениями проверки. Переменные включены в сообщения с 's'. В /app/locale вы можете создать свой собственный каталог для языка вашего выбора, и в этом каталоге есть свои собственные проверки сообщений с переменными.
Вы можете установить локаль по умолчанию в /config.json .
Вы можете изменить его в своем приложении по App::Config()->locale = 'your_locale';
Чтобы работать с сеансом PHP, Dejframework предоставляет класс dejSession . Вот несколько примеров того, как его использовать:
//to set session variables
App:: Session ()-> save ([
' key1 ' => ' value1 ' ,
' key2 ' => ' value2 '
]);
//to get session variables
$ value1 = App:: Session ()-> get ( ' key1 ' );
//to regenerate session id
App:: session ()-> regenerateId ();
//get all session variables as associative array
$ wholeSession = App:: session ()-> all ();
//destroy the session
App:: session ()-> destroy ();
//delete a variable
App:: session ()-> delete ( ' key1 ' );
//see if variable is set
$ trueOrFalse = App:: session ()-> isSaved ( ' key1 ' );Если вы хотите, чтобы переменная сеанса была доступна только в следующем запросе, например, в определенном сообщении об ошибке, вы можете пропустить ее в сеанс таким образом:
App:: session ()-> flash ([ ' message ' => ' Registered Successfully! ' ]);И получить его в следующем запросе:
$ message = App:: session ()-> getFlash ( ' message ' ); Обратите внимание, что флэш -сообщения доступны только в следующем запросе и только с ->getFlash() .
Вы можете установить сеанс на срок действия истечения после определенного времени с момента последнего доступа к сеансу:
App:: Session ()-> save ([ ' key ' => ' value ' ]);
App:: Session ()-> lifeTime ( 60 ); //session will expire after 60 seconds since last access to the session. (last use of App::Session())Иногда вы можете захотеть запомнить экземпляр модели для следующих запросов. Например, вы хотите, чтобы приложение запомнило пользователя, который вошел в систему, или корзину, которую есть у вашей пользователя, или что -то еще. Если вы храните основной ключ модели, которую вы хотите в сеансе, и запустите запрос, чтобы получить ее в каждом запросе, это может стать утомительным. Dejframework решает это, предоставляя вам черту, которую вы можете использовать в своих моделях. Взгляните:
class ShoppingCart extends dej mvc Model
{
use dej traits IsStateful;
.
.
.
}Теперь у вас есть еще несколько методов, доступных в вашей модели:
//suppose you want to create a shopping cart for a guest user and add a product to it:
$ cart = new ShoppingCart ();
$ cart -> addProduct ( 2389 );
$ cart -> create (); //stored in the db
//if you want to save it to the session get it easily in the next request
$ cart -> remember ( ' guest_shopping_cart ' ); //provide a key to remember it by this key.Теперь в следующем запросе:
if (ShoppingCart:: isRemembered ( ' guest_shopping_cart ' )) //see if theres any cart in the session
$ cart = ShoppingCart:: retrieve ( ' users_shopping_cart ' ); //get's fresh data from the db
if (ShoppingCart:: hasChanged ( ' guest_shopping_cart ' ))
{
//checks if the cart in the database has changed **since you saved the cart in the session**.
doSomeThing ();
}
ShoppingCart:: forget ( ' guest_shopping_cart ' ); //forgets the cart. Чтобы представить ваши данные пользователю, вам нужен пользовательский интерфейс. В Интернете большую часть времени это означает HTML -разметку. В MVC логика должна быть отделена от пользовательского интерфейса, поэтому вы помещаете свой HTML в представлениях и включаете в них только логику презентации, такую как echo ценность или вкладывает массив в `` `foreach``, чтобы перевернуть его. Чтобы создать представление, вы должны:
/app/views . Есть одно представление, включенное по умолчанию: index.phtml <!DOCTYPE html >
< html >
< head >
< title > < ?= $data- > user- > username ? > 's profile </ title >
</ head >
< body >
< h2 > View < ?= $data- > user- > username ? > 's Profile </ h2 >
< p > Username: < ?= $data- > user- > username ? > </ p >
< p > Password: < ?= $data- > user- > password ? > </ p >
< p > City: < ?= $data- > user- > city ? > </ p >
</ body >
</ html > class IndexController extends dej mvc Controller
{
public static function index()
{
$ user = User:: find ()-> where ( ' username ' , ' = ' , ' jameshetfield ' )-> getOne ();
return App:: View ( ' user ' , [ ' user ' => $ user ]); //the first argument is the view name,
the second one is the data you want to pass to
the view, in this example, a variable called ' user '
will be available in the user.phtml view
which contains the instance of user we fetched.
Piece of cake!
}
}Вы также можете предоставить сообщения об ошибках:
//in the controller
return App:: View ( ' user ' )-> withErrors ([ ' authorization ' => ' You are not allowed to view this user. ' ]);Структура приведет к выводу представления, и результат будет:
<!DOCTYPE html >
< html >
< head >
< title > jameshetfield's profile </ title >
</ head >
< body >
<!-- access the errors like this: -->
< span class =" error " > < ?= $this- > errors('authorization') ? > </ span >
< h2 > View jameshetfield's Profile </ h2 >
< p > Username: jameshetfield </ p >
< p > Password: 13831383 </ p >
< p > City: Downey </ p >
</ body >
</ html >Теперь давайте посмотрим на другой пример, что, если мы хотим создать таблицу всех пользователей? Измените свой взгляд:
<!DOCTYPE html >
< html >
< head >
< title > All Users </ title >
</ head >
< body >
< table >
< tr >
< th > username </ th >
< th > password </ th >
< th > city </ th >
</ tr >
< ?php foreach ($data- > users as $user): ? >
< tr >
< th > < ?= $user- > username ? > </ th >
< th > < ?= $user- > password ? > </ th >
< th > < ?= $user- > city ? > </ th >
</ tr >
< ?php endforeach; ? >
</ table >
</ body >
</ html >А потом ваш контроллер:
class IndexController extends dej mvc Controller
{
public static function index ()
{
$ users = User:: getAll ();
return App:: View ( ' user ' , [ ' users ' => $ users ]);
}
}И посмотри на результат для себя!
Вы можете создать частичные и вставить (включать) их в другие представления:
[/app/views/partials/header.phtml]
<!--begin header-->
<!DOCTYPE html >
< html >
< head >
< meta charset =" UTF-8 " >
< title > < ?= $data- > title ? > </ title >
</ head >
< body >
<!--end header--> и вставьте его в index.phtml :
[/app/views/index.phtml]
< ?php $this- > paste('partials/header'); ? >
< h2 > < ?= $data- > message ? > </ h2 >
.
.
.
</ html > Аутентификация-это вопрос, связанный с приложением. Это может быть очень разным в каждом приложении, поэтому DejFramework не реализует его в самой структуре, вместо этого вам предоставлены базовая модель пользователя, маршруты AUTH и логику контроллера, которая производит аутентификацию, и вы можете IsStateful изменить ее или реализовать свое собственное решение, решение, которое реализовано в фреймворке, использует пользовательский пользователь и использует $user->remember() . Единственное, что вам нужно сделать,-это установить 'default_auth_model' в config.json , чтобы иметь возможность использовать App::Request->user() в ::retrieve() пользователь из сеанса с использованием черты IsStateful .
Взгляните на контроллер, модель и представления, которые предоставляются в рамках для аутентификации, чтобы понять, что он работает. и изменить/улучшить/удалить его так, как вам нравится.
ПРИМЕЧАНИЕ. Чтобы пользовательская модель была правильно работала, вам нужно создать таблицу с именем users с двумя полями:
TABLE: users
FIELD TYPE
id int, autoincrement
username varchar
password varchar(255) //password hashing system requires 255