Where to place a custom PHP class in CakePHP 3?

时光总嘲笑我的痴心妄想 提交于 2019-12-03 06:29:53
monsur.hoq

From my point of view, you can reuse any own class and also any third parties class as a utility class. If so, then you can place the class into src/Utility folder. Please use the proper namespace. After that, you can use that class anywhere in CakPHP 3.x.

HOW TO PLACE:

Say, you have a class named Jorge, save it into src/Utility folder using file name Jorge.php. Put namespace App\Utility; statement top of your Jorge.php file.

HOW TO USE:

In which file you want to use this class, just put use App\Utility\Jorge;. After that, you can call the class into that file.

ALTERNATIVE SOLUTION:

If you have a third party package of many classes, then you can follow https://stackoverflow.com/a/28527683/1787600

Most CakePHP derived code that you'd create will fall under the structure outlined by the documentation.

http://book.cakephp.org/3.0/en/intro/cakephp-folder-structure.html

For "totally arbitrary utility classes" as I'm guessing your meaning, CakePHP treats those as "third-party dependencies" (conceptually) and they recommend putting them in the "vendors" folder. You can ignore their recommendation to not edit things in that folder when the new content is your own utility project.

For loading, use good old php's require family of functions.

http://book.cakephp.org/3.0/en/core-libraries/app.html

If you happen to not be using Composer in your application, you will need to manually load all vendor libraries yourself.

You can make use of CakePHP global constants/functions to build the paths needed for require.

http://book.cakephp.org/3.0/en/core-libraries/global-constants-and-functions.html

APP, APP_DIR, WWW_ROOT, etc.

You can put it anywhere you want in /src/ folder. You can collect your custom classes in folders like: Interface, DTO, Utility, Custom or whatever. Since cakePHP 3.x uses PSR-4 autoloader the class will be instantiated once used. You just need to remember to add correct namespace. For example If you want to use custom interface add file src/Custom/Owned.php

<?php
namespace App\Custom;
interface Owned
{
    /**
     * Find username owning object by object primary id
     * @param $id
     * @return string|int
     */
    public function owner($id) : string;
}
...

Then you can use it right away:

...
class UsersTable extends Table implements Owned
{
...

If you going to reuse your classes better solution would be to create your own packagist package and include it by composer so it will be stored in "/vendor"

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!