2010-06-25 20 views
6

Hãy nói rằng tôi có những điều sau đây trong tập tin ini của tôi:Thư mục nào được sử dụng cho các plugin Zend?

resources.frontController.plugins.auth = AuthPlugin 

Trường hợp lớp AuthPlugin nên được đặt ở đâu? Hãy nói rằng tôi muốn nó dưới bộ điều khiển/bổ sung.

CẬP NHẬT:

Dựa trên các đề xuất bên dưới Tôi vẫn gặp sự cố. Hãy để tôi được chính xác những gì tôi đang có:

1) phần chính của application.ini

includePaths.library = APPLICATION_PATH "/../library" 
bootstrap.path = APPLICATION_PATH "/Bootstrap.php" 
bootstrap.class = "Bootstrap" 
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts" 
resources.view[] = 
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" 
resources.frontController.plugins.authplugin.class = "AuthPlugin" 

2) Bootstrap.php của tôi không có gì (tôi đã có rất nhiều thứ trong đó, nhưng vẫn nhận được lỗi không có gì):

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 
} 

3) tôi có một lớp AuthPlugin.php trong application/plugins

class AuthPlugin extends Zend_Controller_Plugin_Abstract 
{ 
    public function preDispatch(Zend_Controller_Request_Abstract $request) 
     { 
      // code here 
     } 
} 

Tôi nhận được lỗi sau:

Fatal error: Class 'AuthPlugin' not found in C:\[my dir structure here]\Application\Resource\Frontcontroller.php on line 111 

Tôi cho rằng tôi đang thiếu điều gì đó hiển nhiên ở đây. Cảm ơn trước. Zend Framework 1.10

Trả lời

3

Đây là cách tôi đăng ký một plugin tên Foo_Plugin_SuperDuperPlugin trong cấu hình ứng dụng của tôi:

resources.frontController.plugins.superduperplugin.class = "Foo_Plugin_SuperDuperPlugin" 

Plugin tọa lạc tại
APPLICATION_PATH/plugins/Foo_Plugin_SuperDuperPlugin.php và được tự động nạp từ đó vì Resource Module Autoloader tự động sẽ tìm trong đó (đề nghị) vị trí cho tài nguyên loại plugin. Nếu tôi muốn tải plugin từ, ví dụ:
APPLICATION_PATH/controllers/plugins/Foo_Plugin_SuperDuperPlugin.php thì tôi sẽ đăng ký trình tải tài nguyên mới với trình tự động tải và xác định loại tài nguyên có tên là 'plugin' và đường dẫn đến các tài nguyên plugin đó. Vì vậy, trong bootstrap.php tôi

protected function _initAutoloader() 
{ 
    $autoloader = new Zend_Loader_Autoloader_Resource(
     array(
      'basePath'  => APPLICATION_PATH, 
      'namespace'  => 'Foo', 
      'resourceTypes' => array(
       'plugin' => array(
        'path'  => 'controllers/plugins', 
        'namespace' => 'Plugin', 
       ) 
      ) 
     ) 
    ); 
} 

và sau đó tôi cần phải đảm bảo rằng phương pháp này được bootstrapped trước SuperDuperPlugin được đăng ký (trong đó, trong ví dụ này, xảy ra khi cấu hình ứng dụng được đọc resources.frontcontroller.plugins.superduperplugin.class = ...). Điều này có thể đạt được bằng cách đặt phương thức _initAutoloader ở đầu tệp bootstrap.php hoặc bằng cách gọi $this->bootstrap('autoLoader'); từ bất kỳ phương thức _init nào khác, trước khi tài nguyên frontController được khởi tạo.

CẬP NHẬT: Thử thêm này để bootstrap của bạn:

protected function _initAutoloader() 
{ 
    $autoloader = new Zend_Loader_Autoloader_Resource(
     array(
      'basePath'  => APPLICATION_PATH, 
      'resourceTypes' => array(
       'plugin' => array(
        'path'  => 'controllers/plugins', 
        'namespace' => '', 
       ) 
      ) 
     ) 
    ); 
} 

và thậm chí có thể rời khỏi không gian tên. Hoặc: thêm appnamespace = "Foo" vào cấu hình của bạn và đổi tên lớp thành Foo_Plugin_AuthPlugin.

+0

Tôi phải làm gì đó sai, vì tôi không thể làm việc này được. Tôi đang cập nhật câu hỏi ban đầu với nhiều chi tiết hơn. –

+0

Tôi đã cập nhật câu trả lời của mình. – jah

+0

Tôi có thể làm cho nó hoạt động với phần bổ sung tài nguyên, nhưng cuối cùng tôi đã làm cho nó hoạt động với một yêu cầu cơ bản 'bộ điều khiển/AuthPlugin.php'; (hoặc bất kỳ dir tôi đặt nó vào) vào phương thức _initAutoloader(). –

0

Tôi nghĩ rằng trong/application/plugins/

Nhưng bạn cũng có thể thiết lập một thư mục cho nó.

+0

Cảm ơn, nhưng điều đó dường như không làm việc. Nó có thể là tự động tải của tôi không hoạt động phù hợp với loại lớp này, nhưng nó không thể tìm thấy lớp AuthPlugin của tôi cho dù tôi đặt nó dưới ứng dụng/plugins hay bộ điều khiển. –

+0

bạn cũng đã bootstrapped plugin bằng cách đăng ký nó? – streetparade

+0

resources.frontController.pluginDirectory = APPLICATION_PATH "/ plugins" – streetparade

0

Vì ứng dụng sẽ tự khởi động từ tệp cấu hình sau khi đăng ký Trình nạp tự động, bạn nên đặt AuthPlugin.php (có chứa lớp AuthPlugin) trong đường dẫn bao gồm.

+0

Tôi đã thử điều này nhưng tôi không thể làm cho nó hoạt động. Tôi đã cập nhật mô tả với nhiều thông tin hơn. Có lẽ bạn có thể nhận ra những gì tôi đang thiếu. –

0

hmm có cùng vấn đề chính xác trong zf 1.11. Có vẻ như trình nạp tự động không tồn tại trước khi các plugin được tải: s

0

Tôi nhận thấy đây là một câu hỏi cũ, nhưng tôi đã tìm kiếm các giải pháp tự động tải các plugin bên ngoài thư viện và cuối cùng đã tìm được nó ra. Nói chung, tôi đã viết các plugin chung để sử dụng trên nhiều dự án khác nhau và giữ chúng trong thư viện có ý nghĩa, cung cấp cho bạn tuân thủ các quy ước đặt tên chuẩn ZF sẽ tự động tải. Gần đây, tôi đã viết một plugin cụ thể của dự án và tôi muốn giữ nó ở đâu đó trong thư mục ứng dụng của tôi, nhưng làm cách nào để tự động tải? Tôi chưa bao giờ thấy rằng việc sử dụng thư mục "application/plugins" đã hoạt động. Hy vọng rằng điều này có thể có lợi cho người khác:

Nếu bạn đang sử dụng cấu trúc thư mục mô-đun thì thay vì sử dụng thư mục "application/plugins", bạn có thể sử dụng "application/module_name/plugins". Sau đó, bạn có thể tận dụng lợi thế của Module Resource Autoloader, đó là một phần ồ ạt hữu ích và không được sử dụng của ZF. Nếu bạn thiết lập nó trong bootstrap của bạn, theo mặc định nó được thiết lập để tự động tải một bó toàn bộ các công cụ bao gồm các hình thức, mô hình và (tôi phát hiện ngày hôm nay) plugins. Bạn cũng có thể xác định các loại tài nguyên tùy chỉnh của riêng mình. Ví dụ dưới đây là một chức năng _initAutoloader từ một bootstrap trong một dự án trong đó có một mô-đun mặc định và quản trị và một kiểu tùy chỉnh tài nguyên 'vo' chứa trong các mô-đun quản trị:

public function _initAutoLoader() { 
    $autoloader = Zend_Loader_Autoloader::getInstance(); 

    $defaultLoader = new Zend_Application_Module_Autoloader(
     array(
      'namespace' => '', 
      'basePath' => APPLICATION_PATH . '/modules/default' 
     ) 
    ); 

    $adminLoader = new Zend_Application_Module_Autoloader(
     array(
      'namespace' => 'Admin', 
      'basePath' => APPLICATION_PATH . '/modules/admin', 
     ) 
    ); 

    $adminLoader->addResourceTypes(
     array(
      'vo' => array(
       'path'  => 'models/vo', 
       'namespace' => 'Vo', 
      ) 
     ) 
    ); 

    $autoloader->pushAutoloader($defaultLoader); 
    $autoloader->pushAutoloader($adminLoader); 
} 

Ở đây tôi có hai mô-đun, mặc định và quản trị . Giả sử các cấu trúc thư mục sau:

application/default/forms/FooForm.php 
application/default/models/FooModel.php 
application/default/plugins/FooPlugin.php 
application/admin/forms/FooForm.php 
application/admin/models/FooModel.php 
application/admin/models/vo/FooVo.php 
application/admin/plugins/FooPlugin.php 

tôi có thể tự động load qua bất kỳ mô-đun chỉ bằng instantiating một đối tượng của từng loại:

new Form_FooForm(); 
new Model_FooModel(); 
new Plugin_FooPlugin(); // or add plugin to application.ini 
new Admin_Form_FooForm(); 
new Admin_Model_FooModel(); 
new Admin_Vo_FooVo(); // custom resource type 
new Admin_Plugin_FooPlugin(); // or add plugin to application.ini 
Các vấn đề liên quan