Как расширить класс контроллера воспламенителя кода?
-
06-07-2019 - |
Вопрос
В моем каталоге CI system\libraries есть новый класс с именем DD_Controller.php.Этот файл выглядит следующим образом:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class DD_Controller extends Controller
{
protected $ddauthentication;
function __construct()
{
parent::Controller();
$this->ddauthentication = "Authenticated";
}
}
?>
Мой контроллер приложения определяется следующим образом:
class Inquiry extends DD_Controller
{...}
Класс Inquiry работает нормально, когда я расширяю Controller, но получаю
Фатальная ошибка:Класс 'DD_Controller' нет найдено в C:\development\localhost\applications\inquiry\controllers\inquiry.php на линии 4
Когда я расширяю DD_Controller.В файле конфигурации у меня есть префикс, определенный следующим образом:
$config['subclass_prefix'] = 'DD_';
Есть идеи, чего мне не хватает?
ТИА
Решение
DD_Controller.php должен находиться в /system/application/libraries/
Если вы используете один и тот же CI для нескольких приложений и хотите, чтобы все они могли расширять свои контроллеры до вашего пользовательского, вы можете расширить базовый класс контроллера в том же файле.
В system/libraries/Controller.php ниже класса Controller:
class Mega_Controller extends Controller {
function Mega_Controller()
{
parent::Controller();
// anything you want to do in every controller, ye shall perform here.
}
}
Тогда вы сможете сделать это в своих контроллерах приложений:
class Home extends Mega_Controller {
....
Поскольку созданный вами расширенный класс контроллера будет доступен.Я думаю, что это лучше, чем перезаписывать базовый контроллер, но это тоже сработает.
Другие советы
Это лучший подход.Сделайте следующее:
- Перейдите в следующий каталог:
your_ci_app/application/core/
и создайте php-файл с именемMY_Controller.php
(в этом файле будут находиться ваши основные родительские классы) Откройте только что созданный файл и добавьте несколько классов, например:
class Admin_Parent extends CI_Controller { public function __construct() { parent::__construct(); } public function test() { var_dump("from Admin_Parent"); } } class User_Parent extends CI_Controller { public function __construct() { parent::__construct(); } public function test(){ var_dump("from User_Parent"); } }
Создайте свои дочерние контроллеры в этом каталоге.
your_ci_app/application/controllers/
.я позвоню этомуadminchild.php
Открыть
adminchild.php
и создайте код контроллера, обязательно расширив имя родительского класса, например:class Adminchild extends Admin_Parent { function __construct() { parent::__construct(); } function test() { parent::test(); } }
Я рекомендую избегать «взлома» основных файлов CodeIgniter.Лучше используйте его собственные возможности расширения и постарайтесь вписаться в них.
То же правило я бы порекомендовал для любой библиотеки PHP/CMS.Это правило имеет несколько причин:- возможность быстрого обновления без учета тысяч записей где и как были взломаны файлы ядра;- портативность;- возможность поделиться своим кодом - например, в случае необходимости им смогут пользоваться как вы, так и ваши друзья, и это поможет им поддерживать свою библиотеку в актуальном состоянии, так же, как и вы.
Другими словами, это гораздо более профессионально и окупается в будущем удобством использования, портативностью и возможностью обновления приложения.
Что касается вашего личного вопроса...
Как по мне, нет ничего плохого в том, чтобы создать собственную библиотеку со всем необходимым для расширения встроенного контроллера CodeIgniter, затем загрузить эту библиотеку в конструктор контроллера, и все готово.Единственное, что может повысить удобство использования, — это дать вашей библиотеке короткое имя.
Таким образом вы даже сможете разделить то, что вам нужно, на разные части и поместить в отдельные библиотеки:WebFeatures AdminОсобенности и т.д.
Затем вы просто загружаете необходимые библиотеки в конструктор вашего контроллера, и все готово.
P.S.Я знаю, что предложенный способ не вписывается в «правильную» концепцию ООП, но в то же время нельзя забывать о целостности используемых библиотек.
Все вышесказанное — это еще один взгляд на мой 7-летний опыт профессиональной веб-разработки, поэтому надеюсь, что будет полезно если не следовать, то хотя бы принять во внимание.
С уважением, Антон