Вопрос по namespace

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
J3FF3
Сообщения: 52
Зарегистрирован: 2012.04.24, 19:02

Вопрос по namespace

Сообщение J3FF3 »

Есть модель (/protected/model/Articles.php):

Код: Выделить всё

<?php
class Articles extends \CActiveRecord {
...
Есть контроллер (/protected/controllers/SiteController.php):

Код: Выделить всё

<?php
...
$articles = \Articles::model()->findAll();
...
Здесь все понятно, все работает.
Но есть модуль (/protected/modules/admin), хочу для него наследовать модель Articles (/protected/models/Articles.php) в точно такую же по названию модель Articles, но в папке модуля (/protected/modules/admin/models/Articles.php)

Код: Выделить всё

<?php
namespace application\modules\admin\models;
class Articles extends \Articles {    
}
Выдает ошибку:
Fatal error: Class 'Articles' not found in /home/www/site.com/www/protected/modules/admin/models/Articles.php on line 5
В чем проблема?
Хотелось бы, чтобы в существующем контроллере (/protected/controllers/SiteController.php) и уже написанных моделях (/protected/models/*) ничего менять не пришлось (разве что добавить обратный слеш перед названием класса).

И второй вопрос - возможно ли использовать что-то типа \Admin\Articles() для переопределенной модели, а для основной \Articles() ?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Вопрос по namespace

Сообщение ElisDN »

Код: Выделить всё

namespace application\modules\admin\models;
class Articles extends application\models\Articles {
}
 

Код: Выделить всё

use application\modules\admin\models as Admin;
// ...
$list = Admin\Articles::model()->findAll();
 
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: Вопрос по namespace

Сообщение lancecoder »

у вас 2 таблицы с одинаковым именем, но разной структурой)) или не возможно решить сценариями?
именуйте модели как принято в yii
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Вопрос по namespace

Сообщение ElisDN »

lancecoder писал(а):у вас 2 таблицы с одинаковым именем, но разной структурой)) или не возможно решить сценариями?
В Лучших практиках советуют крупные модели разбивать на уровни, а именно создать модель NewsBase с общим функционалом и несколько наследников News для фронта и бэка со своими специфическими методами.

По путям моделей у автора видно, что он использует почти аналогичное разделение:

/models/Articles.php - базовый класс для фронта
/modules/admin/models/Articles.php - наследник для админки со специфическими методами

и не стал заморачиваться с именами, так как есть namespace
J3FF3
Сообщения: 52
Зарегистрирован: 2012.04.24, 19:02

Re: Вопрос по namespace

Сообщение J3FF3 »

ElisDN
При обращении из контроллера модуля к модели модуля вылетает PHP warning.
"include(/home/www/site.com/www/protected/modules/admin/models/application/models/Articles.php): failed to open stream: No such file or directory "

Контроллер DefaultController (/protected/modules/admin/controllers/DefaultController.php):

Код: Выделить всё

<?php
use application\modules\admin\models as Admin;
...
    public function actionArticles() {
        $count = Admin\Articles::model()->count();
... 
Модель модуля Articles (/protected/modules/admin/models/Articles.php):

Код: Выделить всё

<?php
namespace application\modules\admin\models;
class Articles extends application\models\Articles {
} 
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Вопрос по namespace

Сообщение ElisDN »

Попробуйте слэш в начале добавить (\application\models\Articles)
J3FF3
Сообщения: 52
Зарегистрирован: 2012.04.24, 19:02

Re: Вопрос по namespace

Сообщение J3FF3 »

По всякому пробую, но никак.
На отдельных трёх файлах (с тестовыми классами) все работает. В приложении что-то не хочет.

Fatal error: Class 'application\models\Articles' not found in /home/www/site.com/www/protected/modules/admin/models/Articles.php on line 5
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: Вопрос по namespace

Сообщение lancecoder »

ElisDN писал(а):Попробуйте слэш в начале добавить (\application\models\Articles)
;) взаимно
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: Вопрос по namespace

Сообщение lancecoder »

J3FF3 писал(а):По всякому пробую, но никак.
На отдельных трёх файлах (с тестовыми классами) все работает. В приложении что-то не хочет.

Fatal error: Class 'application\models\Articles' not found in /home/www/site.com/www/protected/modules/admin/models/Articles.php on line 5
namespace должен совпадать с директорией, следовательно
namespace application\modules\admin\models\Articles;
либо объявить модуль Yii::setPathAlias (или как то так) ~ ('admin', 'application.modules.admin') <- он все равно позже переопределиться на это же значение, но теперь вы можете юзать его правильно
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: Вопрос по namespace

Сообщение lancecoder »

admin\models\Articles
п.с. а вообще IDE решила бы все вопросы на нет :lol:
J3FF3
Сообщения: 52
Зарегистрирован: 2012.04.24, 19:02

Re: Вопрос по namespace

Сообщение J3FF3 »

"п.с. а вообще IDE решила бы все вопросы на нет "
IDE как раз таки ничего и не решает.

"namespace должен совпадать с директорией, следовательно "
Он и совпадает в файле модели модуля.
Файл находится в директории /protected/modules/admin/models/

Код: Выделить всё

<?php
namespace application\modules\admin\models; // этот неймспейс совпадает в директорией, в которой лежит файл
class Articles extends \application\models\Articles { // переопределяем класс, указывая, что хотим использовать класс модели из \application\models, то есть основную модель
} 
В контроллере модуля:

Код: Выделить всё

use application\modules\admin\models as Admin; // то есть, хотим использовать уже переопределенный класс модели.
...
$count = Admin\Articles::model()->count();
... 
Но ошибка всеравно есть: Fatal error: Class 'application\models\Articles' not found in /home/www/site.com/www/protected/modules/admin/models/Articles.php on line 5
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Вопрос по namespace

Сообщение ElisDN »

В трёх сосна... папках заблудились

application/models/Atricles.php (Вы это, наверное, забыли)

Код: Выделить всё

namespace application\models
class Articles extends \CActiveRecord {    
} 
application/modules/admin/models/Articles.php

Код: Выделить всё

namespace application\modules\admin\models;
class Articles extends \application\models\Articles {    
} 
application/modules/admin/controllers/ArticlesController.php:

Код: Выделить всё

use application\modules\admin\models as Admin;
class ArticlesController extends \Controller
{
    public function actionIndex()
    {
        $items = Admin\Articles::model()->findAll();
    }
} 
J3FF3
Сообщения: 52
Зарегистрирован: 2012.04.24, 19:02

Re: Вопрос по namespace

Сообщение J3FF3 »

Хорошо, этот вариант работает. Хоть и надо дописать в каждой модели (/protected/models/) теперь неймспейс "namespace application\models".
Теперь в экшене контроллера модуля вызываю метод модели, который эта модель унаследовала от главной модели (/protected/models/Articles.php).
/protected/modules/admin/controllers/DefaultController.php

Код: Выделить всё

<?php
use application\modules\admin\models as Admin;
class DefaultController extends \Controller {
...
    public function actionArticles() {
        print_r(Admin\Articles::model()->getArticle(8)); // метод getArticle() находится в главной модели, мы его унаследовали в модель модуля  
Сам метод модели (/protected/models/Articles.php):

Код: Выделить всё

    public function getArticle($article_id) {
        $sql = "SELECT ...";
        $command = Yii::app()->db->createCommand($sql);
    }
Ругается с ошибкой:
include(/home/www/site.com/www/protected/models/Yii.php): failed to open stream: No such file or directory
Если добавить обратный слеш в строку $command = \Yii::app()->db->createCommand($sql);, тогда работает. Выходит, что нужно всё пересматривать и редактировать все уже существующие модели?
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: Вопрос по namespace

Сообщение lancecoder »

да вы батенька почитайте про неймспейс, кто за вас будет слеш ставить \Yii::
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Вопрос по namespace

Сообщение ElisDN »

J3FF3 писал(а):Выходит, что нужно всё пересматривать и редактировать все уже существующие модели?
Ну тогда выбросьте нафиг все namespace и просто переименуйте классы в Atricles и AdminArticles

Код: Выделить всё

class AdminArticles extends Articles {} 

$items = AdminArticles::model()->findAll();
J3FF3
Сообщения: 52
Зарегистрирован: 2012.04.24, 19:02

Re: Вопрос по namespace

Сообщение J3FF3 »

"просто переименуйте классы в Atricles и AdminArticles"
Пожалуй, так и сделаю. Спасибо за советы.
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: Вопрос по namespace

Сообщение lancecoder »

почитайте про вызов класса из глобального пространства в namespace
Ответить